From 7c288f1a61173f1904960c96c703ee89ab5a847e Mon Sep 17 00:00:00 2001
From: Pekka Vuorela <pekka.ta.vuorela@nokia.com>
Date: Fri, 20 Apr 2012 17:18:53 +0300
Subject: [PATCH] Fix TextEdit with right aligned text when size changes

Geometry change was avoiding updating size of the QTextDocument, thus
it was not able to right align before something else triggered size
change, e.g. a modification to the text. Also removed unnecessary
cursorRectangleChanged signal that was emitted when moving focus with
mouse.

Change-Id: I293fd5119473eb3def5acd1b3fbb951c12e14412
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
---
 src/quick/items/qquicktextcontrol.cpp            | 14 +++++---------
 src/quick/items/qquicktextedit.cpp               |  2 +-
 .../data/horizontalAlignment_RightToLeft.qml     | 16 ++++++++++++++++
 .../quick/qquicktextedit/tst_qquicktextedit.cpp  |  8 ++++++++
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp
index 7fa990ba9f..8bc94b919c 100644
--- a/src/quick/items/qquicktextcontrol.cpp
+++ b/src/quick/items/qquicktextcontrol.cpp
@@ -1206,18 +1206,14 @@ void QQuickTextControlPrivate::mousePressEvent(QMouseEvent *e, const QPointF &po
         }
     }
 
-    if (interactionFlags & Qt::TextEditable) {
+    if (cursor.position() != oldCursorPos) {
         q->updateCursorRectangle(true);
-        if (cursor.position() != oldCursorPos)
-            emit q->cursorPositionChanged();
+        emit q->cursorPositionChanged();
+    }
+    if (interactionFlags & Qt::TextEditable)
         _q_updateCurrentCharFormatAndSelection();
-    } else {
-        if (cursor.position() != oldCursorPos) {
-            emit q->cursorPositionChanged();
-            q->updateCursorRectangle(true);
-        }
+    else
         selectionChanged();
-    }
     repaintOldAndNewSelection(oldSelection);
     hadSelectionOnMousePress = cursor.hasSelection();
 }
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index cd5f262f37..fc02815adf 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -1144,7 +1144,7 @@ void QQuickTextEdit::geometryChanged(const QRectF &newGeometry,
                                   const QRectF &oldGeometry)
 {
     Q_D(QQuickTextEdit);
-    if (newGeometry.width() != oldGeometry.width() && d->wrapMode != NoWrap && widthValid() && !d->inLayout) {
+    if (newGeometry.width() != oldGeometry.width() && widthValid() && !d->inLayout) {
         updateSize();
         moveCursorDelegate();
     }
diff --git a/tests/auto/quick/qquicktextedit/data/horizontalAlignment_RightToLeft.qml b/tests/auto/quick/qquicktextedit/data/horizontalAlignment_RightToLeft.qml
index 2163838488..8231e3f42b 100644
--- a/tests/auto/quick/qquicktextedit/data/horizontalAlignment_RightToLeft.qml
+++ b/tests/auto/quick/qquicktextedit/data/horizontalAlignment_RightToLeft.qml
@@ -8,6 +8,7 @@ Rectangle {
     property string text: "اختبا"
 
     Rectangle {
+        id: arabicContainer
         anchors.centerIn: parent
         width: 200
         height: 20
@@ -22,4 +23,19 @@ Rectangle {
             textFormat: TextEdit.AutoText
         }
     }
+
+    Rectangle {
+        anchors.top: arabicContainer.bottom
+        anchors.left: arabicContainer.left
+        width: 200
+        height: 20
+        color: "green"
+
+        TextEdit {
+            id: emptyTextEdit
+            objectName: "emptyTextEdit"
+            anchors.fill: parent
+            textFormat: TextEdit.AutoText
+        }
+    }
 }
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index 9c34a7c8d8..0bc48c98da 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -772,6 +772,14 @@ void tst_qquicktextedit::hAlign_RightToLeft()
     textEdit->setHAlign(QQuickTextEdit::AlignRight);
     QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
     QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
+
+    // make sure editor doesn't rely on input for updating size
+    QQuickTextEdit *emptyEdit = canvas.rootObject()->findChild<QQuickTextEdit*>("emptyTextEdit");
+    QVERIFY(emptyEdit != 0);
+    platformInputContext.setInputDirection(Qt::RightToLeft);
+    emptyEdit->setFocus(true);
+    QCOMPARE(emptyEdit->hAlign(), QQuickTextEdit::AlignRight);
+    QVERIFY(emptyEdit->cursorRectangle().left() > canvas.width()/2);
 }
 
 void tst_qquicktextedit::vAlign()
-- 
GitLab