Fix TextEdit vertical alignment.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Fri, 3 Feb 2012 03:34:57 +0000 (13:34 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 6 Feb 2012 07:28:23 +0000 (08:28 +0100)
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 <martin.jones@nokia.com>
src/quick/items/qquicktextedit.cpp
src/quick/items/qquicktextnode.cpp
tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp

index 9d1179e..0ebe5de 100644 (file)
@@ -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);
 
 }
 
index 6b46a01..4c5e18f 100644 (file)
@@ -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<QTextLayout::FormatRange> 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();
index 8bea117..05ebfb8 100644 (file)
@@ -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<QQuickTextEdit*>(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()