Emit selectionChanged signals when input method alters selection.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Mon, 25 Jul 2011 06:58:46 +0000 (16:58 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 28 Jul 2011 09:02:16 +0000 (11:02 +0200)
Mark the selection as dirty if an input method event contains a
selection and emit selectionChanged() if it's not emitted by
finishChange().

Task-number: QTBUG-19731

Change-Id: Ief6f06f40071f64dae4db0ba365676c059a39c7e
Reviewed-on: http://codereview.qt.nokia.com/2081
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/gui/widgets/qlinecontrol.cpp
tests/auto/qlineedit/tst_qlineedit.cpp

index 550b5cf..5937446 100644 (file)
@@ -494,6 +494,7 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event)
                 if (m_selend < m_selstart) {
                     qSwap(m_selstart, m_selend);
                 }
+                m_selDirty = true;
             } else {
                 m_selstart = m_selend = 0;
             }
@@ -525,12 +526,18 @@ void QLineControl::processInputMethodEvent(QInputMethodEvent *event)
     }
     m_textLayout.setAdditionalFormats(formats);
     updateDisplayText(/*force*/ true);
-    if (cursorPositionChanged)
-        emitCursorPositionChanged();
-    else if (m_preeditCursor != oldPreeditCursor)
-        emit updateMicroFocus();
-    if (isGettingInput)
+    if (isGettingInput) {
         finishChange(priorState);
+    } else {
+        if (cursorPositionChanged)
+            emitCursorPositionChanged();
+        else if (m_preeditCursor != oldPreeditCursor)
+            emit updateMicroFocus();
+        if (m_selDirty) {
+            m_selDirty = false;
+            emit selectionChanged();
+        }
+    }
 }
 
 /*!
index 72b402f..68e88a8 100644 (file)
@@ -290,6 +290,7 @@ private slots:
     void bidiLogicalMovement();
 
     void selectAndCursorPosition();
+    void inputMethodSelection();
 
 protected slots:
     void editingFinished();
@@ -3883,5 +3884,28 @@ void tst_QLineEdit::selectAndCursorPosition()
     QCOMPARE(testWidget->cursorPosition(), 0);
 }
 
+void tst_QLineEdit::inputMethodSelection()
+{
+    testWidget->setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
+    testWidget->setSelection(0,0);
+    QSignalSpy selectionSpy(testWidget, SIGNAL(selectionChanged()));
+
+    QCOMPARE(selectionSpy.count(), 0);
+    QCOMPARE(testWidget->selectionStart(), -1);
+
+    testWidget->setSelection(0,5);
+
+    QCOMPARE(selectionSpy.count(), 1);
+    QCOMPARE(testWidget->selectionStart(), 0);
+
+    QList<QInputMethodEvent::Attribute> attributes;
+    attributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 12, 5, QVariant());
+    QInputMethodEvent event("", attributes);
+    QApplication::sendEvent(testWidget, &event);
+
+    QCOMPARE(selectionSpy.count(), 2);
+    QCOMPARE(testWidget->selectionStart(), 12);
+}
+
 QTEST_MAIN(tst_QLineEdit)
 #include "tst_qlineedit.moc"