aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)
+ }
}
}