Make sure we relayout on height change when onLineLaidOut is used
authorYann Bodson <yann.bodson@nokia.com>
Mon, 4 Jun 2012 07:21:30 +0000 (17:21 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 5 Jun 2012 22:26:28 +0000 (00:26 +0200)
Change-Id: I66e47682eba337562543a99eb576a7e24d00cdcf
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/quick/items/qquicktext.cpp
tests/auto/quick/qquicktext/data/lineLayoutRelayout.qml [new file with mode: 0644]
tests/auto/quick/qquicktext/tst_qquicktext.cpp

index add789d..ae560b9 100644 (file)
@@ -2079,7 +2079,7 @@ void QQuickText::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeo
     if (!widthChanged && !wrapped && d->singleline && !scaleFont)
         goto geomChangeDone; // only height has changed which doesn't affect single line unwrapped text
 
-    if (!widthChanged && wrapped && d->elideMode != QQuickText::ElideRight && !scaleFont)
+    if (!widthChanged && wrapped && d->elideMode != QQuickText::ElideRight && !scaleFont && !d->isLineLaidOutConnected())
         goto geomChangeDone; // only height changed and no multiline eliding.
 
     if (leftAligned && d->elideMode == QQuickText::ElideRight && !d->truncated && d->singleline
diff --git a/tests/auto/quick/qquicktext/data/lineLayoutRelayout.qml b/tests/auto/quick/qquicktext/data/lineLayoutRelayout.qml
new file mode 100644 (file)
index 0000000..2e1aa6a
--- /dev/null
@@ -0,0 +1,45 @@
+import QtQuick 2.0
+
+Rectangle {
+    id: main
+    width: 320
+    height: 418
+
+    property int yOffset: 0
+
+    Component.onCompleted: myText.height = height
+
+    Text {
+        id: myText
+        objectName: "myText"
+        width: parent.width
+        height: 0
+        wrapMode: Text.WordWrap
+        font.pointSize: 14
+        focus: true
+
+        text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+Integer at ante dui Curabitur ante est, pulvinar quis adipiscing a, iaculis id ipsum. Nunc blandit
+condimentum odio vel egestas. in ipsum lacinia sit amet
+mattis orci interdum. Quisque vitae accumsan lectus. Ut nisi turpis,
+sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac
+mattis orci interdum. Quisque vitae accumsan lectus. Ut nisi turpis,
+sollicitudin ut dignissim id, fermentum ac est. Maecenas nec libero leo. Sed ac
+leo eget ipsum ultricies viverra sit amet eu orci. Praesent et tortor risus,
+viverra accumsan sapien. Sed faucibus eleifend lectus, sed euismod urna porta
+eu. Quisque vitae accumsan lectus."
+
+        onLineLaidOut: {
+            line.width = width / 2
+
+            if (line.y + line.height >= height) {
+                if (main.yOffset === 0)
+                    main.yOffset = line.y
+                line.y -= main.yOffset
+                line.x = width / 2
+            } else {
+                main.yOffset = 0
+            }
+        }
+    }
+}
index 28eed57..7d24de6 100644 (file)
@@ -117,6 +117,7 @@ private slots:
     void boundingRect();
     void clipRect();
     void lineLaidOut();
+    void lineLaidOutRelayout();
 
     void imgTagsBaseUrl_data();
     void imgTagsBaseUrl();
@@ -1898,6 +1899,42 @@ void tst_qquicktext::lineLaidOut()
     delete canvas;
 }
 
+void tst_qquicktext::lineLaidOutRelayout()
+{
+    QQuickView *canvas = createView(testFile("lineLayoutRelayout.qml"));
+
+    canvas->show();
+    canvas->requestActivateWindow();
+    QTest::qWaitForWindowShown(canvas);
+
+    QQuickText *myText = canvas->rootObject()->findChild<QQuickText*>("myText");
+    QVERIFY(myText != 0);
+
+    QQuickTextPrivate *textPrivate = QQuickTextPrivate::get(myText);
+    QVERIFY(textPrivate != 0);
+
+    QVERIFY(!textPrivate->extra.isAllocated());
+
+#if defined(Q_OS_MAC)
+    QVERIFY(myText->lineCount() == textPrivate->linesRects.count());
+#endif
+
+    qreal maxH = 0;
+    for (int i = 0; i < textPrivate->layout.lineCount(); ++i) {
+        QRectF r = textPrivate->layout.lineAt(i).rect();
+
+        if (r.x() == 0) {
+            QCOMPARE(r.y(), i * r.height());
+            maxH = qMax(maxH, r.y() + r.height());
+        } else {
+            QCOMPARE(r.x(), myText->width() / 2);
+            QCOMPARE(r.y(), (i * r.height()) - maxH);
+        }
+    }
+
+    delete canvas;
+}
+
 void tst_qquicktext::imgTagsBaseUrl_data()
 {
     QTest::addColumn<QUrl>("src");