Fix validators not allowing backspace or delete.
authorAndrew den Exter <andrew.den-exter@nokia.com>
Tue, 10 Jan 2012 06:51:22 +0000 (16:51 +1000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 12 Jan 2012 08:33:32 +0000 (09:33 +0100)
TextInput will allow non-valid changes to already invalid text, when
a validator is changed update the current validity so changes can
be made to bring the text back to a valid state.

Task-number: QTBUG-22080
Change-Id: I501961b473f58c317bce474b1df8d91fd1f967d4
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquicktextinput.cpp
src/quick/items/qquicktextinput_p_p.h
tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp

index df536f4..12f02d8 100644 (file)
@@ -931,7 +931,12 @@ void QQuickTextInput::setValidator(QValidator* v)
 
     d->m_validator = v;
     if (!d->hasAcceptableInput(d->m_text)) {
-        d->oldValidity = false;
+        if (d->m_validInput) {
+            d->m_validInput = false;
+            emit acceptableInputChanged();
+        }
+    } else if (!d->m_validInput) {
+        d->m_validInput = true;
         emit acceptableInputChanged();
     }
 
@@ -2345,7 +2350,6 @@ void QQuickTextInputPrivate::init()
             q, SLOT(q_canPasteChanged()));
 #endif // QT_NO_CLIPBOARD
 
-    oldValidity = hasAcceptableInput(m_text);
     lastSelectionStart = 0;
     lastSelectionEnd = 0;
     selectedTextColor = m_palette.color(QPalette::HighlightedText);
index 03d825d..44df9f2 100644 (file)
@@ -105,7 +105,6 @@ public:
         , inputMethodHints(Qt::ImhNone)
         , m_layoutDirection(Qt::LayoutDirectionAuto)
         , m_passwordCharacter(QLatin1Char('*'))
-        , oldValidity(false)
         , focused(false)
         , focusOnPress(true)
         , cursorVisible(false)
@@ -231,7 +230,6 @@ public:
     QChar m_blank;
     QChar m_passwordCharacter;
 
-    bool oldValidity:1;
     bool focused:1;
     bool focusOnPress:1;
     bool cursorVisible:1;
index 017ac53..ac60ad3 100644 (file)
@@ -1611,6 +1611,47 @@ void tst_qquicktextinput::validators()
     QTRY_COMPARE(dblInput->text(), QLatin1String("12.11"));
     QCOMPARE(dblInput->hasAcceptableInput(), true);
 
+    // Ensure the validator doesn't prevent characters being removed.
+    dblInput->setValidator(intInput->validator());
+    QCOMPARE(dblInput->text(), QLatin1String("12.11"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_Backspace);
+    QTest::keyRelease(&canvas, Qt::Key_Backspace, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("12.1"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    // Once unacceptable input is in anything goes until it reaches an acceptable state again.
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("12.11"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_Backspace);
+    QTest::keyRelease(&canvas, Qt::Key_Backspace, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("12.1"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_Backspace);
+    QTest::keyRelease(&canvas, Qt::Key_Backspace, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("12."));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_Backspace);
+    QTest::keyRelease(&canvas, Qt::Key_Backspace, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("12"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_Backspace);
+    QTest::keyRelease(&canvas, Qt::Key_Backspace, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QTRY_COMPARE(dblInput->text(), QLatin1String("1"));
+    QCOMPARE(dblInput->hasAcceptableInput(), false);
+    QTest::keyPress(&canvas, Qt::Key_1);
+    QTest::keyRelease(&canvas, Qt::Key_1, Qt::NoModifier ,10);
+    QTest::qWait(50);
+    QCOMPARE(dblInput->text(), QLatin1String("11"));
+    QCOMPARE(dblInput->hasAcceptableInput(), true);
+
     QQuickTextInput *strInput = qobject_cast<QQuickTextInput *>(qvariant_cast<QObject *>(canvas.rootObject()->property("strInput")));
     QTRY_VERIFY(strInput);
     strInput->setFocus(true);