From 9d73bf289e2719d781670baad1733989a56d7f40 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 10 Jan 2012 11:52:43 +1000 Subject: Add undo and redo functions to TextInput and TextEdit. The functionality already existed and was usable through keyboard short cuts but was not accessible through API. Task-number: QTBUG-16191 Change-Id: I080fa2ddb76668a7a632aa7477004f99037ea68b Reviewed-by: Martin Jones --- .../qtquick2/qquicktextedit/tst_qquicktextedit.cpp | 83 ++++++++++++++-------- .../qquicktextinput/tst_qquicktextinput.cpp | 37 ++++++++-- 2 files changed, 87 insertions(+), 33 deletions(-) (limited to 'tests') diff --git a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp index 78bab0aeef..7d40bc4168 100644 --- a/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/qtquick2/qquicktextedit/tst_qquicktextedit.cpp @@ -3326,28 +3326,32 @@ void tst_qquicktextedit::undo() QFETCH(QStringList, expectedString); QString componentStr = "import QtQuick 2.0\nTextEdit { focus: true }"; - QDeclarativeComponent textInputComponent(&engine); - textInputComponent.setData(componentStr.toLatin1(), QUrl()); - QQuickTextEdit *textInput = qobject_cast(textInputComponent.create()); - QVERIFY(textInput != 0); + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); QQuickCanvas canvas; - textInput->setParentItem(canvas.rootItem()); + textEdit->setParentItem(canvas.rootItem()); canvas.show(); canvas.requestActivateWindow(); QTest::qWaitForWindowShown(&canvas); QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QVERIFY(!textEdit->canUndo()); + + QSignalSpy spy(textEdit, SIGNAL(canUndoChanged())); + int i; // STEP 1: First build up an undo history by inserting or typing some strings... for (i = 0; i < insertString.size(); ++i) { if (insertIndex[i] > -1) - textInput->setCursorPosition(insertIndex[i]); + textEdit->setCursorPosition(insertIndex[i]); // experimental stuff if (insertMode[i] == REPLACE_UNTIL_END) { - textInput->select(insertIndex[i], insertIndex[i] + 8); + textEdit->select(insertIndex[i], insertIndex[i] + 8); // This is what I actually want... // QTest::keyClick(testWidget, Qt::Key_End, Qt::ShiftModifier); @@ -3357,14 +3361,19 @@ void tst_qquicktextedit::undo() QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); } + QCOMPARE(spy.count(), 1); + // STEP 2: Next call undo several times and see if we can restore to the previous state for (i = 0; i < expectedString.size() - 1; ++i) { - QCOMPARE(textInput->text(), expectedString[i]); - simulateKeys(&canvas, QKeySequence::Undo); + QCOMPARE(textEdit->text(), expectedString[i]); + QVERIFY(textEdit->canUndo()); + textEdit->undo(); } // STEP 3: Verify that we have undone everything - QVERIFY(textInput->text().isEmpty()); + QVERIFY(textEdit->text().isEmpty()); + QVERIFY(!textEdit->canUndo()); + QCOMPARE(spy.count(), 2); } void tst_qquicktextedit::redo_data() @@ -3403,35 +3412,53 @@ void tst_qquicktextedit::redo() QFETCH(QStringList, expectedString); QString componentStr = "import QtQuick 2.0\nTextEdit { focus: true }"; - QDeclarativeComponent textInputComponent(&engine); - textInputComponent.setData(componentStr.toLatin1(), QUrl()); - QQuickTextEdit *textInput = qobject_cast(textInputComponent.create()); - QVERIFY(textInput != 0); + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); QQuickCanvas canvas; - textInput->setParentItem(canvas.rootItem()); + textEdit->setParentItem(canvas.rootItem()); canvas.show(); canvas.requestActivateWindow(); QTest::qWaitForWindowShown(&canvas); QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QVERIFY(!textEdit->canUndo()); + QVERIFY(!textEdit->canRedo()); + + QSignalSpy spy(textEdit, SIGNAL(canRedoChanged())); + int i; // inserts the diff strings at diff positions for (i = 0; i < insertString.size(); ++i) { if (insertIndex[i] > -1) - textInput->setCursorPosition(insertIndex[i]); + textEdit->setCursorPosition(insertIndex[i]); for (int j = 0; j < insertString.at(i).length(); j++) QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); + QVERIFY(textEdit->canUndo()); + QVERIFY(!textEdit->canRedo()); } + QCOMPARE(spy.count(), 0); + // undo everything - while (!textInput->text().isEmpty()) - simulateKeys(&canvas, QKeySequence::Undo); + while (!textEdit->text().isEmpty()) { + QVERIFY(textEdit->canUndo()); + textEdit->undo(); + QVERIFY(textEdit->canRedo()); + } + + QCOMPARE(spy.count(), 1); for (i = 0; i < expectedString.size(); ++i) { - simulateKeys(&canvas, QKeySequence::Redo); - QCOMPARE(textInput->text() , expectedString[i]); + QVERIFY(textEdit->canRedo()); + textEdit->redo(); + QCOMPARE(textEdit->text() , expectedString[i]); + QVERIFY(textEdit->canUndo()); } + QVERIFY(!textEdit->canRedo()); + QCOMPARE(spy.count(), 2); } void tst_qquicktextedit::undo_keypressevents_data() @@ -3578,13 +3605,13 @@ void tst_qquicktextedit::undo_keypressevents() QFETCH(QStringList, expectedString); QString componentStr = "import QtQuick 2.0\nTextEdit { focus: true }"; - QDeclarativeComponent textInputComponent(&engine); - textInputComponent.setData(componentStr.toLatin1(), QUrl()); - QQuickTextEdit *textInput = qobject_cast(textInputComponent.create()); - QVERIFY(textInput != 0); + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QQuickTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); QQuickCanvas canvas; - textInput->setParentItem(canvas.rootItem()); + textEdit->setParentItem(canvas.rootItem()); canvas.show(); canvas.requestActivateWindow(); QTest::qWaitForWindowShown(&canvas); @@ -3593,10 +3620,10 @@ void tst_qquicktextedit::undo_keypressevents() simulateKeys(&canvas, keys); for (int i = 0; i < expectedString.size(); ++i) { - QCOMPARE(textInput->text() , expectedString[i]); - simulateKeys(&canvas, QKeySequence::Undo); + QCOMPARE(textEdit->text() , expectedString[i]); + textEdit->undo(); } - QVERIFY(textInput->text().isEmpty()); + QVERIFY(textEdit->text().isEmpty()); } void tst_qquicktextedit::emptytags_QTBUG_22058() diff --git a/tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp index e37e81d13b..017ac53b3f 100644 --- a/tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/qtquick2/qquicktextinput/tst_qquicktextinput.cpp @@ -3975,6 +3975,10 @@ void tst_qquicktextinput::undo() QTest::qWaitForWindowShown(&canvas); QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QVERIFY(!textInput->canUndo()); + + QSignalSpy spy(textInput, SIGNAL(canUndoChanged())); + int i; // STEP 1: First build up an undo history by inserting or typing some strings... @@ -3994,14 +3998,19 @@ void tst_qquicktextinput::undo() QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); } + QCOMPARE(spy.count(), 1); + // STEP 2: Next call undo several times and see if we can restore to the previous state for (i = 0; i < expectedString.size() - 1; ++i) { QCOMPARE(textInput->text(), expectedString[i]); - simulateKeys(&canvas, QKeySequence::Undo); + QVERIFY(textInput->canUndo()); + textInput->undo(); } // STEP 3: Verify that we have undone everything QVERIFY(textInput->text().isEmpty()); + QVERIFY(!textInput->canUndo()); + QCOMPARE(spy.count(), 2); } void tst_qquicktextinput::redo_data() @@ -4052,6 +4061,11 @@ void tst_qquicktextinput::redo() QTest::qWaitForWindowShown(&canvas); QTRY_COMPARE(QGuiApplication::activeWindow(), &canvas); + QVERIFY(!textInput->canUndo()); + QVERIFY(!textInput->canRedo()); + + QSignalSpy spy(textInput, SIGNAL(canRedoChanged())); + int i; // inserts the diff strings at diff positions for (i = 0; i < insertString.size(); ++i) { @@ -4059,16 +4073,29 @@ void tst_qquicktextinput::redo() textInput->setCursorPosition(insertIndex[i]); for (int j = 0; j < insertString.at(i).length(); j++) QTest::keyClick(&canvas, insertString.at(i).at(j).toLatin1()); + QVERIFY(textInput->canUndo()); + QVERIFY(!textInput->canRedo()); } + QCOMPARE(spy.count(), 0); + // undo everything - while (!textInput->text().isEmpty()) - simulateKeys(&canvas, QKeySequence::Undo); + while (!textInput->text().isEmpty()) { + QVERIFY(textInput->canUndo()); + textInput->undo(); + QVERIFY(textInput->canRedo()); + } + + QCOMPARE(spy.count(), 1); for (i = 0; i < expectedString.size(); ++i) { - simulateKeys(&canvas, QKeySequence::Redo); + QVERIFY(textInput->canRedo()); + textInput->redo(); QCOMPARE(textInput->text() , expectedString[i]); + QVERIFY(textInput->canUndo()); } + QVERIFY(!textInput->canRedo()); + QCOMPARE(spy.count(), 2); } void tst_qquicktextinput::undo_keypressevents_data() @@ -4230,7 +4257,7 @@ void tst_qquicktextinput::undo_keypressevents() for (int i = 0; i < expectedString.size(); ++i) { QCOMPARE(textInput->text() , expectedString[i]); - simulateKeys(&canvas, QKeySequence::Undo); + textInput->undo(); } QVERIFY(textInput->text().isEmpty()); } -- cgit v1.2.3