aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktext.cpp6
-rw-r--r--tests/auto/quick/qquicktext/data/hAlignImplicitWidth.qml13
-rw-r--r--tests/auto/quick/qquicktext/tst_qquicktext.cpp55
3 files changed, 73 insertions, 1 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index 4d39f0baad..104a6ab67c 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -916,9 +916,13 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const naturalWidth, qreal *cons
&& (q->heightValid() || (maximumLineCountValid && canWrap));
const qreal oldWidth = lineWidth;
- lineWidth = q->widthValid() && q->width() > 0 ? q->width() : FLT_MAX;
+ lineWidth = q->widthValid() && q->width() > 0 ? q->width() : *naturalWidth;
if (lineWidth != oldWidth && (singlelineElide || multilineElide || canWrap || horizontalFit))
continue;
+ // If the horizontal alignment is not left and the width was not valid we need to relayout
+ // now that we know the maximum line width.
+ if (!q->widthValid() && maxLineCount > 1 && q->effectiveHAlign() != QQuickText::AlignLeft)
+ continue;
}
// If the next needs to be elided and there's an abbreviated string available
diff --git a/tests/auto/quick/qquicktext/data/hAlignImplicitWidth.qml b/tests/auto/quick/qquicktext/data/hAlignImplicitWidth.qml
new file mode 100644
index 0000000000..136e5d21a2
--- /dev/null
+++ b/tests/auto/quick/qquicktext/data/hAlignImplicitWidth.qml
@@ -0,0 +1,13 @@
+import QtQuick 2.0
+
+Rectangle {
+ width: 200
+ height: 100
+
+ Text {
+ objectName: "textItem"
+ text: "AA\nBBBBB\nCCCCCCCCCCCCCCCC"
+ anchors.centerIn: parent
+ horizontalAlignment: Text.AlignLeft
+ }
+}
diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp
index a83a10e216..d9395ca78d 100644
--- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp
+++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp
@@ -90,6 +90,7 @@ private slots:
void horizontalAlignment();
void horizontalAlignment_RightToLeft();
void verticalAlignment();
+ void hAlignImplicitWidth();
void font();
void style();
void color();
@@ -158,6 +159,7 @@ private:
QQmlEngine engine;
QQuickView *createView(const QString &filename);
+ int numberOfNonWhitePixels(int fromX, int toX, const QImage &image);
};
tst_qquicktext::tst_qquicktext()
@@ -836,6 +838,59 @@ void tst_qquicktext::horizontalAlignment_RightToLeft()
delete textObject;
}
+int tst_qquicktext::numberOfNonWhitePixels(int fromX, int toX, const QImage &image)
+{
+ int pixels = 0;
+ for (int x = fromX; x < toX; ++x) {
+ for (int y = 0; y < image.height(); ++y) {
+ if (image.pixel(x, y) != qRgb(255, 255, 255))
+ pixels++;
+ }
+ }
+ return pixels;
+}
+
+void tst_qquicktext::hAlignImplicitWidth()
+{
+ QQuickView view(testFileUrl("hAlignImplicitWidth.qml"));
+ view.show();
+ view.requestActivateWindow();
+ QTest::qWaitForWindowShown(&view);
+
+ QQuickText *text = view.rootObject()->findChild<QQuickText*>("textItem");
+ QVERIFY(text != 0);
+
+ {
+ // Left Align
+ QImage image = view.grabFrameBuffer();
+ int left = numberOfNonWhitePixels(0, image.width() / 3, image);
+ int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image);
+ int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image);
+ QVERIFY(left > mid);
+ QVERIFY(mid > right);
+ }
+ {
+ // HCenter Align
+ text->setHAlign(QQuickText::AlignHCenter);
+ QImage image = view.grabFrameBuffer();
+ int left = numberOfNonWhitePixels(0, image.width() / 3, image);
+ int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image);
+ int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image);
+ QVERIFY(left < mid);
+ QVERIFY(mid > right);
+ }
+ {
+ // Right Align
+ text->setHAlign(QQuickText::AlignRight);
+ QImage image = view.grabFrameBuffer();
+ int left = numberOfNonWhitePixels(0, image.width() / 3, image);
+ int mid = numberOfNonWhitePixels(image.width() / 3, 2 * image.width() / 3, image);
+ int right = numberOfNonWhitePixels( 2 * image.width() / 3, image.width(), image);
+ QVERIFY(left < mid);
+ QVERIFY(mid < right);
+ }
+}
+
void tst_qquicktext::verticalAlignment()
{
//test one align each, and then test if two align fails.