diff options
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 27 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 25 |
3 files changed, 41 insertions, 12 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 7ee1c937c6..ad79f0eadf 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -1710,6 +1710,8 @@ void QQuickTextInput::geometryChanged(const QRectF &newGeometry, if (!d->inLayout) { if (newGeometry.width() != oldGeometry.width()) d->updateLayout(); + else if (newGeometry.height() != oldGeometry.height() && d->vAlign != QQuickTextInput::AlignTop) + d->updateBaselineOffset(); updateCursorRectangle(); } QQuickImplicitSizeItem::geometryChanged(newGeometry, oldGeometry); @@ -2855,20 +2857,33 @@ void QQuickTextInputPrivate::updateLayout() else q->setImplicitHeight(height); + updateBaselineOffset(); + if (previousSize != contentSize) + emit q->contentSizeChanged(); +} + +/*! + \internal + \brief QQuickTextInputPrivate::updateBaselineOffset + + Assumes contentSize.height() is already calculated. + */ +void QQuickTextInputPrivate::updateBaselineOffset() +{ + Q_Q(QQuickTextInput); + if (!q->isComponentComplete()) + return; QFontMetricsF fm(font); qreal yoff = 0; if (q->heightValid()) { - const qreal itemHeight = q->height(); + const qreal surplusHeight = q->height() - contentSize.height(); if (vAlign == QQuickTextInput::AlignBottom) - yoff = itemHeight - height; + yoff = surplusHeight; else if (vAlign == QQuickTextInput::AlignVCenter) - yoff = (itemHeight - height)/2; + yoff = surplusHeight/2; } q->setBaselineOffset(fm.ascent() + yoff); - - if (previousSize != contentSize) - emit q->contentSizeChanged(); } #ifndef QT_NO_CLIPBOARD diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index 240fc7a599..21bd1bd6d7 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -423,6 +423,7 @@ public: void setCursorBlinkPeriod(int msec); void updateLayout(); + void updateBaselineOffset(); qreal getImplicitWidth() const; diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index 73abddb2c7..273c0de660 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -6391,36 +6391,42 @@ void tst_qquicktextinput::baselineOffset_data() { QTest::addColumn<QString>("text"); QTest::addColumn<QByteArray>("bindings"); + QTest::addColumn<qreal>("setHeight"); QTest::addColumn<ExpectedBaseline>("expectedBaseline"); QTest::addColumn<ExpectedBaseline>("expectedBaselineEmpty"); QTest::newRow("normal") << "Typography" << QByteArray() + << -1. << &expectedBaselineTop << &expectedBaselineTop; QTest::newRow("top align") << "Typography" << QByteArray("height: 200; verticalAlignment: Text.AlignTop") + << -1. << &expectedBaselineTop << &expectedBaselineTop; QTest::newRow("bottom align") << "Typography" << QByteArray("height: 200; verticalAlignment: Text.AlignBottom") + << 100. << &expectedBaselineBottom << &expectedBaselineBottom; QTest::newRow("center align") << "Typography" << QByteArray("height: 200; verticalAlignment: Text.AlignVCenter") + << 100. << &expectedBaselineCenter << &expectedBaselineCenter; QTest::newRow("multiline bottom aligned") << "The quick brown fox jumps over the lazy dog" << QByteArray("height: 200; width: 30; verticalAlignment: Text.AlignBottom; wrapMode: TextInput.WordWrap") + << -1. << &expectedBaselineMultilineBottom << &expectedBaselineBottom; } @@ -6429,6 +6435,7 @@ void tst_qquicktextinput::baselineOffset() { QFETCH(QString, text); QFETCH(QByteArray, bindings); + QFETCH(qreal, setHeight); QFETCH(ExpectedBaseline, expectedBaseline); QFETCH(ExpectedBaseline, expectedBaselineEmpty); @@ -6441,12 +6448,18 @@ void tst_qquicktextinput::baselineOffset() QScopedPointer<QObject> object(component.create()); QQuickTextInput *item = qobject_cast<QQuickTextInput *>(object.data()); - QVERIFY(item); - QCOMPARE(item->baselineOffset(), expectedBaselineEmpty(item)); - item->setText(text); - QCOMPARE(item->baselineOffset(), expectedBaseline(item)); - item->setText(QString()); - QCOMPARE(item->baselineOffset(), expectedBaselineEmpty(item)); + + int passes = setHeight >= 0 ? 2 : 1; + while (passes--) { + QVERIFY(item); + QCOMPARE(item->baselineOffset(), expectedBaselineEmpty(item)); + item->setText(text); + QCOMPARE(item->baselineOffset(), expectedBaseline(item)); + item->setText(QString()); + QCOMPARE(item->baselineOffset(), expectedBaselineEmpty(item)); + if (setHeight >= 0) + item->setHeight(setHeight); + } } QTEST_MAIN(tst_qquicktextinput) |