aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarkko Koivikko <jarkko.koivikko@code-q.fi>2016-12-30 22:40:29 +0200
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2017-01-20 17:37:48 +0000
commit9bf05a32a155566e8f3ff30651b410b5b4822f71 (patch)
treedf5eacac2a14e4dd2f85b8c0dca217ce477d7f6a
parent839a0afec5c39c92ac7221e2c5b6a866d6848382 (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.cpp13
-rw-r--r--src/virtualkeyboard/settings.cpp19
-rw-r--r--src/virtualkeyboard/settings.h4
-rw-r--r--src/virtualkeyboard/virtualkeyboardsettings.cpp22
-rw-r--r--src/virtualkeyboard/virtualkeyboardsettings.h5
-rw-r--r--tests/auto/inputpanel/data/inputpanel/inputpanel.qml21
-rw-r--r--tests/auto/inputpanel/data/tst_inputpanel.qml46
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)
+ }
}
}