Skip to content

Commit

Permalink
Fix validators not allowing backspace or delete.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andrew den Exter authored and Qt by Nokia committed Jan 12, 2012
1 parent 9d73bf2 commit 0cafd92
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
8 changes: 6 additions & 2 deletions src/quick/items/qquicktextinput.cpp
Expand Up @@ -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();
}

Expand Down Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions src/quick/items/qquicktextinput_p_p.h
Expand Up @@ -105,7 +105,6 @@ class Q_AUTOTEST_EXPORT QQuickTextInputPrivate : public QQuickImplicitSizeItemPr
, inputMethodHints(Qt::ImhNone)
, m_layoutDirection(Qt::LayoutDirectionAuto)
, m_passwordCharacter(QLatin1Char('*'))
, oldValidity(false)
, focused(false)
, focusOnPress(true)
, cursorVisible(false)
Expand Down Expand Up @@ -231,7 +230,6 @@ class Q_AUTOTEST_EXPORT QQuickTextInputPrivate : public QQuickImplicitSizeItemPr
QChar m_blank;
QChar m_passwordCharacter;

bool oldValidity:1;
bool focused:1;
bool focusOnPress:1;
bool cursorVisible:1;
Expand Down
41 changes: 41 additions & 0 deletions tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp
Expand Up @@ -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);
Expand Down

0 comments on commit 0cafd92

Please sign in to comment.