diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-07-10 11:30:53 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-16 02:30:52 +0200 |
commit | 6e5944df6349c080b4e4550e2fd085cfc34cf207 (patch) | |
tree | e24a33d2554bf485ebfac34ce83aa83cca455598 /tests/auto | |
parent | 80dd824864df17bb1293a4438325f2b20306861b (diff) |
Fix horizontal alignment of unwrapped text in TextEdit.
When the actual width of the text in a QTextDocument exceeds the
specificed textWidth it is aligned left irregardless of the text
alignment. Compensate by doing our own alignment of the laid out
document.
Change-Id: I7df900316ffb3ecdf01ddb053480a60a8258182d
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'tests/auto')
5 files changed, 105 insertions, 5 deletions
diff --git a/tests/auto/quick/qquicktextedit/data/mouseselection_align_bl.qml b/tests/auto/quick/qquicktextedit/data/mouseselection_align_bl.qml new file mode 100644 index 0000000000..4387cbcfc6 --- /dev/null +++ b/tests/auto/quick/qquicktextedit/data/mouseselection_align_bl.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +TextEdit { + focus: true + text: +"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ +9876543210 + +ZXYWVUTSRQPON MLKJIHGFEDCBA" + width: implicitWidth - 10 + selectByMouse: true + horizontalAlignment: TextEdit.AlignLeft + verticalAlignment: TextEdit.AlignBottom +} diff --git a/tests/auto/quick/qquicktextedit/data/mouseselection_align_center.qml b/tests/auto/quick/qquicktextedit/data/mouseselection_align_center.qml new file mode 100644 index 0000000000..e8ee14cdf0 --- /dev/null +++ b/tests/auto/quick/qquicktextedit/data/mouseselection_align_center.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +TextEdit { + focus: true + text: +"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ +9876543210 + +ZXYWVUTSRQPON MLKJIHGFEDCBA" + width: implicitWidth - 10 + selectByMouse: true + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter +} diff --git a/tests/auto/quick/qquicktextedit/data/mouseselection_align_tr.qml b/tests/auto/quick/qquicktextedit/data/mouseselection_align_tr.qml new file mode 100644 index 0000000000..a69bd8d9b9 --- /dev/null +++ b/tests/auto/quick/qquicktextedit/data/mouseselection_align_tr.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +TextEdit { + focus: true + text: +"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ +9876543210 + +ZXYWVUTSRQPON MLKJIHGFEDCBA" + width: implicitWidth - 10 + selectByMouse: true + horizontalAlignment: TextEdit.AlignRight + verticalAlignment: TextEdit.AlignTop +} diff --git a/tests/auto/quick/qquicktextedit/data/positionAt.qml b/tests/auto/quick/qquicktextedit/data/positionAt.qml index 19093281fe..af0950c9ba 100644 --- a/tests/auto/quick/qquicktextedit/data/positionAt.qml +++ b/tests/auto/quick/qquicktextedit/data/positionAt.qml @@ -5,5 +5,6 @@ TextEdit { objectName: "myInput" width: 50 height: 25 + font.pixelSize: 12 text: "This is\n a long piece of text" } diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index 562f24edd6..ffff922e52 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -134,6 +134,7 @@ private slots: void dragMouseSelection(); void inputMethodHints(); + void positionAt_data(); void positionAt(); void linkActivated(); @@ -217,6 +218,8 @@ Q_DECLARE_METATYPE(IntList) typedef QList<Key> KeyList; Q_DECLARE_METATYPE(KeyList) +Q_DECLARE_METATYPE(QQuickTextEdit::HAlignment) +Q_DECLARE_METATYPE(QQuickTextEdit::VAlignment) Q_DECLARE_METATYPE(QQuickTextEdit::TextFormat) void tst_qquicktextedit::simulateKeys(QWindow *window, const QList<Key> &keys) @@ -1789,6 +1792,10 @@ void tst_qquicktextedit::mouseSelection_data() QTest::newRow("on triple click (40,50)") << testFile("mouseselection_true.qml") << 40 << 50 << "9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; QTest::newRow("on triple click (50,25)") << testFile("mouseselection_true.qml") << 50 << 25 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\n9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; QTest::newRow("on triple click (50,40)") << testFile("mouseselection_true.qml") << 50 << 40 << "9876543210\n\nZXYWVUTSRQPON MLKJIHGFEDCBA" << true << true << 3; + + QTest::newRow("on tr align") << testFile("mouseselection_align_tr.qml") << 4 << 9 << "45678" << true << true << 1; + QTest::newRow("on center align") << testFile("mouseselection_align_center.qml") << 4 << 9 << "45678" << true << true << 1; + QTest::newRow("on bl align") << testFile("mouseselection_align_bl.qml") << 4 << 9 << "45678" << true << true << 1; } void tst_qquicktextedit::mouseSelection() @@ -1943,8 +1950,26 @@ void tst_qquicktextedit::inputMethodHints() QCOMPARE(plainTextEdit.inputMethodHints(), Qt::ImhNone); } +void tst_qquicktextedit::positionAt_data() +{ + QTest::addColumn<QQuickTextEdit::HAlignment>("horizontalAlignment"); + QTest::addColumn<QQuickTextEdit::VAlignment>("verticalAlignment"); + + QTest::newRow("top-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignTop; + QTest::newRow("bottom-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignBottom; + QTest::newRow("center-left") << QQuickTextEdit::AlignLeft << QQuickTextEdit::AlignVCenter; + + QTest::newRow("top-right") << QQuickTextEdit::AlignRight << QQuickTextEdit::AlignTop; + QTest::newRow("top-center") << QQuickTextEdit::AlignHCenter << QQuickTextEdit::AlignTop; + + QTest::newRow("center") << QQuickTextEdit::AlignHCenter << QQuickTextEdit::AlignVCenter; +} + void tst_qquicktextedit::positionAt() { + QFETCH(QQuickTextEdit::HAlignment, horizontalAlignment); + QFETCH(QQuickTextEdit::VAlignment, verticalAlignment); + QQuickView canvas(testFileUrl("positionAt.qml")); QVERIFY(canvas.rootObject() != 0); canvas.show(); @@ -1953,8 +1978,10 @@ void tst_qquicktextedit::positionAt() QQuickTextEdit *texteditObject = qobject_cast<QQuickTextEdit *>(canvas.rootObject()); QVERIFY(texteditObject != 0); + texteditObject->setHAlign(horizontalAlignment); + texteditObject->setVAlign(verticalAlignment); - QTextLayout layout(texteditObject->text()); + QTextLayout layout(texteditObject->text().replace(QLatin1Char('\n'), QChar::LineSeparator)); layout.setFont(texteditObject->font()); if (!qmlDisableDistanceField()) { @@ -1965,15 +1992,45 @@ void tst_qquicktextedit::positionAt() layout.beginLayout(); QTextLine line = layout.createLine(); + line.setLineWidth(texteditObject->width()); + QTextLine secondLine = layout.createLine(); + secondLine.setLineWidth(texteditObject->width()); layout.endLayout(); - const int y0 = line.height() / 2; - const int y1 = line.height() * 3 / 2; + qreal y0; + qreal y1; + + switch (verticalAlignment) { + case QQuickTextEdit::AlignTop: + y0 = line.height() / 2; + y1 = line.height() * 3 / 2; + break; + case QQuickTextEdit::AlignVCenter: + y0 = (texteditObject->height() - line.height()) / 2; + y1 = (texteditObject->height() + line.height()) / 2; + break; + case QQuickTextEdit::AlignBottom: + y0 = texteditObject->height() - line.height() * 3 / 2; + y1 = texteditObject->height() - line.height() / 2; + break; + } + qreal xoff; + switch (horizontalAlignment) { + case QQuickTextEdit::AlignLeft: + xoff = 0; + break; + case QQuickTextEdit::AlignHCenter: + xoff = (texteditObject->width() - secondLine.naturalTextWidth()) / 2; + break; + case QQuickTextEdit::AlignRight: + xoff = texteditObject->width() - secondLine.naturalTextWidth(); + break; + } int pos = texteditObject->positionAt(texteditObject->width()/2, y0); - int widthBegin = floor(line.cursorToX(pos - 1)); - int widthEnd = ceil(line.cursorToX(pos + 1)); + int widthBegin = floor(xoff + line.cursorToX(pos - 1)); + int widthEnd = ceil(xoff + line.cursorToX(pos + 1)); QVERIFY(widthBegin <= texteditObject->width() / 2); QVERIFY(widthEnd >= texteditObject->width() / 2); |