diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2016-12-30 22:40:29 +0200 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2017-01-20 17:37:48 +0000 |
commit | 9bf05a32a155566e8f3ff30651b410b5b4822f71 (patch) | |
tree | df5eacac2a14e4dd2f85b8c0dca217ce477d7f6a | |
parent | 839a0afec5c39c92ac7221e2c5b6a866d6848382 (diff) |
Add new feature "Auto commit word"
This feature, when enabled, automatically commits the remaining single
word in the word candidate list, when there was initially multiple
candidates.
This feature can be enabled from settings using
VirtualKeyboardSettings.wordSelectionList.autoCommitWord property.
[ChangeLog] Added support for automatic selection of the only remaining
word in the suggestion list.
Change-Id: Iecfafcaeb3ccb72e1d8e53b92c395b0d1dc84163
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/virtualkeyboard/selectionlistmodel.cpp | 13 | ||||
-rw-r--r-- | src/virtualkeyboard/settings.cpp | 19 | ||||
-rw-r--r-- | src/virtualkeyboard/settings.h | 4 | ||||
-rw-r--r-- | src/virtualkeyboard/virtualkeyboardsettings.cpp | 22 | ||||
-rw-r--r-- | src/virtualkeyboard/virtualkeyboardsettings.h | 5 | ||||
-rw-r--r-- | tests/auto/inputpanel/data/inputpanel/inputpanel.qml | 21 | ||||
-rw-r--r-- | tests/auto/inputpanel/data/tst_inputpanel.qml | 46 |
7 files changed, 106 insertions, 24 deletions
diff --git a/src/virtualkeyboard/selectionlistmodel.cpp b/src/virtualkeyboard/selectionlistmodel.cpp index 5d3ac375..4aa09927 100644 --- a/src/virtualkeyboard/selectionlistmodel.cpp +++ b/src/virtualkeyboard/selectionlistmodel.cpp @@ -29,6 +29,7 @@ #include "selectionlistmodel.h" #include "abstractinputmethod.h" +#include "settings.h" #include <QtCore/private/qabstractitemmodel_p.h> namespace QtVirtualKeyboard { @@ -40,7 +41,8 @@ public: QAbstractItemModelPrivate(), dataSource(0), type(SelectionListModel::WordCandidateList), - rowCount(0) + rowCount(0), + wclAutoCommitWord(false) { } @@ -48,6 +50,7 @@ public: AbstractInputMethod *dataSource; SelectionListModel::Type type; int rowCount; + bool wclAutoCommitWord; }; /*! @@ -258,6 +261,10 @@ void SelectionListModel::selectionListChanged(int type) d->rowCount = 0; endResetModel(); } + if (type == SelectionListModel::WordCandidateList) + d->wclAutoCommitWord = ((oldCount > 1 || (oldCount == 1 && d->wclAutoCommitWord)) && newCount == 1 && + Settings::instance()->wclAutoCommitWord() && + dataAt(0).toString().length() > 1); if (d->rowCount != oldCount) emit countChanged(); } @@ -269,8 +276,10 @@ void SelectionListModel::selectionListChanged(int type) void SelectionListModel::selectionListActiveItemChanged(int type, int index) { Q_D(SelectionListModel); - if (static_cast<Type>(type) == d->type) { + if (static_cast<Type>(type) == d->type && index < d->rowCount) { emit activeItemChanged(index); + if (index == 0 && d->wclAutoCommitWord) + selectItem(0); } } diff --git a/src/virtualkeyboard/settings.cpp b/src/virtualkeyboard/settings.cpp index 55faca8c..85a0f3a2 100644 --- a/src/virtualkeyboard/settings.cpp +++ b/src/virtualkeyboard/settings.cpp @@ -44,7 +44,8 @@ public: activeLocales(), layoutPath(), wclAutoHideDelay(5000), - wclAlwaysVisible(false) + wclAlwaysVisible(false), + wclAutoCommitWord(false) {} QString style; @@ -55,6 +56,7 @@ public: QUrl layoutPath; int wclAutoHideDelay; bool wclAlwaysVisible; + bool wclAutoCommitWord; }; static QScopedPointer<Settings> s_settingsInstance; @@ -196,4 +198,19 @@ void Settings::setWclAlwaysVisible(bool wclAlwaysVisible) } } +bool Settings::wclAutoCommitWord() const +{ + Q_D(const Settings); + return d->wclAutoCommitWord; +} + +void Settings::setWclAutoCommitWord(bool wclAutoCommitWord) +{ + Q_D(Settings); + if (d->wclAutoCommitWord != wclAutoCommitWord) { + d->wclAutoCommitWord = wclAutoCommitWord; + emit wclAutoCommitWordChanged(); + } +} + } // namespace QtVirtualKeyboard diff --git a/src/virtualkeyboard/settings.h b/src/virtualkeyboard/settings.h index 3bc65fbb..09e6bcb2 100644 --- a/src/virtualkeyboard/settings.h +++ b/src/virtualkeyboard/settings.h @@ -72,6 +72,9 @@ public: bool wclAlwaysVisible() const; void setWclAlwaysVisible(bool wclAlwaysVisible); + bool wclAutoCommitWord() const; + void setWclAutoCommitWord(bool wclAutoCommitWord); + signals: void styleChanged(); void styleNameChanged(); @@ -81,6 +84,7 @@ signals: void layoutPathChanged(); void wclAutoHideDelayChanged(); void wclAlwaysVisibleChanged(); + void wclAutoCommitWordChanged(); }; } // namespace QtVirtualKeyboard diff --git a/src/virtualkeyboard/virtualkeyboardsettings.cpp b/src/virtualkeyboard/virtualkeyboardsettings.cpp index bb832a2e..92908730 100644 --- a/src/virtualkeyboard/virtualkeyboardsettings.cpp +++ b/src/virtualkeyboard/virtualkeyboardsettings.cpp @@ -165,6 +165,7 @@ VirtualKeyboardSettings::VirtualKeyboardSettings(QQmlEngine *engine) : connect(settings, SIGNAL(layoutPathChanged()), SIGNAL(layoutPathChanged())); connect(settings, SIGNAL(wclAutoHideDelayChanged()), &d->wordCandidateListSettings, SIGNAL(autoHideDelayChanged())); connect(settings, SIGNAL(wclAlwaysVisibleChanged()), &d->wordCandidateListSettings, SIGNAL(alwaysVisibleChanged())); + connect(settings, SIGNAL(wclAutoCommitWordChanged()), &d->wordCandidateListSettings, SIGNAL(autoCommitWordChanged())); } /*! @@ -383,6 +384,17 @@ void VirtualKeyboardSettings::resetStyle() remain visible. The default value is \c false. + \row + \li autoCommitWord + \li This property enables the automatic commit feature that is activated + when the word candidate list is narrowed down to a single candidate. + + The automatic commit feature takes effect when the word candidate + list initially contains multiple words and is reduced to single word + after additional input. This word will be selected and committed + automatically without user interaction. + + This property is set to \c false by default. \endtable */ @@ -411,4 +423,14 @@ void WordCandidateListSettings::setAlwaysVisible(bool alwaysVisible) Settings::instance()->setWclAlwaysVisible(alwaysVisible); } +bool WordCandidateListSettings::autoCommitWord() const +{ + return Settings::instance()->wclAutoCommitWord(); +} + +void WordCandidateListSettings::setAutoCommitWord(bool autoCommitWord) +{ + Settings::instance()->setWclAutoCommitWord(autoCommitWord); +} + } // namespace QtVirtualKeyboard diff --git a/src/virtualkeyboard/virtualkeyboardsettings.h b/src/virtualkeyboard/virtualkeyboardsettings.h index 397746e0..da43d10e 100644 --- a/src/virtualkeyboard/virtualkeyboardsettings.h +++ b/src/virtualkeyboard/virtualkeyboardsettings.h @@ -90,6 +90,7 @@ class WordCandidateListSettings : public QObject Q_OBJECT Q_PROPERTY(int autoHideDelay READ autoHideDelay WRITE setAutoHideDelay NOTIFY autoHideDelayChanged) Q_PROPERTY(bool alwaysVisible READ alwaysVisible WRITE setAlwaysVisible NOTIFY alwaysVisibleChanged) + Q_PROPERTY(bool autoCommitWord READ autoCommitWord WRITE setAutoCommitWord NOTIFY autoCommitWordChanged) explicit WordCandidateListSettings(QObject *parent = 0); friend class VirtualKeyboardSettingsPrivate; @@ -101,9 +102,13 @@ public: bool alwaysVisible() const; void setAlwaysVisible(bool alwaysVisible); + bool autoCommitWord() const; + void setAutoCommitWord(bool autoCommitWord); + signals: void autoHideDelayChanged(); void alwaysVisibleChanged(); + void autoCommitWordChanged(); }; } diff --git a/tests/auto/inputpanel/data/inputpanel/inputpanel.qml b/tests/auto/inputpanel/data/inputpanel/inputpanel.qml index 034150be..58264edb 100644 --- a/tests/auto/inputpanel/data/inputpanel/inputpanel.qml +++ b/tests/auto/inputpanel/data/inputpanel/inputpanel.qml @@ -222,6 +222,10 @@ InputPanel { VirtualKeyboardSettings.wordCandidateList.alwaysVisible = wclAlwaysVisible } + function setWclAutoCommitWord(wclAutoCommitWord) { + VirtualKeyboardSettings.wordCandidateList.autoCommitWord = wclAutoCommitWord + } + function mapInputMode(inputModeName) { if (inputModeName === "Latin") return InputEngine.Latin @@ -479,25 +483,10 @@ InputPanel { VirtualKeyboardSettings.styleName = style } - function selectionListSearchSuggestion(suggestion, timeout) { + function selectionListSearchSuggestion(suggestion) { if (wordCandidateListVisibleHint === false) return false - if (timeout !== undefined && timeout > 0) { - // Note: Not using SignalSpy.wait() since it causes the test case to fail in case the signal is not emitted - wordCandidateListChangedSpy.clear() - var dt = new Date() - var startTime = dt.getTime() - while (wordCandidateListChangedSpy.count == 0) { - dt = new Date() - var elapsedTime = dt.getTime() - startTime - if (elapsedTime >= timeout) - break - var maxWait = Math.min(timeout - elapsedTime, 50) - testcase.wait(maxWait) - } - } - if (inputPanel.wordCandidateView.count === 0) return false; diff --git a/tests/auto/inputpanel/data/tst_inputpanel.qml b/tests/auto/inputpanel/data/tst_inputpanel.qml index ffe88cc8..756200d4 100644 --- a/tests/auto/inputpanel/data/tst_inputpanel.qml +++ b/tests/auto/inputpanel/data/tst_inputpanel.qml @@ -80,6 +80,7 @@ Rectangle { function prepareTest(data) { inputPanel.setWclAutoHideDelay(data !== undefined && data.hasOwnProperty("wclAutoHideDelay") ? data.wclAutoHideDelay : 5000) inputPanel.setWclAlwaysVisible(data !== undefined && data.hasOwnProperty("wclAlwaysVisible") && data.wclAlwaysVisible) + inputPanel.setWclAutoCommitWord(data !== undefined && data.hasOwnProperty("wclAutoCommitWord") && data.wclAutoCommitWord) container.forceActiveFocus() if (data !== undefined && data.hasOwnProperty("initText")) { textInput.text = data.initText @@ -181,7 +182,8 @@ Rectangle { property var availableLocales: VirtualKeyboardSettings.availableLocales; \ property var activeLocales: VirtualKeyboardSettings.activeLocales; \ property var wclAutoHideDelay: VirtualKeyboardSettings.wordCandidateList.autoHideDelay; \ - property var wclAlwaysVisible: VirtualKeyboardSettings.wordCandidateList.alwaysVisible; }" }, + property var wclAlwaysVisible: VirtualKeyboardSettings.wordCandidateList.alwaysVisible; \ + property var wclAutoCommitWord: VirtualKeyboardSettings.wordCandidateList.autoCommitWord }" }, ] } @@ -728,10 +730,10 @@ Rectangle { if (inputPanel.wordCandidateListVisibleHint) { if (data.hasOwnProperty("expectedSuggestion")) { - verify(inputPanel.selectionListSearchSuggestion(data.expectedSuggestion, 1000), "The expected spell correction suggestion \"%1\" was not found".arg(data.expectedSuggestion)) + tryVerify(function() {return inputPanel.selectionListSearchSuggestion(data.expectedSuggestion)}, 1000, "The expected spell correction suggestion \"%1\" was not found".arg(data.expectedSuggestion)) verify(inputPanel.selectionListSelectCurrentItem(), "Word candidate not selected") } else if (data.hasOwnProperty("unexpectedSuggestion")) { - verify(!inputPanel.selectionListSearchSuggestion(data.unexpectedSuggestion, 1000), "An unexpected spell correction suggestion \"%1\" was found".arg(data.unexpectedSuggestion)) + tryVerify(function() {return !inputPanel.selectionListSearchSuggestion(data.unexpectedSuggestion)}, 1000, "An unexpected spell correction suggestion \"%1\" was found".arg(data.unexpectedSuggestion)) inputPanel.selectionListSelectCurrentItem() } else { Qt.inputMethod.commit() @@ -1181,10 +1183,10 @@ Rectangle { if (inputPanel.wordCandidateListVisibleHint) { if (data.hasOwnProperty("expectedSuggestion")) { - verify(inputPanel.selectionListSearchSuggestion(data.expectedSuggestion, 1000), "The expected spell correction suggestion \"%1\" was not found".arg(data.expectedSuggestion)) + tryVerify(function() {return inputPanel.selectionListSearchSuggestion(data.expectedSuggestion)}, 1000, "The expected spell correction suggestion \"%1\" was not found".arg(data.expectedSuggestion)) verify(inputPanel.selectionListSelectCurrentItem(), "Word candidate not selected") } else if (data.hasOwnProperty("unexpectedSuggestion")) { - verify(!inputPanel.selectionListSearchSuggestion(data.unexpectedSuggestion, 1000), "An unexpected spell correction suggestion \"%1\" was found".arg(data.unexpectedSuggestion)) + tryVerify(function() {return !inputPanel.selectionListSearchSuggestion(data.unexpectedSuggestion)}, 1000, "An unexpected spell correction suggestion \"%1\" was found".arg(data.unexpectedSuggestion)) inputPanel.selectionListSelectCurrentItem() } else { Qt.inputMethod.commit() @@ -1612,5 +1614,39 @@ Rectangle { waitForRendering(inputPanel) compare(inputPanel.wordCandidateView.visibleCondition, data.wclAlwaysVisible) } + + function test_wclAutoCommitWordSetting_data() { + return [ + { wclAutoCommitWord: true }, + { wclAutoCommitWord: false }, + ] + } + + function test_wclAutoCommitWordSetting(data) { + prepareTest(data) + + if (!inputPanel.wordCandidateListVisibleHint) + skip("Prediction/spell correction not enabled") + + for (var len = 1; len <= 5; ++len) { + inputPanel.wordCandidateListChangedSpy.clear() + inputPanel.virtualKeyClick("z") + waitForRendering(inputPanel) + if (len >= 3) { + if (data.wclAutoCommitWord) + tryVerify(function() { return inputPanel.wordCandidateView.model.count === 0 }, 500) + else + wait(500) + if (inputPanel.wordCandidateView.model.count <= 1) + break + } + } + waitForRendering(inputPanel) + + if (data.wclAutoCommitWord) + compare(inputPanel.wordCandidateView.model.count, 0) + else + verify(inputPanel.wordCandidateView.model.count >= 1) + } } } |