summaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-03-21 14:10:39 +0100
committerGunnar Sletta <gunnar.sletta@digia.com>2013-03-21 14:58:18 +0100
commit3bab79ccafe79105c1c3d7dc6fe1e87d80628bd9 (patch)
tree0232adc09f978461bcf82fa3ee7389a80bb67981 /src/imports
parent9fac7c24d7edc2347babda102a20fd9019b1c7a5 (diff)
Better structure for virtual keyboard
Diffstat (limited to 'src/imports')
-rw-r--r--src/imports/imports.pro2
-rw-r--r--src/imports/virtualkeyboard/Keyboard.qml242
-rw-r--r--src/imports/virtualkeyboard/components/AlternativeKeys.qml122
-rw-r--r--src/imports/virtualkeyboard/components/AutoScroller.qml115
-rw-r--r--src/imports/virtualkeyboard/components/BackspaceKey.qml54
-rw-r--r--src/imports/virtualkeyboard/components/BaseKey.qml77
-rw-r--r--src/imports/virtualkeyboard/components/ChangeLanguageKey.qml52
-rw-r--r--src/imports/virtualkeyboard/components/CharacterPreviewBubble.qml87
-rw-r--r--src/imports/virtualkeyboard/components/EnterKey.qml74
-rw-r--r--src/imports/virtualkeyboard/components/HideKeyboardKey.qml53
-rw-r--r--src/imports/virtualkeyboard/components/Icon.qml64
-rw-r--r--src/imports/virtualkeyboard/components/InputEngine.qml179
-rw-r--r--src/imports/virtualkeyboard/components/Key.qml64
-rw-r--r--src/imports/virtualkeyboard/components/NumberKey.qml47
-rw-r--r--src/imports/virtualkeyboard/components/PressedKey.qml66
-rw-r--r--src/imports/virtualkeyboard/components/ShiftKey.qml73
-rw-r--r--src/imports/virtualkeyboard/components/SpaceKey.qml63
-rw-r--r--src/imports/virtualkeyboard/components/SymbolModeKey.qml50
-rw-r--r--src/imports/virtualkeyboard/images/arrow.pngbin0 -> 264 bytes
-rw-r--r--src/imports/virtualkeyboard/images/backspace.pngbin0 -> 515 bytes
-rw-r--r--src/imports/virtualkeyboard/images/enter.pngbin0 -> 584 bytes
-rw-r--r--src/imports/virtualkeyboard/images/hidekeyboard.pngbin0 -> 251 bytes
-rw-r--r--src/imports/virtualkeyboard/images/keypad.pngbin0 -> 14899 bytes
-rw-r--r--src/imports/virtualkeyboard/images/shift.pngbin0 -> 310 bytes
-rw-r--r--src/imports/virtualkeyboard/images/space.pngbin0 -> 240 bytes
-rw-r--r--src/imports/virtualkeyboard/layouts/ar_AR.qml85
-rw-r--r--src/imports/virtualkeyboard/layouts/en_GB.qml184
-rw-r--r--src/imports/virtualkeyboard/layouts/fi_FI.qml203
-rw-r--r--src/imports/virtualkeyboard/layouts/numbers.qml103
-rw-r--r--src/imports/virtualkeyboard/layouts/symbols.qml186
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.cpp309
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.h149
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.cpp162
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.h89
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.json3
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.pro21
-rw-r--r--src/imports/virtualkeyboard/platforminputcontext/plugin.cpp83
-rw-r--r--src/imports/virtualkeyboard/qmlmodule.pro37
-rw-r--r--src/imports/virtualkeyboard/virtualkeyboard.pro2
-rw-r--r--src/imports/virtualkeyboard/virtualkeyboard.qml123
40 files changed, 3222 insertions, 1 deletions
diff --git a/src/imports/imports.pro b/src/imports/imports.pro
index 8a13bdd..98be502 100644
--- a/src/imports/imports.pro
+++ b/src/imports/imports.pro
@@ -1,2 +1,2 @@
TEMPLATE = subdirs
-SUBDIRS = utils nativemedia
+SUBDIRS = utils nativemedia virtualkeyboard
diff --git a/src/imports/virtualkeyboard/Keyboard.qml b/src/imports/virtualkeyboard/Keyboard.qml
new file mode 100644
index 0000000..c626dbc
--- /dev/null
+++ b/src/imports/virtualkeyboard/Keyboard.qml
@@ -0,0 +1,242 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import "components"
+import Boot2Qt.InputContext 1.0
+import Qt.labs.folderlistmodel 2.0
+
+Image {
+ id: keyboard
+
+ property var activeKey: 0
+ property int localeIndex: 1
+ property string locale: layoutsModel.count > 0 ? layoutsModel.get(localeIndex, "fileBaseName") : "en_GB"
+ property bool active: Qt.inputMethod.visible
+ property bool uppercased: uppercaseOnly ? true : (lowercaseOnly ? false : InputContext.shift || InputContext.capsLock)
+ property bool uppercaseOnly: InputContext.inputMethodHints & Qt.ImhUppercaseOnly
+ property bool lowercaseOnly: InputContext.inputMethodHints & Qt.ImhLowercaseOnly
+ property bool numberMode: InputContext.inputMethodHints & (Qt.ImhDialableCharactersOnly | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly)
+ property bool symbolMode
+
+ z: 1
+ source: "images/keypad.png"
+ fillMode: Image.Stretch
+ width: parent.width
+ height: keyboardLayout.height+10
+ y: Qt.inputMethod.visible ? parent.height - height : parent.height
+ visible: Qt.inputMethod.visible || Qt.inputMethod.animating;
+
+ onLocaleChanged: InputContext.setLocale(locale)
+ onUppercasedChanged: if (Qt.inputMethod.visible) InputContext.handleUppercasing(uppercased)
+
+ function changeInputLanguage() {
+ localeIndex = (localeIndex+1) % layoutsModel.count
+ }
+
+ Behavior on y {
+ SequentialAnimation {
+ ScriptAction {
+ script: {
+ if (Qt.inputMethod.visible) {
+ keyboard.symbolMode = false
+ InputContext.handleUppercasing(uppercased)
+ }
+ InputContext.setAnimating(true)
+ }
+ }
+ NumberAnimation { duration: 300; easing.type: Easing.InOutQuad }
+ ScriptAction { script: InputContext.setAnimating(false) }
+ }
+ }
+ AutoScroller {}
+ FolderListModel {
+ id: layoutsModel
+ folder: "layouts"
+ nameFilters: ["*_*.qml"]
+ }
+ PressedKey {}
+ InputEngine { id: inputEngine }
+ AlternativeKeys { id: alternativeKeys }
+ Timer { id: releaseInaccuracyTimer; interval: 500 }
+ CharacterPreviewBubble { enabled: keyboardMouse.pressed && !alternativeKeys.active }
+ Binding {
+ target: InputContext
+ property: "keyboardRectangle"
+ value: Qt.rect(keyboard.x, keyboard.y, keyboard.width, keyboard.height)
+ }
+ Column {
+ id: keyboardLayout
+ anchors.centerIn: parent
+ Loader {
+ active: false
+ visible: keyboard.symbolMode && !keyboard.numberMode
+ source: "layouts/symbols.qml"
+ onVisibleChanged: if (visible) active = true
+ Component.onCompleted: if (visible) active = true
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ Loader {
+ active: false
+ visible: keyboard.numberMode
+ source: "layouts/numbers.qml"
+ onVisibleChanged: if (visible) active = true
+ Component.onCompleted: if (visible) active = true
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+ Loader {
+ visible: !keyboard.symbolMode && !keyboard.numberMode
+ source: "layouts/" + keyboard.locale +".qml"
+ }
+ }
+ MouseArea {
+ id: keyboardMouse
+
+ property var initialKey
+ property var previousKey
+ property bool dragSymbolMode
+ property real pressAndHoldMargin: 6
+ property real releaseMargin: 18
+
+ anchors.fill: keyboardLayout
+
+ function press(key) {
+ if (key && key.enabled) {
+ if (key.key != Qt.Key_unknown || key.text.length > 0)
+ inputEngine.sendKeyPress(key.key, keyboard.uppercased ? key.text.toUpperCase() : key.text, keyboard.uppercased ? Qt.ShiftModifier : 0, key.repeat)
+ }
+ }
+ function release(key) {
+ if (key && key.enabled) {
+ if (key.key != Qt.Key_unknown || key.text.length > 0)
+ inputEngine.sendKeyRelease(key.key, keyboard.uppercased ? key.text.toUpperCase() : key.text, keyboard.uppercased ? Qt.ShiftModifier : 0)
+ key.clicked()
+ } else if (initialKey !== undefined) // rollback
+ InputContext.preeditText = InputContext.preeditText.substr(0, InputContext.preeditText.length-1)
+ }
+ function click(key) {
+ if (key && key.enabled) {
+ if (key.key != Qt.Key_unknown || key.text.length > 0)
+ inputEngine.sendKeyClick(key.key, keyboard.uppercased ? key.text.toUpperCase() : key.text, keyboard.uppercased ? Qt.ShiftModifier : 0, key.repeat)
+ key.clicked()
+ }
+ }
+ function setActiveKey(activeKey) {
+ if (keyboard.activeKey)
+ keyboard.activeKey.active = false
+ keyboard.activeKey = activeKey
+ if (keyboard.activeKey)
+ keyboard.activeKey.active = true
+ }
+ function keyOnMouse(mx, my) {
+ var parentItem = keyboardLayout
+ var child = parentItem.childAt(mx, my)
+ while (child != null) {
+ var position = parentItem.mapToItem(child, mx, my)
+ mx = position.x; my = position.y
+ parentItem = child
+ child = parentItem.childAt(mx, my)
+ if (child && child.key != undefined)
+ return child
+ }
+ return undefined
+ }
+ function hitInitialKey(mouseX, mouseY, margin) {
+ if (!initialKey)
+ return false
+ var position = initialKey.mapFromItem(keyboardMouse, mouseX, mouseY)
+ return (position.x > -margin
+ && position.y > -margin
+ && position.x < initialKey.width + margin
+ && position.y < initialKey.height + margin)
+ }
+ function reset() {
+ alternativeKeys.close()
+ previousKey = keyboard.activeKey
+ setActiveKey(0)
+ if (dragSymbolMode)
+ keyboard.symbolMode = false
+ dragSymbolMode = false
+ }
+
+ onPressed: {
+ releaseInaccuracyTimer.start()
+ initialKey = keyOnMouse(mouseX, mouseY)
+ setActiveKey(initialKey ? initialKey : 0)
+ press(initialKey)
+ }
+ onPositionChanged: {
+ if (alternativeKeys.active) {
+ alternativeKeys.move(mouseX)
+ } else {
+ var key = keyOnMouse(mouseX, mouseY)
+ if (key !== keyboard.activeKey) {
+ setActiveKey(key ? key : 0)
+ }
+ }
+ }
+ onPressAndHold: {
+ var key = hitInitialKey(mouseX, mouseY, pressAndHoldMargin) ? initialKey : keyboard.activeKey
+ if (key != undefined && key == initialKey) {
+ alternativeKeys.open(key)
+ if (!alternativeKeys.active && key.key == Qt.Key_Context1) {
+ dragSymbolMode = true
+ keyboard.symbolMode = true
+ }
+ }
+ }
+ onClicked: {}
+ onReleased: {
+ var key = keyOnMouse(mouseX, mouseY)
+ if (alternativeKeys.active) {
+ alternativeKeys.move(mouseX)
+ alternativeKeys.clicked()
+ } else if (dragSymbolMode) {
+ var key = keyOnMouse(mouseX, mouseY)
+ release(initialKey)
+ click(key)
+ } else {
+ release(releaseInaccuracyTimer.running && hitInitialKey(mouseX, mouseY, releaseMargin) ? initialKey : keyOnMouse(mouseX, mouseY))
+ }
+ reset()
+ }
+ onCanceled: reset()
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/AlternativeKeys.qml b/src/imports/virtualkeyboard/components/AlternativeKeys.qml
new file mode 100644
index 0000000..2465fa5
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/AlternativeKeys.qml
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ property bool active: activeKey != null
+ property string keys
+ property int primaryKeyCode
+ property var activeKey: null
+ property real keyWidth: 36
+ property real keyMargin: 5
+
+ z: 1
+ radius: 4
+ height: 60
+ parent: keyboard
+ visible: active
+ width: keyRow.width
+
+ signal clicked
+
+ onClicked: {
+ if (active)
+ inputEngine.sendKeyRelease(primaryKeyCode,
+ keyboard.uppercased ? activeKey.text.toUpperCase() : activeKey.text,
+ keyboard.uppercased ? Qt.ShiftModifier : 0)
+ }
+
+ function open(key) {
+ keys = key.alternativeKeys
+ primaryKeyCode = key.key
+ if (keys.length > 0) {
+ var position = keyboard.mapFromItem(key, 0, -23)
+ var primaryKeyIndex = 0
+ while (primaryKeyIndex < keys.length) {
+ if (keys.charAt(primaryKeyIndex) == key.text) {
+ break
+ }
+ primaryKeyIndex++
+ }
+ if (primaryKeyIndex == keys.length) {
+ console.log("AlternativeKeys: active key \"" + key.text + "\" not found in alternativeKeys \"" + keys + ".\"")
+ primaryKeyIndex = 0
+ }
+ x = Math.min(Math.max(keyMargin, position.x-primaryKeyIndex*keyWidth+(key.width-keyWidth)/2-1), keyboard.width-width-keyMargin)
+ y = Math.min(position.y-height+keyMargin, keyboard.height-height-keyMargin)
+ activeKey = keyRow.children[primaryKeyIndex]
+ arrow.x = mapFromItem(key, key.width/2, 0).x - arrow.width/2
+ }
+ }
+ function close() {
+ activeKey = null
+ }
+ function move(mouseX) {
+ var oldKey = activeKey
+ activeKey = keyRow.children[Math.max(0, Math.min(keys.length-1, Math.floor((mouseX-keyRow.x-x)/keyWidth)))]
+ }
+
+ Image {
+ id: arrow
+ source: "../images/arrow.png"
+ anchors.top: parent.bottom
+ }
+ Row {
+ id: keyRow
+ anchors.centerIn: parent
+ Repeater {
+ model: keys.length
+ Text {
+ id: key
+ color: activeKey === key ? "#f04b67" : "black"
+ width: keyWidth
+ height: keyWidth + 5
+ text: keys.charAt(index)
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ font {
+ pixelSize: 40
+ capitalization: keyboard.uppercased ? Font.AllUppercase : Font.MixedCase
+ }
+ }
+ }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/AutoScroller.qml b/src/imports/virtualkeyboard/components/AutoScroller.qml
new file mode 100644
index 0000000..bbdc5da
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/AutoScroller.qml
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+
+Item {
+ property var innerFlickable
+ property var outerFlickable
+ property var inputItem: Qt.inputMethod.inputItem
+
+ onInputItemChanged: {
+ if (inputItem) {
+ var parent_ = inputItem.parent
+ while (parent_) {
+ if (parent_.maximumFlickVelocity) {
+ if (innerFlickable) {
+ outerFlickable = parent_
+ break
+ } else {
+ innerFlickable = parent_
+ }
+ }
+ parent_ = parent_.parent
+ }
+ delayedLoading.triggered()
+ }
+ }
+
+ function ensureVisible(flickable) {
+ if (Qt.inputMethod.visible && inputItem && flickable && flickable.visible && flickable.interactive) {
+
+ var verticallyFlickable = (flickable.flickableDirection == Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection == Flickable.VerticalFlick
+ || (flickable.flickableDirection == Flickable.AutoFlickDirection && flickable.contentHeight > flickable.height))
+ var horizontallyFlickable = (flickable.flickableDirection == Flickable.HorizontalAndVerticalFlick || flickable.flickableDirection == Flickable.HorizontalFlick
+ || (flickable.flickableDirection == Flickable.AutoFlickDirection && flickable.contentWidth > flickable.width))
+
+ if (!verticallyFlickable && !horizontallyFlickable)
+ return
+
+ var cursorRectangle = flickable.contentItem.mapFromItem(inputItem, inputItem.cursorRectangle.x, inputItem.cursorRectangle.y)
+
+ var oldContentY = flickable.contentY
+ if (verticallyFlickable) {
+ var scrollMarginVertical = (flickable && flickable.scrollMarginVertical) ? flickable.scrollMarginVertical : 10
+ if (flickable.contentY >= cursorRectangle.y - scrollMarginVertical)
+ flickable.contentY = Math.max(0, cursorRectangle.y - scrollMarginVertical)
+ else if (flickable.contentY + flickable.height <= cursorRectangle.y + inputItem.cursorRectangle.height + scrollMarginVertical)
+ flickable.contentY = Math.min(flickable.contentHeight - flickable.height, cursorRectangle.y + inputItem.cursorRectangle.height - flickable.height + scrollMarginVertical)
+ }
+ if (horizontallyFlickable) {
+ var scrollMarginHorizontal = (flickable && flickable.scrollMarginHorizontal) ? flickable.scrollMarginHorizontal : 10
+ if (flickable.contentX >= cursorRectangle.x - scrollMarginHorizontal)
+ flickable.contentX = Math.max(0, cursorRectangle.x - scrollMarginHorizontal)
+ else if (flickable.contentX + flickable.width <= cursorRectangle.x + inputItem.cursorRectangle.width + scrollMarginHorizontal)
+ flickable.contentX = Math.min(flickable.contentWidth - flickable.width, cursorRectangle.x + inputItem.cursorRectangle.width - flickable.width + scrollMarginHorizontal)
+ }
+ }
+ }
+ Timer {
+ id: delayedLoading
+ interval: 10
+ onTriggered: {
+ ensureVisible(innerFlickable)
+ ensureVisible(outerFlickable)
+ }
+ }
+ Connections {
+ ignoreUnknownSignals: true
+ target: Qt.inputMethod.inputItem && Qt.inputMethod.animating ? Qt.inputMethod : null
+ onKeyboardRectangleChanged: delayedLoading.triggered()
+ }
+ Connections {
+ ignoreUnknownSignals: true
+ target: Qt.inputMethod.inputItem && Qt.inputMethod.inputItem.activeFocus ? Qt.inputMethod.inputItem : null
+ onCursorRectangleChanged: delayedLoading.triggered()
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/BackspaceKey.qml b/src/imports/virtualkeyboard/components/BackspaceKey.qml
new file mode 100644
index 0000000..760372c
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/BackspaceKey.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+BaseKey {
+ key: Qt.Key_Backspace
+ width: 47
+ repeat: true
+ functionKey: true
+ Icon {
+ invert: pressed
+ opacity: parent.enabled ? 1.0 : 0.6
+ source: "../images/backspace.png"
+ anchors { centerIn: parent; verticalCenterOffset: 1 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/BaseKey.qml b/src/imports/virtualkeyboard/components/BaseKey.qml
new file mode 100644
index 0000000..3f982c6
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/BaseKey.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Item {
+ id: keyItem
+
+ property string text
+ property string displayText: text
+ property string alternativeKeys
+ property int key: Qt.Key_unknown
+ property bool active
+ property bool repeat
+ property bool highlighted
+ property bool functionKey
+ property bool showPreview: !functionKey
+ property bool enabled: true
+ property bool pressed: enabled && active
+ property color textColor: pressed ? "#EEEEEE" : (enabled ? "black" : "black")
+
+ width: 31
+ height: 55
+ z: pressed ? 1 : 0
+ y: pressed ? 1 : 0
+ scale: pressed ? (width > 40 ? 0.98 : 0.96) : 1.0
+
+ signal clicked
+
+ Rectangle {
+ id: background
+
+ z: -1
+ radius: 4
+ visible: !pressed
+ opacity: highlighted ? 0.6 : 0.2
+ color: keyItem.enabled ? "#EEEEEE" : "black"
+ anchors { fill: parent; topMargin: 3; bottomMargin: 3; leftMargin: 2; rightMargin: 2 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/ChangeLanguageKey.qml b/src/imports/virtualkeyboard/components/ChangeLanguageKey.qml
new file mode 100644
index 0000000..d6c89d3
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/ChangeLanguageKey.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+BaseKey {
+ functionKey: true
+ Text {
+ text: keyboard.locale.split("_")[0]
+ color: textColor
+ font { pixelSize: 16; capitalization: Font.AllUppercase }
+ anchors { centerIn: parent; verticalCenterOffset: parent.textPixelSize > 35 ? 2 : 0 }
+ }
+ onClicked: keyboard.changeInputLanguage()
+}
diff --git a/src/imports/virtualkeyboard/components/CharacterPreviewBubble.qml b/src/imports/virtualkeyboard/components/CharacterPreviewBubble.qml
new file mode 100644
index 0000000..db0abdd
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/CharacterPreviewBubble.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ property bool enabled
+ property bool sideBackground
+ property real sideMargin: 46
+ property real sideBackgroundOffset: 10
+ property var activeKey: keyboard.activeKey
+
+ z: 1
+ radius: 4
+ height: 60
+ width: Math.max(previewCharacter.width+20, 55)
+ visible: false
+ parent: keyboard
+ opacity: (activeKey && enabled) ? 1.0 : 0.0
+
+ onActiveKeyChanged: {
+ visible = activeKey && activeKey.showPreview
+ if (activeKey) {
+ previewCharacter.text = activeKey.text
+ var position = keyboard.mapFromItem(activeKey, activeKey.width/2, 10)
+ var onLeft = position.x < sideMargin
+ var onRight = position.x > keyboard.width - sideMargin
+ x = position.x - width/2
+ + (onLeft ? sideBackgroundOffset : 0)
+ - (onRight ? sideBackgroundOffset : 0)
+ y = position.y - height - 25
+ arrow.anchors.horizontalCenterOffset = onLeft ? -sideBackgroundOffset
+ : (onRight ? sideBackgroundOffset : 0)
+ }
+ }
+ Image {
+ id: arrow
+ source: "../images/arrow.png"
+ anchors { top: parent.bottom; horizontalCenter: parent.horizontalCenter }
+ }
+ Text {
+ id: previewCharacter
+ color: "black"
+ font {
+ pixelSize: previewCharacter.text.length == 1 ? 50 : 40
+ capitalization: keyboard.uppercased ? Font.AllUppercase : Font.MixedCase
+ }
+ anchors { centerIn: parent; verticalCenterOffset: -2 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/EnterKey.qml b/src/imports/virtualkeyboard/components/EnterKey.qml
new file mode 100644
index 0000000..d321e34
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/EnterKey.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+BaseKey {
+
+ property string enterKeyText: Qt.inputMethod.inputItem ? Qt.inputMethod.inputItem.enterKeyText : ""
+
+ width: 78
+ text: "\n"
+ key: Qt.Key_Return
+ functionKey: true
+ highlighted: enabled && enterKeyText.length > 0
+ enabled: Qt.inputMethod.inputItem ? Qt.inputMethod.inputItem.enterKeyEnabled : true
+
+ Icon {
+ invert: pressed
+ visible: enterKeyText.length == 0
+ source: "../images/enter.png"
+ anchors { centerIn: parent; verticalCenterOffset: 2 }
+ }
+ Text {
+ visible: enterKeyText.length > 0
+ text: enterKeyText
+ fontSizeMode: Text.HorizontalFit
+ color: textColor
+ font { pixelSize: 20; capitalization: Font.AllUppercase }
+ horizontalAlignment: Text.AlignHCenter
+ anchors {
+ left: parent.left
+ right: parent.right
+ verticalCenter: parent.verticalCenter
+ margins: 5
+ }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/HideKeyboardKey.qml b/src/imports/virtualkeyboard/components/HideKeyboardKey.qml
new file mode 100644
index 0000000..411307a
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/HideKeyboardKey.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+BaseKey {
+ functionKey: true
+ onClicked: {
+ Qt.inputMethod.hide();
+ }
+ Icon {
+ invert: pressed
+ source: "../images/hidekeyboard.png"
+ anchors { centerIn: parent; verticalCenterOffset: 4 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/Icon.qml b/src/imports/virtualkeyboard/components/Icon.qml
new file mode 100644
index 0000000..089090d
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/Icon.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+ShaderEffect {
+ property bool invert
+ property alias source: image.source
+ property variant texture: Image { id: image }
+
+ width: image.implicitWidth
+ height: image.implicitHeight
+
+ fragmentShader: "
+ uniform bool invert;
+ uniform lowp float qt_Opacity;
+ uniform lowp sampler2D texture;
+ varying highp vec2 qt_TexCoord0;
+ void main() {
+ lowp vec4 color = texture2D(texture, qt_TexCoord0) * qt_Opacity;
+ if (invert)
+ gl_FragColor = vec4(vec3(1.0) - color.rgb, 1.0) * color.a;
+ else
+ gl_FragColor = color;
+ }
+ "
+}
diff --git a/src/imports/virtualkeyboard/components/InputEngine.qml b/src/imports/virtualkeyboard/components/InputEngine.qml
new file mode 100644
index 0000000..b47f9ed
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/InputEngine.qml
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+
+Item {
+ property int lastKey
+ property string sentenceEndingCharacters: ".;!?"
+
+ Timer {
+ // key repeater
+ repeat: true
+ interval: 600
+ running: keyboard.activeKey !== 0 && keyboard.activeKey.repeat
+
+ onRunningChanged: if (!running) interval = 600
+ onTriggered: {
+ interval = 150
+ keyboardMouse.click(keyboard.activeKey)
+ }
+ }
+ Timer {
+ id: multiTapTimer
+
+ property int index
+
+ interval: 1200
+ onTriggered: {
+ index = 0
+ InputContext.commit(InputContext.preeditText)
+ }
+ }
+ Item {
+ id: shiftHandling
+
+ property bool autoCapitalization: !(InputContext.inputMethodHints & (Qt.ImhNoAutoUppercase | Qt.ImhUppercaseOnly
+ | Qt.ImhLowercaseOnly | Qt.ImhEmailCharactersOnly
+ | Qt.ImhUrlCharactersOnly | Qt.ImhDialableCharactersOnly
+ | Qt.ImhFormattedNumbersOnly | Qt.ImhDigitsOnly))
+ function reset() {
+ if (Qt.inputMethod.inputItem) {
+ var preferUpperCase = InputContext.inputMethodHints & Qt.ImhPreferUppercase
+ InputContext.shift = preferUpperCase
+ InputContext.capsLock = preferUpperCase
+ }
+ }
+ function autoCapitalize() {
+ if (!Qt.inputMethod.inputItem || !autoCapitalization || InputContext.capsLock)
+ return
+ var preferLowerCase = InputContext.inputMethodHints & Qt.ImhPreferLowercase
+ if (InputContext.cursorPosition == 0)
+ InputContext.shift = !preferLowerCase
+ else {
+ var text = (InputContext.surroundingText + InputContext.preeditText).substr(0, InputContext.cursorPosition).trim()
+ if (text.length == 0)
+ InputContext.shift = !preferLowerCase
+ else if (text.length > 1 && sentenceEndingCharacters.indexOf(text.charAt(text.length-1)) >= 0)
+ InputContext.shift = !preferLowerCase
+ else
+ InputContext.shift = false
+ }
+ }
+ Timer {
+ id: delayedLoading
+ interval: 10
+ onTriggered: {
+ shiftHandling.reset()
+ shiftHandling.autoCapitalize()
+ }
+ }
+ Connections {
+ target: InputContext
+ onInputMethodHintsChanged: delayedLoading.restart()
+ onFocusEditorChanged: {
+ keyboard.symbolMode = false
+ delayedLoading.restart()
+ }
+ onPreeditTextChanged: {
+ if (shiftHandling.autoCapitalization && !InputContext.capsLock)
+ InputContext.shift = false
+ }
+ onCursorPositionChanged: shiftHandling.autoCapitalize()
+ }
+ }
+ function sendKeyClick(key, text, modifiers) {
+ sendKeyPress(key, text, modifiers)
+ sendKeyRelease(key, text, modifiers)
+ }
+ function sendKeyPress(key, text, modifiers) {
+ lastKey = key
+ }
+ function sendKeyRelease(key, text, modifiers) {
+ var accept = false
+ switch (key) {
+ case Qt.Key_Enter:
+ case Qt.Key_Return:
+ break
+ case Qt.Key_Space:
+ InputContext.commit(" ")
+ var text = InputContext.surroundingText.trim()
+ if (sentenceEndingCharacters.indexOf(text.charAt(text.length-1)) >= 0)
+ keyboard.symbolMode = false
+ accept = true
+ break
+ case Qt.Key_Tab:
+ case Qt.Key_Backspace:
+ if (InputContext.cursorPosition > 0) {
+ if (InputContext.selectedText.length == 0)
+ InputContext.commit("", -1, 1)
+ else
+ InputContext.commit("")
+ }
+ break
+ default:
+ if (key === Qt.Key_Asterisk && InputContext.inputMethodHints & Qt.ImhDialableCharactersOnly) {
+ if (key != lastKey) {
+ multiTapTimer.index = 0
+ InputContext.commit(InputContext.preeditText)
+ multiTapTimer.running = false
+ }
+ multiTapTimer.index = multiTapTimer.running ? (multiTapTimer.index+1) % text.length : 0
+ var character = text.charAt(multiTapTimer.index)
+ if (multiTapTimer.running)
+ InputContext.preeditText = InputContext.preeditText.substr(0, InputContext.preeditText.length - 1) + character
+ else
+ InputContext.preeditText += character
+ multiTapTimer.restart()
+ } else if (multiTapTimer.running) {
+ InputContext.commit(InputContext.preeditText)
+ multiTapTimer.stop()
+ }
+ if (!multiTapTimer.running)
+ InputContext.commit(text)
+ accept = true
+ break
+ }
+ if (!accept) {
+ InputContext.sendKeyClick(key, text, modifiers)
+ }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/Key.qml b/src/imports/virtualkeyboard/components/Key.qml
new file mode 100644
index 0000000..b2d08b3
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/Key.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+
+BaseKey {
+ id: keyItem
+
+ property bool uppercased
+ property int textPixelSize: 24
+
+ Component.onCompleted: InputContext.registerCharacterKey(keyItem)
+ Component.onDestruction: InputContext.unregisterCharacterKey(keyItem)
+
+ Text {
+ id: text
+
+ text: displayText
+ color: textColor
+ anchors { centerIn: parent; verticalCenterOffset: pressed ? 1 : 0 }
+ font {
+ pixelSize: textPixelSize
+ capitalization: uppercased ? Font.AllUppercase : Font.MixedCase
+ }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/NumberKey.qml b/src/imports/virtualkeyboard/components/NumberKey.qml
new file mode 100644
index 0000000..f521f7f
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/NumberKey.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Key {
+ width: 77
+ showPreview: false
+ textPixelSize: 38
+}
diff --git a/src/imports/virtualkeyboard/components/PressedKey.qml b/src/imports/virtualkeyboard/components/PressedKey.qml
new file mode 100644
index 0000000..1f2925d
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/PressedKey.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Item {
+ property bool active
+ property var activeKey: keyboard.activeKey
+
+ visible: active
+
+ onActiveKeyChanged: {
+ var activeKey = keyboard.activeKey
+ active = activeKey !== 0 && activeKey.enabled
+ if (active) {
+ var position = parent.mapFromItem(activeKey, 0, 0)
+ width = activeKey.width
+ height = activeKey.height
+ x = position.x
+ y = position.y + 1
+ }
+ }
+
+ Rectangle {
+ radius: 6
+ color: "#f13c57"
+ anchors { fill: parent; topMargin: 3; bottomMargin: 3; leftMargin: 2; rightMargin: 2 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/ShiftKey.qml b/src/imports/virtualkeyboard/components/ShiftKey.qml
new file mode 100644
index 0000000..16f463f
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/ShiftKey.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+
+BaseKey {
+ id: shiftKey
+ width: 47
+ key: Qt.Key_Shift
+ enabled: !keyboard.uppercaseOnly && !keyboard.lowercaseOnly
+ visible: enabled
+ highlighted: InputContext.capsLock
+ functionKey: true
+ property bool shiftChanged: true
+ onClicked: {
+ if (InputContext.inputMethodHints & Qt.ImhNoAutoUppercase) {
+ InputContext.capsLock = !InputContext.capsLock
+ InputContext.shift = !InputContext.shift
+ } else {
+ InputContext.capsLock = !InputContext.capsLock && (InputContext.shift && !shiftChanged)
+ InputContext.shift = InputContext.capsLock || !InputContext.shift ? true : false
+ shiftChanged = false
+ }
+ }
+ Connections {
+ target: keyboard
+ onUppercasedChanged: shiftKey.shiftChanged = true
+ }
+ Icon {
+ invert: pressed
+ smooth: shiftKey.pressed
+ anchors.centerIn: parent
+ source: "../images/shift.png"
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/SpaceKey.qml b/src/imports/virtualkeyboard/components/SpaceKey.qml
new file mode 100644
index 0000000..d9a8a4e
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/SpaceKey.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Key {
+ id: spaceKey
+
+ text: " "
+ repeat: true
+ width: keyboard.symbolMode ? 124 : 93
+ showPreview: false
+ key: Qt.Key_Space
+
+ Rectangle {
+ color: pressed ? "white" : "black"
+ height: 4
+ visible: spaceKey.displayText === " "
+ width: parent.width-30
+ anchors {
+ horizontalCenter: spaceKey.horizontalCenter
+ bottom: spaceKey.bottom
+ bottomMargin: 18
+ }
+ }
+}
diff --git a/src/imports/virtualkeyboard/components/SymbolModeKey.qml b/src/imports/virtualkeyboard/components/SymbolModeKey.qml
new file mode 100644
index 0000000..d18447c
--- /dev/null
+++ b/src/imports/virtualkeyboard/components/SymbolModeKey.qml
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Key {
+ width: 78
+ key: Qt.Key_Context1
+ displayText: "&123"
+ textPixelSize: 20
+ functionKey: true
+ onClicked: keyboard.symbolMode = !keyboard.symbolMode
+}
diff --git a/src/imports/virtualkeyboard/images/arrow.png b/src/imports/virtualkeyboard/images/arrow.png
new file mode 100644
index 0000000..8d01aa2
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/arrow.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/backspace.png b/src/imports/virtualkeyboard/images/backspace.png
new file mode 100644
index 0000000..4141872
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/backspace.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/enter.png b/src/imports/virtualkeyboard/images/enter.png
new file mode 100644
index 0000000..c611ebe
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/enter.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/hidekeyboard.png b/src/imports/virtualkeyboard/images/hidekeyboard.png
new file mode 100644
index 0000000..aecdfe5
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/hidekeyboard.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/keypad.png b/src/imports/virtualkeyboard/images/keypad.png
new file mode 100644
index 0000000..fd8fa55
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/keypad.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/shift.png b/src/imports/virtualkeyboard/images/shift.png
new file mode 100644
index 0000000..eded926
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/shift.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/images/space.png b/src/imports/virtualkeyboard/images/space.png
new file mode 100644
index 0000000..4a5e847
--- /dev/null
+++ b/src/imports/virtualkeyboard/images/space.png
Binary files differ
diff --git a/src/imports/virtualkeyboard/layouts/ar_AR.qml b/src/imports/virtualkeyboard/layouts/ar_AR.qml
new file mode 100644
index 0000000..dc7c6d9
--- /dev/null
+++ b/src/imports/virtualkeyboard/layouts/ar_AR.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+import "../components"
+
+Column {
+ property var keys: ["ضصقفغعهخحج", "شسيبلاتنمك", "ظطذدزوةث"]
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Repeater {
+ model: keys[0].length
+ Key {
+ text: keys[0][index]
+ textPixelSize: index > 1 ? 24 : 22
+ }
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Repeater {
+ model: keys[1].length
+ Key {
+ text: keys[1][index]
+ textPixelSize: index > 0 ? 24 : 23
+ }
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Repeater {
+ model: keys[2].length
+ Key {
+ text: keys[2][index]
+ }
+ }
+ BackspaceKey { width: 62 }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ SymbolModeKey {}
+ ChangeLanguageKey {}
+ SpaceKey {}
+ HideKeyboardKey {}
+ EnterKey {}
+ }
+}
diff --git a/src/imports/virtualkeyboard/layouts/en_GB.qml b/src/imports/virtualkeyboard/layouts/en_GB.qml
new file mode 100644
index 0000000..5fb34be
--- /dev/null
+++ b/src/imports/virtualkeyboard/layouts/en_GB.qml
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+import "../components"
+
+Column {
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "ŕrř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "ţtŧť"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "ÿyýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aäåãâàá"
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "šsşś"
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "đdƌď"
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ alternativeKeys: "ġǥgģǧĝğ"
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ alternativeKeys: "ĺŀłļľl"
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ ShiftKey {}
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zžż"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "çcċčć"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "ņńnň"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ BackspaceKey {}
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ SymbolModeKey {}
+ ChangeLanguageKey {}
+ SpaceKey {}
+ HideKeyboardKey {}
+ EnterKey {}
+ }
+}
diff --git a/src/imports/virtualkeyboard/layouts/fi_FI.qml b/src/imports/virtualkeyboard/layouts/fi_FI.qml
new file mode 100644
index 0000000..db1d644
--- /dev/null
+++ b/src/imports/virtualkeyboard/layouts/fi_FI.qml
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Boot2Qt.InputContext 1.0
+import "../components"
+
+Column {
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: Qt.Key_Q
+ text: "q"
+ }
+ Key {
+ key: Qt.Key_W
+ text: "w"
+ }
+ Key {
+ key: Qt.Key_E
+ text: "e"
+ alternativeKeys: "êeëèé"
+ }
+ Key {
+ key: Qt.Key_R
+ text: "r"
+ alternativeKeys: "ŕrř"
+ }
+ Key {
+ key: Qt.Key_T
+ text: "t"
+ alternativeKeys: "ţtŧť"
+ }
+ Key {
+ key: Qt.Key_Y
+ text: "y"
+ alternativeKeys: "ÿyýŷ"
+ }
+ Key {
+ key: Qt.Key_U
+ text: "u"
+ alternativeKeys: "űūũûüuùú"
+ }
+ Key {
+ key: Qt.Key_I
+ text: "i"
+ alternativeKeys: "îïīĩiìí"
+ }
+ Key {
+ key: Qt.Key_O
+ text: "o"
+ alternativeKeys: "œøõôöòóo"
+ }
+ Key {
+ key: Qt.Key_P
+ text: "p"
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: Qt.Key_A
+ text: "a"
+ alternativeKeys: "aäåãâàá"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_S
+ text: "s"
+ alternativeKeys: "šsşś"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_D
+ text: "d"
+ alternativeKeys: "đdƌď"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_F
+ text: "f"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_G
+ text: "g"
+ alternativeKeys: "ġgģǧĝğ"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_H
+ text: "h"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_J
+ text: "j"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_K
+ text: "k"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_L
+ text: "l"
+ alternativeKeys: "ĺŀłļľl"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_Adiaeresis
+ text: "ä"
+ width: 28
+ }
+ Key {
+ key: Qt.Key_Odiaeresis
+ text: "ö"
+ width: 28
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ ShiftKey {}
+ Key {
+ key: Qt.Key_Z
+ text: "z"
+ alternativeKeys: "zžż"
+ }
+ Key {
+ key: Qt.Key_X
+ text: "x"
+ }
+ Key {
+ key: Qt.Key_C
+ text: "c"
+ alternativeKeys: "çcċčć"
+ }
+ Key {
+ key: Qt.Key_V
+ text: "v"
+ }
+ Key {
+ key: Qt.Key_B
+ text: "b"
+ }
+ Key {
+ key: Qt.Key_N
+ text: "n"
+ alternativeKeys: "ņńnň"
+ }
+ Key {
+ key: Qt.Key_M
+ text: "m"
+ }
+ BackspaceKey {}
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ SymbolModeKey {}
+ ChangeLanguageKey {}
+ SpaceKey {}
+ HideKeyboardKey {}
+ EnterKey {}
+ }
+}
diff --git a/src/imports/virtualkeyboard/layouts/numbers.qml b/src/imports/virtualkeyboard/layouts/numbers.qml
new file mode 100644
index 0000000..7d47066
--- /dev/null
+++ b/src/imports/virtualkeyboard/layouts/numbers.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import ".."
+import "../components"
+import Boot2Qt.InputContext 1.0
+
+Column {
+ Row {
+ Repeater {
+ model: 3
+ NumberKey { key: Qt.Key_1 + index; text: 1 + index }
+ }
+ BackspaceKey { width: 78 }
+ }
+ Row {
+ Repeater {
+ model: 3
+ NumberKey { key: Qt.Key_4 + index; text: 4 + index }
+ }
+ SpaceKey {
+ width: 78
+ displayText: "_"
+ }
+ }
+ Row {
+ Repeater {
+ model: 3
+ NumberKey { key: Qt.Key_7 + index; text: 7 + index }
+ }
+ HideKeyboardKey { width: 78 }
+ }
+ Row {
+ NumberKey {
+ key: Qt.Key_Asterisk
+ displayText: "*+"
+ text: "*+"
+ textPixelSize: 40
+ visible: InputContext.inputMethodHints & Qt.ImhDialableCharactersOnly
+ }
+ NumberKey {
+ key: Qt.Key_0
+ text: "0"
+ width: InputContext.inputMethodHints & Qt.ImhDigitsOnly ? 270 : (InputContext.inputMethodHints & Qt.ImhFormattedNumbersOnly ? 180 : 77)
+ textPixelSize: 38
+ }
+ NumberKey {
+ id: signKey
+ text: "#"
+ key: Qt.Key_NumberSign
+ visible: !(InputContext.inputMethodHints & Qt.ImhDigitsOnly)
+ states: State {
+ when: InputContext.inputMethodHints & Qt.ImhFormattedNumbersOnly
+ PropertyChanges {
+ target: signKey
+
+ text: "."
+ key: Qt.Key_Period
+ enabled: InputContext.surroundingText.indexOf(".") == -1
+ }
+ }
+ }
+ EnterKey { width: 78 }
+ }
+}
diff --git a/src/imports/virtualkeyboard/layouts/symbols.qml b/src/imports/virtualkeyboard/layouts/symbols.qml
new file mode 100644
index 0000000..f4c8293
--- /dev/null
+++ b/src/imports/virtualkeyboard/layouts/symbols.qml
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import "../components"
+
+Column {
+ property bool secondPage
+ onVisibleChanged: if (!visible) secondPage = false
+
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: secondPage ? Qt.Key_unknown : Qt.Key_1
+ text: secondPage ? ":)" : "1"
+ textPixelSize: secondPage ? 20 : 24
+ }
+ Key {
+ key: secondPage ? Qt.Key_unknown : Qt.Key_2
+ text: secondPage ? ":D" : "2"
+ textPixelSize: secondPage ? 20 : 24
+ }
+ Key {
+ key: secondPage ? Qt.Key_Dollar : Qt.Key_3
+ text: secondPage ? ":(" : "3"
+ textPixelSize: secondPage ? 20 : 24
+ }
+ Key {
+ key: secondPage ? Qt.Key_yen : Qt.Key_4
+ text: secondPage ? "<3": "4"
+ textPixelSize: secondPage ? 18 : 24
+ }
+ Key {
+ key: Qt.Key_5
+ text: secondPage ? "½" : "5"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Percent : Qt.Key_6
+ text: secondPage ? "%": "6"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Less : Qt.Key_7
+ text: secondPage ? "<": "7"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Greater : Qt.Key_8
+ text: secondPage ? ">" : "8"
+ }
+ Key {
+ key: secondPage ? Qt.Key_BracketLeft : Qt.Key_9
+ text: secondPage ? "[" : "9"
+ }
+ Key {
+ key: secondPage ? Qt.Key_BracketRight : Qt.Key_0
+ text: secondPage ? "]" : "0"
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ key: secondPage ? Qt.Key_AsciiTilde : Qt.Key_At
+ text: secondPage ? "~" : "@"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Agrave : Qt.Key_Asterisk
+ text: secondPage ? "`" : "*"
+ }
+ Key {
+ key: secondPage ? Qt.Key_AsciiCircum : Qt.Key_NumberSign
+ text: secondPage ? "^" : "#"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Bar : Qt.Key_Plus
+ text: secondPage ? "|" : "+"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Underscore : Qt.Key_Minus
+ text: secondPage ? "_" : "-"
+ }
+ Key {
+ key: secondPage ? Qt.Key_section : Qt.Key_Equal
+ text: secondPage ? "§" : "="
+ }
+ Key {
+ key: secondPage ? Qt.Key_BraceLeft : Qt.Key_ParenLeft
+ text: secondPage ? "{" : "("
+ }
+ Key {
+ key: secondPage ? Qt.Key_BraceRight : Qt.Key_ParenRight
+ text: secondPage ? "}" : ")"
+ }
+ Key {
+ key: secondPage ? Qt.Key_questiondown : Qt.Key_Question
+ text: secondPage ? "¿" : "?"
+ }
+ Key {
+ key: secondPage ? Qt.Key_exclamdown : Qt.Key_Apostrophe
+ text: secondPage ? "¡" : "!"
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ Key {
+ width: 47
+ displayText: secondPage ? " 2/2" : " 1/2"
+ textPixelSize: 20
+ functionKey: true
+ onClicked: secondPage = !secondPage
+ }
+ Key {
+ key: secondPage ? Qt.Key_guillemotleft : Qt.Key_Period
+ text: secondPage ? '«' : "."
+ }
+ Key {
+ key: secondPage ? Qt.Key_guillemotright : Qt.Key_Comma
+ text: secondPage ? '»' : ","
+ }
+ Key {
+ key: secondPage ? Qt.Key_QuoteDbl : Qt.Key_Slash
+ text: secondPage ? '"' : "/"
+ }
+ Key {
+ key: secondPage ? Qt.Key_unknown : Qt.Key_Backslash
+ text: secondPage ? '“' : "\\"
+ }
+ Key {
+ key: secondPage ? Qt.Key_unknown : Qt.Key_Exclam
+ text: secondPage ? '”' : "'"
+ }
+ Key {
+ key: secondPage ? Qt.Key_unknown : Qt.Key_Colon
+ text: secondPage ? '„' : ":"
+ }
+ Key {
+ key: secondPage ? Qt.Key_Ampersand : Qt.Key_Semicolon
+ text: secondPage ? "&" : ";"
+ }
+ BackspaceKey {
+
+ }
+ }
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ SymbolModeKey { displayText: "ABC" }
+ SpaceKey {}
+ HideKeyboardKey {}
+ EnterKey {}
+ }
+}
diff --git a/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.cpp b/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.cpp
new file mode 100644
index 0000000..bf55f9b
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.cpp
@@ -0,0 +1,309 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "platforminputcontext.h"
+#include "declarativeinputcontext.h"
+
+#include <QEvent>
+#include <QDebug>
+#include <QQuickItem>
+#include <QTextFormat>
+#include <QGuiApplication>
+#include <QLocale>
+
+DeclarativeInputContext::DeclarativeInputContext(PlatformInputContext *parent) :
+ QObject(parent), m_inputContext(parent), m_inputMethodVisible(false), m_focus(false),
+ m_shift(false), m_capsLock(false), m_cursorPosition(0), m_inputMethodHints(0)
+{
+ if (m_inputContext)
+ m_inputContext->setDeclarativeContext(this);
+}
+
+DeclarativeInputContext::~DeclarativeInputContext()
+{
+ if (m_inputContext)
+ m_inputContext->setDeclarativeContext(0);
+ m_characterKeys.clear();
+}
+
+bool DeclarativeInputContext::inputMethodVisible() const
+{
+ return m_inputMethodVisible;
+}
+
+void DeclarativeInputContext::setInputMethodVisibleProperty(bool visible)
+{
+ if (m_inputMethodVisible != visible) {
+ m_inputMethodVisible = visible;
+ emit inputMethodVisibleChanged();
+ }
+}
+
+bool DeclarativeInputContext::focus() const
+{
+ return m_focus;
+}
+
+void DeclarativeInputContext::setFocus(bool enable)
+{
+ if (m_focus != enable) {
+ m_focus = enable;
+ emit focusChanged();
+ }
+ emit focusEditorChanged();
+}
+
+bool DeclarativeInputContext::shift() const
+{
+ return m_shift;
+}
+
+void DeclarativeInputContext::setShift(bool enable)
+{
+ if (m_shift != enable) {
+ m_shift = enable;
+ emit shiftChanged();
+ }
+}
+
+bool DeclarativeInputContext::capsLock() const
+{
+ return m_capsLock;
+}
+
+void DeclarativeInputContext::setCapsLock(bool enable)
+{
+ if (m_capsLock != enable) {
+ m_capsLock = enable;
+ emit capsLockChanged();
+ }
+}
+
+int DeclarativeInputContext::cursorPosition() const
+{
+ return m_cursorPosition;
+}
+
+Qt::InputMethodHints DeclarativeInputContext::inputMethodHints() const
+{
+ return m_inputMethodHints;
+}
+
+QString DeclarativeInputContext::preeditText() const
+{
+ return m_preeditText;
+}
+
+void DeclarativeInputContext::setPreeditText(const QString &text)
+{
+ if (text != m_preeditText)
+ sendPreedit(text);
+}
+
+QString DeclarativeInputContext::surroundingText() const
+{
+ return m_surroundingText;
+}
+
+QString DeclarativeInputContext::selectedText() const
+{
+ return m_selectedText;
+}
+
+QRectF DeclarativeInputContext::cursorRectangle() const
+{
+ return m_cursorRectangle;
+}
+
+void DeclarativeInputContext::sendKeyClick(int key, const QString &text, int modifiers)
+{
+ if (m_focus && m_inputContext) {
+ QKeyEvent pressEvent(QEvent::KeyPress, key, Qt::KeyboardModifiers(modifiers), text);
+ QKeyEvent releaseEvent(QEvent::KeyRelease, key, Qt::KeyboardModifiers(modifiers), text);
+
+ m_inputContext->sendKeyEvent(&pressEvent);
+ m_inputContext->sendKeyEvent(&releaseEvent);
+ }
+}
+
+void DeclarativeInputContext::sendPreedit(const QString &text, int cursor)
+{
+ const QString preedit = m_preeditText;
+ m_preeditText = text;
+
+ if (m_inputContext) {
+ QList<QInputMethodEvent::Attribute> attributes;
+
+ if (cursor >= 0 && cursor <= text.length()) {
+ attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursor, text.length(), QVariant()));
+ } else {
+ cursor = text.length();
+ }
+
+ QTextCharFormat textFormat;
+ textFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline);
+ attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, 0, text.length(), textFormat));
+
+ QInputMethodEvent event(text, attributes);
+ m_inputContext->sendEvent(&event);
+ }
+
+ if (m_preeditText != preedit)
+ emit preeditTextChanged();
+}
+
+void DeclarativeInputContext::commit()
+{
+ commit(m_preeditText);
+}
+
+void DeclarativeInputContext::commit(const QString &text, int replacementStart, int replacementLength)
+{
+ bool preeditChanged = !m_preeditText.isEmpty();
+ m_preeditText.clear();
+
+ if (m_inputContext) {
+ QInputMethodEvent inputEvent;
+ inputEvent.setCommitString(text, replacementStart, replacementLength);
+ m_inputContext->sendEvent(&inputEvent);
+ }
+
+ if (preeditChanged)
+ emit preeditTextChanged();
+}
+
+void DeclarativeInputContext::clear()
+{
+ bool preeditChanged = !m_preeditText.isEmpty();
+ m_preeditText.clear();
+
+ QInputMethodEvent event;
+ m_inputContext->sendEvent(&event);
+
+ if (preeditChanged)
+ emit preeditTextChanged();
+}
+
+void DeclarativeInputContext::setAnimating(bool animating)
+{
+ if (m_inputContext && m_inputContext->m_animating != animating) {
+ m_inputContext->m_animating = animating;
+ m_inputContext->emitAnimatingChanged();
+ }
+}
+
+void DeclarativeInputContext::setKeyboardRectangle(QRectF rectangle)
+{
+ if (m_inputContext && m_inputContext->m_keyboardRect != rectangle) {
+ m_inputContext->m_keyboardRect = rectangle;
+ m_inputContext->emitKeyboardRectChanged();
+ }
+}
+
+QRectF DeclarativeInputContext::keyboardRectangle() const
+{
+ return m_inputContext->m_keyboardRect;
+}
+
+void DeclarativeInputContext::setLocale(QString name)
+{
+ if (m_inputContext && m_inputContext->m_locale.name() != name) {
+ m_inputContext->m_locale = QLocale(name);
+ m_inputContext->emitLocaleChanged();
+ if (m_inputContext->m_inputDirection != m_inputContext->m_locale.textDirection()) {
+ m_inputContext->m_inputDirection = m_inputContext->m_locale.textDirection();
+ m_inputContext->emitInputDirectionChanged(m_inputContext->m_inputDirection);
+ }
+ }
+}
+
+void DeclarativeInputContext::update(Qt::InputMethodQueries queries)
+{
+ Q_UNUSED(queries);
+
+ // fetch
+ Qt::InputMethodHints inputMethodHints = Qt::InputMethodHints(m_inputContext->inputMethodQuery(Qt::ImHints).toInt());
+ int cursorPosition = m_inputContext->inputMethodQuery(Qt::ImCursorPosition).toInt();
+ QRectF cursorRectangle = qApp->inputMethod()->cursorRectangle();
+ QString surroundingText = m_inputContext->inputMethodQuery(Qt::ImSurroundingText).toString();
+ QString selectedText = m_inputContext->inputMethodQuery(Qt::ImCurrentSelection).toString();
+
+ // check against changes
+ bool newInputMethodHints = inputMethodHints != m_inputMethodHints;
+ bool newSurroundingText = surroundingText != m_surroundingText;
+ bool newSelectedTextChange = selectedText != m_selectedText;
+ bool newCursorPosition = cursorPosition != m_cursorPosition;
+ bool newCursorRectangle = cursorRectangle != m_cursorRectangle;
+
+ // update
+ m_inputMethodHints = inputMethodHints;
+ m_surroundingText = surroundingText;
+ m_selectedText = selectedText;
+ m_cursorPosition = cursorPosition;
+ m_cursorRectangle = cursorRectangle;
+
+ // notify
+ if (newInputMethodHints)
+ emit inputMethodHintsChanged();
+ if (newSurroundingText)
+ emit surroundingTextChanged();
+ if (newSelectedTextChange)
+ emit selectedTextChanged();
+ if (newCursorPosition)
+ emit cursorPositionChanged();
+ if (newCursorRectangle)
+ emit cursorRectangleChanged();
+}
+
+void DeclarativeInputContext::registerCharacterKey(QQuickItem *key)
+{
+ m_characterKeys.append(key);
+}
+
+void DeclarativeInputContext::unregisterCharacterKey(QQuickItem *key)
+{
+ m_characterKeys.removeOne(key);
+}
+
+void DeclarativeInputContext::handleUppercasing(bool uppercased)
+{
+ foreach(QQuickItem* key, m_characterKeys)
+ key->setProperty("uppercased", uppercased);
+}
diff --git a/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.h b/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.h
new file mode 100644
index 0000000..cb695ab
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.h
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DECLARATIVEINPUTCONTEXT_H
+#define DECLARATIVEINPUTCONTEXT_H
+
+#include <QObject>
+#include <QRectF>
+#include <QFont>
+#include <QtQml/qqml.h>
+
+class PlatformInputContext;
+class QQuickItem;
+
+class DeclarativeInputContext : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(bool inputMethodVisible READ inputMethodVisible NOTIFY inputMethodVisibleChanged)
+ Q_PROPERTY(bool focus READ focus NOTIFY focusChanged)
+ Q_PROPERTY(bool shift READ shift WRITE setShift NOTIFY shiftChanged)
+ Q_PROPERTY(bool capsLock READ capsLock WRITE setCapsLock NOTIFY capsLockChanged)
+ Q_PROPERTY(int cursorPosition READ cursorPosition NOTIFY cursorPositionChanged)
+ Q_PROPERTY(Qt::InputMethodHints inputMethodHints READ inputMethodHints NOTIFY inputMethodHintsChanged)
+ Q_PROPERTY(QString preeditText READ preeditText WRITE setPreeditText NOTIFY preeditTextChanged)
+ Q_PROPERTY(QString surroundingText READ surroundingText NOTIFY surroundingTextChanged)
+ Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectedTextChanged)
+ Q_PROPERTY(QRectF cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
+ Q_PROPERTY(QRectF keyboardRectangle READ keyboardRectangle WRITE setKeyboardRectangle NOTIFY keyboardRectangleChanged)
+
+public:
+ explicit DeclarativeInputContext(PlatformInputContext *parent = 0);
+ ~DeclarativeInputContext();
+
+ bool inputMethodVisible() const;
+ void setInputMethodVisibleProperty(bool visible);
+
+ bool focus() const;
+ void setFocus(bool enable);
+
+ bool shift() const;
+ void setShift(bool enable);
+
+ bool capsLock() const;
+ void setCapsLock(bool enable);
+
+ int cursorPosition() const;
+
+ Qt::InputMethodHints inputMethodHints() const;
+
+ QString preeditText() const;
+ void setPreeditText(const QString &text);
+
+ QString surroundingText() const;
+
+ QString selectedText() const;
+
+ QRectF cursorRectangle() const;
+
+ QRectF keyboardRectangle() const;
+ Q_INVOKABLE void setKeyboardRectangle(QRectF rectangle);
+
+ Q_INVOKABLE void sendKeyClick(int key, const QString &text, int modifiers = 0);
+ Q_INVOKABLE void sendPreedit(const QString &text, int cursor = -1);
+
+ Q_INVOKABLE void commit();
+ Q_INVOKABLE void commit(const QString &text, int replacementStart = 0, int replacementEnd = 0);
+
+ Q_INVOKABLE void clear();
+
+ Q_INVOKABLE void setAnimating(bool animating);
+ Q_INVOKABLE void setLocale(QString name);
+
+ void update(Qt::InputMethodQueries queries);
+
+ Q_INVOKABLE void registerCharacterKey(QQuickItem * key);
+ Q_INVOKABLE void unregisterCharacterKey(QQuickItem * key);
+ Q_INVOKABLE void handleUppercasing(bool uppercased);
+
+signals:
+ void inputMethodVisibleChanged();
+ void focusChanged();
+ void preeditTextChanged();
+ void surroundingTextChanged();
+ void selectedTextChanged();
+ void cursorPositionChanged();
+ void inputMethodHintsChanged();
+ void focusEditorChanged();
+ void shiftChanged();
+ void capsLockChanged();
+ void cursorRectangleChanged();
+ void keyboardRectangleChanged();
+
+private:
+ void updateInputMethodValues();
+
+ PlatformInputContext *m_inputContext;
+ bool m_inputMethodVisible;
+ bool m_focus;
+ bool m_shift;
+ bool m_capsLock;
+ int m_cursorPosition;
+ Qt::InputMethodHints m_inputMethodHints;
+ QString m_preeditText;
+ QString m_surroundingText;
+ QString m_selectedText;
+ QRectF m_cursorRectangle;
+ QList<QQuickItem *> m_characterKeys;
+};
+
+QML_DECLARE_TYPE(DeclarativeInputContext)
+
+#endif
diff --git a/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.cpp b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.cpp
new file mode 100644
index 0000000..a73a15a
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.cpp
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "platforminputcontext.h"
+#include "declarativeinputcontext.h"
+
+#include <QWindow>
+#include <QInputMethod>
+#include <QGuiApplication>
+#include <qdebug.h>
+
+PlatformInputContext::PlatformInputContext() :
+ m_declarativeContext(0), m_animating(false), m_visible(false),
+ m_focusObject(0), m_locale("en_GB"), m_inputDirection(Qt::LeftToRight)
+{
+}
+
+PlatformInputContext::~PlatformInputContext()
+{
+}
+
+bool PlatformInputContext::isValid() const
+{
+ return true;
+}
+
+bool PlatformInputContext::isAnimating() const
+{
+ return m_animating;
+}
+
+bool PlatformInputContext::isInputPanelVisible() const
+{
+ return m_visible;
+}
+
+QRectF PlatformInputContext::keyboardRect() const
+{
+ return m_keyboardRect;
+}
+
+QLocale PlatformInputContext::locale() const
+{
+ return m_locale;
+}
+
+Qt::LayoutDirection PlatformInputContext::inputDirection() const
+{
+ return m_inputDirection;
+}
+
+void PlatformInputContext::reset()
+{
+ if (m_declarativeContext)
+ m_declarativeContext->commit();
+}
+
+void PlatformInputContext::update(Qt::InputMethodQueries queries)
+{
+ if (m_declarativeContext)
+ m_declarativeContext->update(queries);
+}
+
+void PlatformInputContext::showInputPanel() {
+ if (!m_visible) {
+ m_visible = true;
+ if (m_declarativeContext) {
+ m_declarativeContext->setInputMethodVisibleProperty(true);
+ }
+ emitInputPanelVisibleChanged();
+ }
+}
+
+void PlatformInputContext::hideInputPanel() {
+ if (m_visible) {
+ m_visible = false;
+ if (m_declarativeContext) {
+ m_declarativeContext->setInputMethodVisibleProperty(false);
+ }
+ emitInputPanelVisibleChanged();
+ }
+}
+
+void PlatformInputContext::setFocusObject(QObject *object)
+{
+ m_focusObject = object;
+ bool enabled = false;
+ if (m_focusObject) {
+ QInputMethodQueryEvent event(Qt::ImEnabled);
+ sendEvent(&event);
+ enabled = event.value(Qt::ImEnabled).toBool();
+ }
+ if (m_declarativeContext) {
+ bool focus = (object != 0 && enabled);
+ m_declarativeContext->setFocus(focus);
+ if (focus)
+ m_declarativeContext->update(Qt::ImQueryAll);
+ else
+ hideInputPanel();
+ }
+}
+
+void PlatformInputContext::sendEvent(QEvent *event)
+{
+ if (m_focusObject)
+ QGuiApplication::sendEvent(m_focusObject, event);
+}
+
+void PlatformInputContext::sendKeyEvent(QKeyEvent *event)
+{
+ if (qApp && qApp->focusWindow())
+ QGuiApplication::sendEvent(qApp->focusWindow(), event);
+}
+
+QVariant PlatformInputContext::inputMethodQuery(Qt::InputMethodQuery query)
+{
+ QInputMethodQueryEvent event(query);
+ sendEvent(&event);
+ return event.value(query);
+}
+
+void PlatformInputContext::setDeclarativeContext(DeclarativeInputContext *context)
+{
+ m_declarativeContext = context;
+}
diff --git a/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.h b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.h
new file mode 100644
index 0000000..bcfae44
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PLATFORMINPUTCONTEXT_H
+#define PLATFORMINPUTCONTEXT_H
+
+#include <qevent.h>
+#include <qpa/qplatforminputcontext.h>
+#include <QPointer>
+#include <QLocale>
+
+class DeclarativeInputContext;
+class PlatformInputContext : public QPlatformInputContext
+{
+ Q_OBJECT
+public:
+ explicit PlatformInputContext();
+ ~PlatformInputContext();
+
+ // from QPlatformInputContext
+ virtual bool isValid() const;
+ virtual bool isAnimating() const;
+ virtual bool isInputPanelVisible() const;
+ virtual QRectF keyboardRect() const;
+ virtual QLocale locale() const;
+ virtual Qt::LayoutDirection inputDirection() const;
+
+ void reset();
+ void update(Qt::InputMethodQueries queries);
+ virtual void showInputPanel();
+ virtual void hideInputPanel();
+ virtual void setFocusObject(QObject *object);
+
+protected:
+ void sendEvent(QEvent *event);
+ void sendKeyEvent(QKeyEvent *event);
+ QVariant inputMethodQuery(Qt::InputMethodQuery query);
+ void setDeclarativeContext(DeclarativeInputContext *context);
+
+protected:
+ friend class DeclarativeInputContext;
+
+ DeclarativeInputContext *m_declarativeContext;
+ bool m_animating;
+ bool m_visible;
+ QRectF m_keyboardRect;
+ QPointer<QObject> m_focusObject;
+ QLocale m_locale;
+ Qt::LayoutDirection m_inputDirection;
+};
+
+#endif
diff --git a/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.json b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.json
new file mode 100644
index 0000000..266da3c
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "b2qtinputcontext" ]
+}
diff --git a/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.pro b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.pro
new file mode 100644
index 0000000..e2288fe
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.pro
@@ -0,0 +1,21 @@
+TEMPLATE = lib
+TARGET = b2qtinputcontextplugin
+TARGETPATH = $$[QT_INSTALL_PLUGINS]/platforminputcontexts
+
+target.path = $$TARGETPATH
+
+QT += quick gui gui-private
+
+CONFIG += plugin
+
+SOURCES += platforminputcontext.cpp \
+ declarativeinputcontext.cpp \
+ plugin.cpp
+
+HEADERS += platforminputcontext.h \
+ declarativeinputcontext.h
+
+OTHER_FILES = $$$PWD/platforminputcontext.json
+
+INSTALLS += target
+OTHER += platforminputcontext.json
diff --git a/src/imports/virtualkeyboard/platforminputcontext/plugin.cpp b/src/imports/virtualkeyboard/platforminputcontext/plugin.cpp
new file mode 100644
index 0000000..f63205f
--- /dev/null
+++ b/src/imports/virtualkeyboard/platforminputcontext/plugin.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDebug>
+#include <QStringList>
+#include <qpa/qplatforminputcontextplugin_p.h>
+
+#include "platforminputcontext.h"
+#include "declarativeinputcontext.h"
+
+static PlatformInputContext *platformInputContext = 0;
+
+static QObject *createInputContextModule(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+ Q_UNUSED(engine);
+ Q_UNUSED(scriptEngine);
+ return new DeclarativeInputContext(platformInputContext);
+}
+
+class PlatformInputContextPlugin : public QPlatformInputContextPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPlatformInputContextFactoryInterface" FILE "platforminputcontext.json")
+
+public:
+ QStringList keys() const;
+ QPlatformInputContext *create(const QString&, const QStringList&);
+};
+
+QStringList PlatformInputContextPlugin::keys() const
+{
+ return QStringList(QStringLiteral("b2qtinputcontext"));
+}
+
+QPlatformInputContext *PlatformInputContextPlugin::create(const QString& system, const QStringList& paramList)
+{
+ Q_UNUSED(paramList);
+
+ qmlRegisterSingletonType<DeclarativeInputContext>("Boot2Qt.InputContext", 1, 0, "InputContext", createInputContextModule);
+
+ if (system.compare(system, QStringLiteral("b2qtinputcontext"), Qt::CaseInsensitive) == 0)
+ platformInputContext = new PlatformInputContext;
+ return platformInputContext;
+}
+
+#include "plugin.moc"
diff --git a/src/imports/virtualkeyboard/qmlmodule.pro b/src/imports/virtualkeyboard/qmlmodule.pro
new file mode 100644
index 0000000..7f5c2b6
--- /dev/null
+++ b/src/imports/virtualkeyboard/qmlmodule.pro
@@ -0,0 +1,37 @@
+TARGETPATH = "Qt/labs/virtualkeyboard"
+
+QML_FILES = \
+ images/shift.png \
+ images/space.png \
+ images/backspace.png \
+ images/arrow.png \
+ images/enter.png \
+ images/keypad.png \
+ images/hidekeyboard.png \
+ TextField.qml \
+ components/AutoScroller.qml \
+ components/InputEngine.qml \
+ components/HideKeyboardKey.qml \
+ components/NumberKey.qml \
+ components/CharacterPreviewBubble.qml \
+ components/SymbolModeKey.qml \
+ components/ChangeLanguageKey.qml \
+ components/SpaceKey.qml \
+ components/Icon.qml \
+ components/BaseKey.qml \
+ components/Key.qml \
+ components/ShiftKey.qml \
+ components/EnterKey.qml \
+ components/AlternativeKeys.qml \
+ components/PressedKey.qml \
+ components/BackspaceKey.qml \
+ Keyboard.qml \
+ TextBase.qml \
+ layouts/symbols.qml \
+ layouts/numbers.qml \
+ layouts/ar_AR.qml \
+ layouts/en_GB.qml \
+ layouts/fi_FI.qml \
+ ScrollBar.qml \
+
+load(qml_module)
diff --git a/src/imports/virtualkeyboard/virtualkeyboard.pro b/src/imports/virtualkeyboard/virtualkeyboard.pro
new file mode 100644
index 0000000..bedd662
--- /dev/null
+++ b/src/imports/virtualkeyboard/virtualkeyboard.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS += platforminputcontext qmlmodule.pro
diff --git a/src/imports/virtualkeyboard/virtualkeyboard.qml b/src/imports/virtualkeyboard/virtualkeyboard.qml
new file mode 100644
index 0000000..efeb482
--- /dev/null
+++ b/src/imports/virtualkeyboard/virtualkeyboard.qml
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import "content"
+
+Image {
+ source: "content/images/background.png"
+
+ Keyboard {}
+ Flickable {
+ id: flickable
+
+ property real scrollMarginVertical: 20
+
+ width: parent.width
+ contentWidth: content.width
+ contentHeight: content.height
+ interactive: contentHeight > height
+ height: Qt.inputMethod.keyboardRectangle.y
+ flickableDirection: Flickable.VerticalFlick
+ children: ScrollBar {}
+
+ MouseArea {
+ id: content
+
+ width: flickable.width
+ height: textEditors.height + 24
+
+ onClicked: {
+ if (Qt.inputMethod.inputItem)
+ Qt.inputMethod.inputItem.focus = false
+ }
+
+ Column {
+ id: textEditors
+ spacing: 15
+ x: 12; y: 12
+ width: parent.width - 26
+
+ Text {
+ color: "#EEEEEE"
+ text: "Tap fields to enter text"
+ anchors.horizontalCenter: parent.horizontalCenter
+ font.pixelSize: 22
+ }
+ TextField {
+ width: parent.width
+ previewText: "One line field"
+ enterKeyText: "Next"
+ enterKeyEnabled: text.length > 0
+ onEnterKeyClicked: passwordField.focus = true
+ }
+ TextField {
+ id: passwordField
+
+ width: parent.width
+ echoMode: TextInput.PasswordEchoOnEdit
+ previewText: "Password field"
+ inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText
+ enterKeyText: "Next"
+ enterKeyEnabled: text.length > 0
+ onEnterKeyClicked: numberField.focus = true
+ }
+ TextField {
+ id: numberField
+
+ validator: RegExpValidator { regExp: /^[0-9\+\-\#\*\ ]{6,}$/ }
+ width: parent.width
+ previewText: "Phone number field"
+ inputMethodHints: Qt.ImhDialableCharactersOnly
+ enterKeyText: "Next"
+ enterKeyEnabled: text.length > 0
+ onEnterKeyClicked: textArea.focus = true
+ }
+ TextArea {
+ id: textArea
+
+ width: parent.width
+ previewText: "Multiple lines field"
+ height: Math.max(206, implicitHeight)
+ }
+ }
+ }
+ }
+}