From 5260a562a96ddab77ec22693997e2c784e3b6613 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Fri, 3 Feb 2012 13:34:57 +1000 Subject: [PATCH] Fix TextEdit vertical alignment. Don't ignore the position of a QTextDocument when contructing a text node, and translate the rectangle returned by positionToRectangle by the y offset. Task-number: QTBUG-23935 Change-Id: I55a2b69a32a8b623be7e36de54ad083c2f8591e5 Reviewed-by: Martin Jones --- src/quick/items/qquicktextedit.cpp | 2 +- src/quick/items/qquicktextnode.cpp | 4 +- .../qtquick2/qquicktextedit/tst_qquicktextedit.cpp | 25 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 9d1179e..0ebe5de 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -736,7 +736,7 @@ QRectF QQuickTextEdit::positionToRectangle(int pos) const Q_D(const QQuickTextEdit); QTextCursor c(d->document); c.setPosition(pos); - return d->control->cursorRect(c); + return d->control->cursorRect(c).translated(0, d->yoff); } diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp index 6b46a01..4c5e18f 100644 --- a/src/quick/items/qquicktextnode.cpp +++ b/src/quick/items/qquicktextnode.cpp @@ -1104,7 +1104,7 @@ void QQuickTextNode::addImage(const QRectF &rect, const QImage &image) node->update(); } -void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocument, +void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *textDocument, const QColor &textColor, QQuickText::TextStyle style, const QColor &styleColor, const QColor &selectionColor, const QColor &selectedTextColor, @@ -1147,7 +1147,7 @@ void QQuickTextNode::addTextDocument(const QPointF &, QTextDocument *textDocumen QVarLengthArray colorChanges; mergeFormats(block.layout(), &colorChanges); - QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft(); + QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft() + position; if (QTextList *textList = block.textList()) { QPointF pos = blockPosition; QTextLayout *layout = block.layout(); diff --git a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp index 8bea117..05ebfb8 100644 --- a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp @@ -800,6 +800,31 @@ void tst_qquicktextedit::vAlign() } } + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData( + "import QtQuick 2.0\n" + "TextEdit { width: 100; height: 100; text: \"Hello World\" }", QUrl()); + QQuickTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + + QCOMPARE(textEditObject->vAlign(), QQuickTextEdit::AlignTop); + QVERIFY(textEditObject->cursorRectangle().bottom() < 50); + QVERIFY(textEditObject->positionToRectangle(0).bottom() < 50); + + // bottom aligned + textEditObject->setVAlign(QQuickTextEdit::AlignBottom); + QCOMPARE(textEditObject->vAlign(), QQuickTextEdit::AlignBottom); + QVERIFY(textEditObject->cursorRectangle().top() > 50); + QVERIFY(textEditObject->positionToRectangle(0).top() > 50); + + // explicitly center aligned + textEditObject->setVAlign(QQuickTextEdit::AlignVCenter); + QCOMPARE(textEditObject->vAlign(), QQuickTextEdit::AlignVCenter); + QVERIFY(textEditObject->cursorRectangle().top() < 50); + QVERIFY(textEditObject->cursorRectangle().bottom() > 50); + QVERIFY(textEditObject->positionToRectangle(0).top() < 50); + QVERIFY(textEditObject->positionToRectangle(0).bottom() > 50); } void tst_qquicktextedit::font() -- 1.7.2.5