aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextinput.cpp27
-rw-r--r--src/quick/items/qquicktextinput_p_p.h1
-rw-r--r--tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp25
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)