return;
cancelPasswordEchoTimer();
internalDeselect();
+
+ // Undo works only for clearing the line when in any of password the modes
+ if (m_echoMode != QLineEdit::Normal) {
+ clear();
+ return;
+ }
+
while (m_undoState && m_undoState > until) {
Command& cmd = m_history[--m_undoState];
switch (cmd.type) {
event->accept();
}
+bool QWidgetLineControl::isUndoAvailable() const
+{
+ // For security reasons undo is not available in any password mode (NoEcho included)
+ // with the exception that the user can clear the password with undo.
+ return !m_readOnly && m_undoState
+ && (m_echoMode == QLineEdit::Normal || m_history[m_undoState - 1].type == QWidgetLineControl::Insert);
+}
+
+bool QWidgetLineControl::isRedoAvailable() const
+{
+ // Same as with undo. Disabled for password modes.
+ return !m_readOnly
+ && m_echoMode == QLineEdit::Normal
+ && m_undoState < m_history.size();
+}
QT_END_NAMESPACE
void inputMethodQueryImHints_data();
void inputMethodQueryImHints();
+ void undoRedoAndEchoModes_data();
+ void undoRedoAndEchoModes();
+
protected slots:
void editingFinished();
QCOMPARE(static_cast<Qt::InputMethodHints>(value.toInt()), hints);
}
+void tst_QLineEdit::undoRedoAndEchoModes_data()
+{
+ QTest::addColumn<int>("echoMode");
+ QTest::addColumn<QStringList>("input");
+ QTest::addColumn<QStringList>("expected");
+
+ QStringList input(QList<QString>() << "aaa" << "bbb" << "ccc");
+
+ QTest::newRow("Normal")
+ << (int) QLineEdit::Normal
+ << input
+ << QStringList(QList<QString>() << "aaa" << "ccc" << "");
+
+ QTest::newRow("NoEcho")
+ << (int) QLineEdit::NoEcho
+ << input
+ << QStringList(QList<QString>() << "" << "" << "");
+
+ QTest::newRow("Password")
+ << (int) QLineEdit::Password
+ << input
+ << QStringList(QList<QString>() << "" << "" << "");
+
+ QTest::newRow("PasswordEchoOnEdit")
+ << (int) QLineEdit::PasswordEchoOnEdit
+ << input
+ << QStringList(QList<QString>() << "" << "" << "");
+}
+
+void tst_QLineEdit::undoRedoAndEchoModes()
+{
+ QFETCH(int, echoMode);
+ QFETCH(QStringList, input);
+ QFETCH(QStringList, expected);
+
+ // create some history for the QLineEdit
+ testWidget->clear();
+ testWidget->setEchoMode(QLineEdit::EchoMode(echoMode));
+ testWidget->insert(input.at(0));
+ testWidget->selectAll();
+ testWidget->backspace();
+ testWidget->insert(input.at(1));
+
+ // test undo
+ QVERIFY(testWidget->isUndoAvailable());
+ testWidget->undo();
+ QCOMPARE(testWidget->text(), expected.at(0));
+ testWidget->insert(input.at(2));
+ testWidget->selectAll();
+ testWidget->backspace();
+ QCOMPARE(testWidget->isUndoAvailable(), echoMode == QLineEdit::Normal);
+ testWidget->undo();
+ QCOMPARE(testWidget->text(), expected.at(1));
+
+ // test redo
+ QCOMPARE(testWidget->isRedoAvailable(), echoMode == QLineEdit::Normal);
+ testWidget->redo();
+ QCOMPARE(testWidget->text(), expected.at(2));
+ QVERIFY(!testWidget->isRedoAvailable());
+ testWidget->redo();
+ QCOMPARE(testWidget->text(), expected.at(2));
+}
+
QTEST_MAIN(tst_QLineEdit)
#include "tst_qlineedit.moc"