Ensure the cursorRectangle is updated as the width of the text changes.
authorAndrew den Exter <andrew.den.exter@jollamobile.com>
Wed, 19 Dec 2012 07:12:58 +0000 (17:12 +1000)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 31 Jan 2013 23:52:44 +0000 (00:52 +0100)
Outside of when of a monospace font is used, if the text changes the
visual position of the cursor will have most likely changed as well
even when the cursor index hasn't.

Task-number: QTBUG-28677
Change-Id: If8077772d8541a677d5875976e6cd9fc453731df
Reviewed-by: Alan Alpert <aalpert@rim.com>

src/quick/items/qquicktextinput.cpp
tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp

index 9067589..b305ad1 100644 (file)
@@ -3275,6 +3275,7 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo
     bool inputMethodAttributesChanged = m_textDirty || m_selDirty;
 #endif
     bool alignmentChanged = false;
+    bool textChanged = false;
 
     if (m_textDirty) {
         // do validation
@@ -3309,6 +3310,7 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo
         }
 
         if (m_textDirty) {
+            textChanged = true;
             m_textDirty = false;
 #ifndef QT_NO_IM
             m_preeditDirty = false;
@@ -3344,7 +3346,7 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo
 #endif
     emitUndoRedoChanged();
 
-    if (!emitCursorPositionChanged() && alignmentChanged)
+    if (!emitCursorPositionChanged() && (alignmentChanged || textChanged))
         q->updateCursorRectangle();
 
     return true;
index 3b1c5eb..86a05c3 100644 (file)
@@ -3087,6 +3087,14 @@ void tst_qquicktextinput::cursorRectangle()
     input.setHAlign(leftToRight ? QQuickTextInput::AlignRight : QQuickTextInput::AlignLeft);
     r = input.cursorRectangle();
     QCOMPARE(r.left(), leftToRight ? input.width() : 0);
+
+    QSignalSpy cursorRectangleSpy(&input, SIGNAL(cursorRectangleChanged()));
+
+    QString widerText = shortText;
+    widerText[1] = 'W'; // Assumes shortText is at least two characters long.
+    input.setText(widerText);
+
+    QCOMPARE(cursorRectangleSpy.count(), 1);
 }
 
 void tst_qquicktextinput::readOnly()