From 3bab79ccafe79105c1c3d7dc6fe1e87d80628bd9 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Thu, 21 Mar 2013 14:10:39 +0100 Subject: Better structure for virtual keyboard --- src/imports/imports.pro | 2 +- src/imports/virtualkeyboard/Keyboard.qml | 242 ++++++++++++++++ .../virtualkeyboard/components/AlternativeKeys.qml | 122 ++++++++ .../virtualkeyboard/components/AutoScroller.qml | 115 ++++++++ .../virtualkeyboard/components/BackspaceKey.qml | 54 ++++ src/imports/virtualkeyboard/components/BaseKey.qml | 77 +++++ .../components/ChangeLanguageKey.qml | 52 ++++ .../components/CharacterPreviewBubble.qml | 87 ++++++ .../virtualkeyboard/components/EnterKey.qml | 74 +++++ .../virtualkeyboard/components/HideKeyboardKey.qml | 53 ++++ src/imports/virtualkeyboard/components/Icon.qml | 64 +++++ .../virtualkeyboard/components/InputEngine.qml | 179 ++++++++++++ src/imports/virtualkeyboard/components/Key.qml | 64 +++++ .../virtualkeyboard/components/NumberKey.qml | 47 ++++ .../virtualkeyboard/components/PressedKey.qml | 66 +++++ .../virtualkeyboard/components/ShiftKey.qml | 73 +++++ .../virtualkeyboard/components/SpaceKey.qml | 63 +++++ .../virtualkeyboard/components/SymbolModeKey.qml | 50 ++++ src/imports/virtualkeyboard/images/arrow.png | Bin 0 -> 264 bytes src/imports/virtualkeyboard/images/backspace.png | Bin 0 -> 515 bytes src/imports/virtualkeyboard/images/enter.png | Bin 0 -> 584 bytes .../virtualkeyboard/images/hidekeyboard.png | Bin 0 -> 251 bytes src/imports/virtualkeyboard/images/keypad.png | Bin 0 -> 14899 bytes src/imports/virtualkeyboard/images/shift.png | Bin 0 -> 310 bytes src/imports/virtualkeyboard/images/space.png | Bin 0 -> 240 bytes src/imports/virtualkeyboard/layouts/ar_AR.qml | 85 ++++++ src/imports/virtualkeyboard/layouts/en_GB.qml | 184 ++++++++++++ src/imports/virtualkeyboard/layouts/fi_FI.qml | 203 ++++++++++++++ src/imports/virtualkeyboard/layouts/numbers.qml | 103 +++++++ src/imports/virtualkeyboard/layouts/symbols.qml | 186 +++++++++++++ .../declarativeinputcontext.cpp | 309 +++++++++++++++++++++ .../platforminputcontext/declarativeinputcontext.h | 149 ++++++++++ .../platforminputcontext/platforminputcontext.cpp | 162 +++++++++++ .../platforminputcontext/platforminputcontext.h | 89 ++++++ .../platforminputcontext/platforminputcontext.json | 3 + .../platforminputcontext/platforminputcontext.pro | 21 ++ .../platforminputcontext/plugin.cpp | 83 ++++++ src/imports/virtualkeyboard/qmlmodule.pro | 37 +++ src/imports/virtualkeyboard/virtualkeyboard.pro | 2 + src/imports/virtualkeyboard/virtualkeyboard.qml | 123 ++++++++ 40 files changed, 3222 insertions(+), 1 deletion(-) create mode 100644 src/imports/virtualkeyboard/Keyboard.qml create mode 100644 src/imports/virtualkeyboard/components/AlternativeKeys.qml create mode 100644 src/imports/virtualkeyboard/components/AutoScroller.qml create mode 100644 src/imports/virtualkeyboard/components/BackspaceKey.qml create mode 100644 src/imports/virtualkeyboard/components/BaseKey.qml create mode 100644 src/imports/virtualkeyboard/components/ChangeLanguageKey.qml create mode 100644 src/imports/virtualkeyboard/components/CharacterPreviewBubble.qml create mode 100644 src/imports/virtualkeyboard/components/EnterKey.qml create mode 100644 src/imports/virtualkeyboard/components/HideKeyboardKey.qml create mode 100644 src/imports/virtualkeyboard/components/Icon.qml create mode 100644 src/imports/virtualkeyboard/components/InputEngine.qml create mode 100644 src/imports/virtualkeyboard/components/Key.qml create mode 100644 src/imports/virtualkeyboard/components/NumberKey.qml create mode 100644 src/imports/virtualkeyboard/components/PressedKey.qml create mode 100644 src/imports/virtualkeyboard/components/ShiftKey.qml create mode 100644 src/imports/virtualkeyboard/components/SpaceKey.qml create mode 100644 src/imports/virtualkeyboard/components/SymbolModeKey.qml create mode 100644 src/imports/virtualkeyboard/images/arrow.png create mode 100644 src/imports/virtualkeyboard/images/backspace.png create mode 100644 src/imports/virtualkeyboard/images/enter.png create mode 100644 src/imports/virtualkeyboard/images/hidekeyboard.png create mode 100644 src/imports/virtualkeyboard/images/keypad.png create mode 100644 src/imports/virtualkeyboard/images/shift.png create mode 100644 src/imports/virtualkeyboard/images/space.png create mode 100644 src/imports/virtualkeyboard/layouts/ar_AR.qml create mode 100644 src/imports/virtualkeyboard/layouts/en_GB.qml create mode 100644 src/imports/virtualkeyboard/layouts/fi_FI.qml create mode 100644 src/imports/virtualkeyboard/layouts/numbers.qml create mode 100644 src/imports/virtualkeyboard/layouts/symbols.qml create mode 100644 src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.cpp create mode 100644 src/imports/virtualkeyboard/platforminputcontext/declarativeinputcontext.h create mode 100644 src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.cpp create mode 100644 src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.h create mode 100644 src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.json create mode 100644 src/imports/virtualkeyboard/platforminputcontext/platforminputcontext.pro create mode 100644 src/imports/virtualkeyboard/platforminputcontext/plugin.cpp create mode 100644 src/imports/virtualkeyboard/qmlmodule.pro create mode 100644 src/imports/virtualkeyboard/virtualkeyboard.pro create mode 100644 src/imports/virtualkeyboard/virtualkeyboard.qml (limited to 'src/imports') 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 Binary files /dev/null and b/src/imports/virtualkeyboard/images/arrow.png differ diff --git a/src/imports/virtualkeyboard/images/backspace.png b/src/imports/virtualkeyboard/images/backspace.png new file mode 100644 index 0000000..4141872 Binary files /dev/null and b/src/imports/virtualkeyboard/images/backspace.png differ diff --git a/src/imports/virtualkeyboard/images/enter.png b/src/imports/virtualkeyboard/images/enter.png new file mode 100644 index 0000000..c611ebe Binary files /dev/null and b/src/imports/virtualkeyboard/images/enter.png differ diff --git a/src/imports/virtualkeyboard/images/hidekeyboard.png b/src/imports/virtualkeyboard/images/hidekeyboard.png new file mode 100644 index 0000000..aecdfe5 Binary files /dev/null and b/src/imports/virtualkeyboard/images/hidekeyboard.png differ diff --git a/src/imports/virtualkeyboard/images/keypad.png b/src/imports/virtualkeyboard/images/keypad.png new file mode 100644 index 0000000..fd8fa55 Binary files /dev/null and b/src/imports/virtualkeyboard/images/keypad.png differ diff --git a/src/imports/virtualkeyboard/images/shift.png b/src/imports/virtualkeyboard/images/shift.png new file mode 100644 index 0000000..eded926 Binary files /dev/null and b/src/imports/virtualkeyboard/images/shift.png differ diff --git a/src/imports/virtualkeyboard/images/space.png b/src/imports/virtualkeyboard/images/space.png new file mode 100644 index 0000000..4a5e847 Binary files /dev/null and b/src/imports/virtualkeyboard/images/space.png 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 +#include +#include +#include +#include +#include + +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 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 +#include +#include +#include + +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 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 +#include +#include +#include + +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 +#include +#include +#include + +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 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 +#include +#include + +#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("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) + } + } + } + } +} -- cgit v1.2.3