aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarkko Koivikko <jarkko.koivikko@code-q.fi>2015-07-08 16:39:08 +0300
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2015-10-07 12:54:40 +0000
commit30b0b04dfb9634a394cabc82b746a52b4d397371 (patch)
treebc69903e5591c09c130a4a7b6b3ff34a81e505a9
parent11f12de3fb83396282f213e057d24bb0ea9dc7e9 (diff)
Add support for full screen handwriting input
This change adds support for the full screen handwriting input. In full screen handwriting input, the user is able to use the whole application screen as a container for handwriting input. This feature is available to those application integrations, which integrate the new HandwritingInputPanel type to the application QML. The HandwritingInputPanel works as an add-on to the existing InputPanel, so it cannot be used exclusively without the InputPanel. Change-Id: I11530b9ccbc66aa59b210bec94d7bb87f0826370 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/VirtualKeyboard-b2qt.qml61
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Active.svg41
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Available.svg41
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Unavailable.svg39
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/HandwritingModeButton.qml148
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/demo.qrc4
-rw-r--r--examples/quick/enterprise/virtualkeyboard/virtualkeyboard/virtualkeyboard.pro1
-rw-r--r--src/virtualkeyboard/appinputpanel.cpp14
-rw-r--r--src/virtualkeyboard/appinputpanel.h17
-rw-r--r--src/virtualkeyboard/content/HandwritingInputPanel.qml120
-rw-r--r--src/virtualkeyboard/content/InputPanel.qml13
-rw-r--r--src/virtualkeyboard/content/components/HandwritingModeKey.qml2
-rw-r--r--src/virtualkeyboard/content/components/Keyboard.qml9
-rw-r--r--src/virtualkeyboard/content/components/TraceInputArea.qml11
-rw-r--r--src/virtualkeyboard/content/components/TraceInputKey.qml8
-rw-r--r--src/virtualkeyboard/content/components/WordCandidatePopupList.qml78
-rw-r--r--src/virtualkeyboard/content/content.qrc2
-rw-r--r--src/virtualkeyboard/content/styles/default/style.qml64
-rw-r--r--src/virtualkeyboard/content/styles/retro/style.qml57
-rw-r--r--src/virtualkeyboard/desktopinputpanel.cpp11
-rw-r--r--src/virtualkeyboard/desktopinputpanel.h4
-rw-r--r--src/virtualkeyboard/plugin.cpp2
-rw-r--r--src/virtualkeyboard/styles/KeyboardStyle.qml43
23 files changed, 764 insertions, 26 deletions
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/VirtualKeyboard-b2qt.qml b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/VirtualKeyboard-b2qt.qml
index 184176a3..4e6305d8 100644
--- a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/VirtualKeyboard-b2qt.qml
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/VirtualKeyboard-b2qt.qml
@@ -19,6 +19,7 @@
import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Enterprise.VirtualKeyboard 2.0
+import "content"
Item {
implicitWidth: virtualKeyboard.implicitHeight
@@ -36,6 +37,59 @@ Item {
anchors.right: parent.right
anchors.bottom: inputPanel.top
}
+
+ /* Handwriting input panel for full screen handwriting input.
+
+ This component is an optional add-on for the InputPanel component, that
+ is, its use does not affect the operation of the InputPanel component,
+ but it also can not be used as a standalone component.
+
+ The handwriting input panel is positioned to cover the entire area of
+ application. The panel itself is transparent, but once it is active the
+ user can draw handwriting on it.
+ */
+ HandwritingInputPanel {
+ z: 79
+ id: handwritingInputPanel
+ anchors.fill: parent
+ inputPanel: inputPanel
+ Rectangle {
+ z: -1
+ anchors.fill: parent
+ color: "black"
+ opacity: 0.10
+ }
+ }
+
+ /* Container area for the handwriting mode button.
+
+ Handwriting mode button can be moved freely within the container area.
+ In this example, a single click changes the handwriting mode and a
+ double-click changes the availability of the full screen handwriting input.
+ */
+ Item {
+ z: 89
+ visible: handwritingInputPanel.enabled && Qt.inputMethod.visible
+ anchors { left: parent.left; top: parent.top; right: parent.right; bottom: inputPanel.top; }
+ HandwritingModeButton {
+ id: handwritingModeButton
+ anchors.top: parent.top
+ anchors.right: parent.right
+ anchors.margins: 10
+ floating: true
+ flipable: true
+ width: handwritingInputPanel.height / 588 * 76
+ height: width
+ state: handwritingInputPanel.state
+ onClicked: handwritingInputPanel.active = !handwritingInputPanel.active
+ onDoubleClicked: handwritingInputPanel.available = !handwritingInputPanel.available
+ }
+ }
+
+ /* Keyboard input panel.
+
+ The keyboard is anchored to the bottom of the application.
+ */
InputPanel {
id: inputPanel
z: 99
@@ -44,7 +98,12 @@ Item {
anchors.right: parent.right
states: State {
name: "visible"
- when: Qt.inputMethod.visible
+ /* The visibility of the InputPanel can be bound to the Qt.inputMethod.visible property,
+ but then the handwriting input panel and the keyboard input panel can be visible
+ at the same time. Here the visibility is bound to InputPanel.active property instead,
+ which allows the handwriting panel to control the visibility when necessary.
+ */
+ when: inputPanel.active
PropertyChanges {
target: inputPanel
y: appContainer.height - inputPanel.height
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Active.svg b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Active.svg
new file mode 100644
index 00000000..ef108358
--- /dev/null
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Active.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:#5CAA15;}
+ .st4{fill:none;}
+</style>
+<g id="Active">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+ <circle class="st3" cx="195" cy="195" r="141"/>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st4" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Available.svg b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Available.svg
new file mode 100644
index 00000000..1178c8c6
--- /dev/null
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Available.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:#26282A;}
+ .st4{fill:none;}
+</style>
+<g id="Available">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+ <circle class="st3" cx="195" cy="195" r="141"/>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st4" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Unavailable.svg b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Unavailable.svg
new file mode 100644
index 00000000..d8149b53
--- /dev/null
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/FloatingButton_Unavailable.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="390px" height="390px" viewBox="0 0 390 390" style="enable-background:new 0 0 390 390;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.3;enable-background:new ;}
+ .st1{opacity:0.5;}
+ .st2{fill:#FFFFFF;}
+ .st3{fill:none;}
+</style>
+<g id="Unavailable">
+ <g>
+ <circle class="st0" cx="195" cy="195" r="191"/>
+ <g class="st1">
+ <path class="st2" d="M195,4c105.5,0,191,85.5,191,191s-85.5,191-191,191S4,300.5,4,195S89.5,4,195,4 M195,0
+ c-26.3,0-51.9,5.2-75.9,15.3c-23.2,9.8-44.1,23.9-62,41.8s-32,38.8-41.8,62C5.2,143.1,0,168.7,0,195s5.2,51.9,15.3,75.9
+ c9.8,23.2,23.9,44.1,41.8,62s38.8,32,62,41.8c24,10.2,49.6,15.3,75.9,15.3s51.9-5.2,75.9-15.3c23.2-9.8,44.1-23.9,62-41.8
+ s32-38.8,41.8-62c10.2-24,15.3-49.6,15.3-75.9s-5.2-51.9-15.3-75.9c-9.8-23.2-23.9-44.1-41.8-62s-38.8-32-62-41.8
+ C246.9,5.2,221.3,0,195,0L195,0z"/>
+ </g>
+ </g>
+</g>
+<g id="icon">
+ <g>
+ <g>
+ <path class="st2" d="M155.6,247.3c-10.1,0-18.9-5-23.1-13.6c-10.1-21,5.4-37.4,21.7-54.7c1.2-1.2,2.4-2.5,3.6-3.8
+ c5.3-5.7,5.2-11.5,3.5-14.8c-1.8-3.4-5.5-4.9-10.2-4.2c-16.5,2.6-21.2,26.4-21.2,26.6l-11.9-2.2c0.3-1.3,6.4-32.3,31.2-36.3
+ c9.8-1.6,18.5,2.4,22.7,10.4c4.7,8.9,2.6,20.1-5.3,28.6c-1.2,1.3-2.4,2.6-3.6,3.8c-16.7,17.8-25.9,28.5-19.6,41.4
+ c3.3,6.8,11.1,7.6,16.9,6.3c9.2-2.1,19.8-11.1,19.7-29.5c-0.2-28.1,16.2-41.8,30.2-44.9c14.5-3.2,28.4,3.6,34.7,17
+ c1.3,2.8,2.3,5.4,3.1,8.1c13.3,0.7,25.5,4.3,26,4.4l-3.4,11.5c-0.1,0-9.7-2.8-20.6-3.8c0.5,16.5-8.6,28.9-20.1,34.7
+ c-11.9,6-24,3.8-28.9-5.2c-3.1-5.6-1.9-14.7,2.9-22.5c7.9-13,21.3-17.4,31.5-18.8c-0.4-1.2-0.9-2.4-1.4-3.4
+ c-3.9-8.3-12.2-12.4-21.1-10.4c-9.7,2.2-21,12.1-20.8,33.1c0.2,25.5-15.6,38.1-29,41.3C160.5,247,158,247.3,155.6,247.3z
+ M237.8,197.7c-14,1.5-20.6,8.5-23.4,12.9c-3.3,5.2-3.4,9.8-2.9,10.9c1.6,2.9,7.3,3,13,0.2C235.3,216.2,238.3,206.6,237.8,197.7z
+ "/>
+ </g>
+ <rect x="118" y="144" class="st3" width="156" height="104"/>
+ </g>
+</g>
+</svg>
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/HandwritingModeButton.qml b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/HandwritingModeButton.qml
new file mode 100644
index 00000000..6167ad94
--- /dev/null
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/content/HandwritingModeButton.qml
@@ -0,0 +1,148 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd
+** All rights reserved.
+** For any questions to The Qt Company, please use contact form at http://qt.io
+**
+** This file is part of the Qt Virtual Keyboard module.
+**
+** Licensees holding valid commercial license for Qt may use this file in
+** accordance with the Qt License Agreement provided with the Software
+** or, alternatively, in accordance with the terms contained in a written
+** agreement between you and The Qt Company.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.io
+**
+******************************************************************************/
+
+import QtQuick 2.0
+
+Item {
+ id: handwritingModeButton
+ state: "unavailable"
+ property bool floating
+ property bool flipable
+ readonly property real __minWidthHeight: Math.min(width, height)
+
+ signal clicked()
+ signal doubleClicked()
+
+ Flipable {
+ id: flipableImage
+ anchors.fill: parent
+
+ property bool flipped
+
+ front: Image {
+ sourceSize.width: handwritingModeButton.__minWidthHeight
+ sourceSize.height: handwritingModeButton.__minWidthHeight
+ smooth: false
+ source: "qrc:/content/FloatingButton_Unavailable.svg"
+ }
+
+ back: Image {
+ id: buttonImage
+ sourceSize.width: handwritingModeButton.__minWidthHeight
+ sourceSize.height: handwritingModeButton.__minWidthHeight
+ smooth: false
+ source: "qrc:/content/FloatingButton_Available.svg"
+ }
+
+ states: State {
+ PropertyChanges { target: rotation; angle: 180 }
+ when: flipableImage.flipped
+ }
+
+ transform: Rotation {
+ id: rotation
+ origin.x: flipableImage.width / 2
+ origin.y: flipableImage.height / 2
+ axis { x: 0; y: 1; z: 0 }
+ angle: 0
+ }
+
+ transitions: Transition {
+ enabled: handwritingModeButton.flipable
+ NumberAnimation { target: rotation; property: "angle"; duration: 400 }
+ }
+ }
+
+ states: [
+ State {
+ name: "available"
+ PropertyChanges { target: flipableImage; flipped: true }
+ },
+ State {
+ name: "active"
+ PropertyChanges { target: flipableImage; flipped: true }
+ PropertyChanges { target: buttonImage; source: "qrc:/content/FloatingButton_Active.svg" }
+ }
+ ]
+
+ function snapHorizontal() {
+ if (!floating)
+ return
+ if (mouseArea.drag.maximumX > 0 && anchors.left !== parent.left && anchors.right !== parent.right) {
+ if (x + 20 >= mouseArea.drag.maximumX)
+ anchors.right = parent.right
+ else if (x - 20 <= mouseArea.drag.minimumX)
+ anchors.left = parent.left
+ }
+ }
+
+ function snapVertical() {
+ if (!floating)
+ return
+ if (mouseArea.drag.maximumY > 0 && anchors.bottom !== parent.bottom && anchors.top !== parent.top) {
+ if (y + 20 >= mouseArea.drag.maximumY)
+ anchors.bottom = parent.bottom
+ else if (y - 20 <= mouseArea.drag.minimumY)
+ anchors.top = parent.top
+ }
+ }
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ drag {
+ target: handwritingModeButton.floating ? handwritingModeButton : undefined
+ axis: Drag.XAxis | Drag.YAxis
+ minimumX: 0
+ maximumX: Math.max(handwritingModeButton.parent.width - handwritingModeButton.width, 0)
+ onMaximumXChanged: handwritingModeButton.snapHorizontal()
+ minimumY: 0
+ maximumY: Math.max(handwritingModeButton.parent.height - handwritingModeButton.height, 0)
+ onMaximumYChanged: handwritingModeButton.snapVertical()
+ }
+ onPressed: {
+ if (!handwritingModeButton.floating)
+ return
+ handwritingModeButton.anchors.left = undefined
+ handwritingModeButton.anchors.top = undefined
+ handwritingModeButton.anchors.right = undefined
+ handwritingModeButton.anchors.bottom = undefined
+ }
+ onReleased: {
+ handwritingModeButton.snapHorizontal()
+ handwritingModeButton.snapVertical()
+ }
+ onClicked: {
+ handwritingModeButton.snapHorizontal()
+ handwritingModeButton.snapVertical()
+ clickTimer.restart()
+ }
+ onDoubleClicked: {
+ clickTimer.stop()
+ handwritingModeButton.snapHorizontal()
+ handwritingModeButton.snapVertical()
+ handwritingModeButton.doubleClicked()
+ }
+ Timer {
+ id: clickTimer
+ interval: Qt.styleHints ? Qt.styleHints.mouseDoubleClickInterval / 3 : 0
+ repeat: false
+ onTriggered: handwritingModeButton.clicked()
+ }
+ }
+}
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/demo.qrc b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/demo.qrc
index ec99625a..bcb4a9d4 100644
--- a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/demo.qrc
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/demo.qrc
@@ -6,5 +6,9 @@
<file>content/TextArea.qml</file>
<file>content/TextBase.qml</file>
<file>content/TextField.qml</file>
+ <file>content/HandwritingModeButton.qml</file>
+ <file>content/FloatingButton_Active.svg</file>
+ <file>content/FloatingButton_Available.svg</file>
+ <file>content/FloatingButton_Unavailable.svg</file>
</qresource>
</RCC>
diff --git a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/virtualkeyboard.pro b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/virtualkeyboard.pro
index 8dd69825..a3c596b5 100644
--- a/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/virtualkeyboard.pro
+++ b/examples/quick/enterprise/virtualkeyboard/virtualkeyboard/virtualkeyboard.pro
@@ -17,6 +17,7 @@ RESOURCES += \
OTHER_FILES += \
VirtualKeyboard.qml \
VirtualKeyboard-b2qt.qml \
+ content/HandwritingModeButton.qml \
content/ScrollBar.qml \
content/TextArea.qml \
content/TextBase.qml \
diff --git a/src/virtualkeyboard/appinputpanel.cpp b/src/virtualkeyboard/appinputpanel.cpp
index edb25416..1fec9cb1 100644
--- a/src/virtualkeyboard/appinputpanel.cpp
+++ b/src/virtualkeyboard/appinputpanel.cpp
@@ -17,19 +17,11 @@
******************************************************************************/
#include "appinputpanel.h"
-#include <QtCore/private/qobject_p.h>
-class AppInputPanelPrivate : public QObjectPrivate
+AppInputPanel::AppInputPanel(AppInputPanelPrivate &dd, QObject *parent) :
+ AbstractInputPanel(dd, parent)
{
-public:
- AppInputPanelPrivate() :
- QObjectPrivate(),
- visible(false)
- {
- }
-
- bool visible;
-};
+}
AppInputPanel::AppInputPanel(QObject *parent) :
AbstractInputPanel(*new AppInputPanelPrivate(), parent)
diff --git a/src/virtualkeyboard/appinputpanel.h b/src/virtualkeyboard/appinputpanel.h
index 4c98b365..48428c6c 100644
--- a/src/virtualkeyboard/appinputpanel.h
+++ b/src/virtualkeyboard/appinputpanel.h
@@ -20,13 +20,28 @@
#define APPINPUTPANEL_H
#include "abstractinputpanel.h"
+#include <QtCore/private/qobject_p.h>
-class AppInputPanelPrivate;
+class AppInputPanelPrivate : public QObjectPrivate
+{
+public:
+ AppInputPanelPrivate() :
+ QObjectPrivate(),
+ visible(false)
+ {
+ }
+
+ bool visible;
+};
class AppInputPanel : public AbstractInputPanel
{
Q_OBJECT
Q_DECLARE_PRIVATE(AppInputPanel)
+
+protected:
+ AppInputPanel(AppInputPanelPrivate &dd, QObject *parent = 0);
+
public:
explicit AppInputPanel(QObject *parent = 0);
~AppInputPanel();
diff --git a/src/virtualkeyboard/content/HandwritingInputPanel.qml b/src/virtualkeyboard/content/HandwritingInputPanel.qml
new file mode 100644
index 00000000..39d5829e
--- /dev/null
+++ b/src/virtualkeyboard/content/HandwritingInputPanel.qml
@@ -0,0 +1,120 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd
+** All rights reserved.
+** For any questions to The Qt Company, please use contact form at http://qt.io
+**
+** This file is part of the Qt Virtual Keyboard module.
+**
+** Licensees holding valid commercial license for Qt may use this file in
+** accordance with the Qt License Agreement provided with the Software
+** or, alternatively, in accordance with the terms contained in a written
+** agreement between you and The Qt Company.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.io
+**
+******************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.2
+import QtQuick.Enterprise.VirtualKeyboard 2.0
+
+/*!
+ \qmltype HandwritingInputPanel
+ \inqmlmodule QtQuick.Enterprise.VirtualKeyboard
+ \since QtQuick.Enterprise.VirtualKeyboard 2.0
+
+ \brief Provides a handwriting panel add-on for the virtual keyboard UI.
+ \ingroup qtvirtualkeyboard-qml
+
+ The HandwritingInputPanel is an add-on component for the InputPanel, which
+ enables full-screen handwriting input for the application.
+
+ HandwritingInputPanel is designed to be anchored to full screen alongside
+ the InputPanel. The operating principle is that when the handwriting panel
+ is "available", the InputPanel is invisible. This functionality is built-in,
+ and requires no more than a reference to InputPanel instance.
+
+ The panel is set into operation by setting the \l {HandwritingInputPanel::available} {HandwritingInputPanel.available}
+ property to true. When the panel is in operation, the keyboard remains hidden
+ when the input focus is set. When the available is true, handwriting input is
+ activated by setting the \l {HandwritingInputPanel::active} {HandwritingInputPanel.active} property to true.
+
+ The user interface, which provides controls for handwriting mode and the
+ visibility of the keyboard, is application specific. One suggested implementation
+ is to use a floating button on the handwriting panel where single click toggles
+ the handwriting mode (changes the \l {HandwritingInputPanel::active} {active} property), and double-click toggles
+ the visibility of the keyboard (changes the \l {HandwritingInputPanel::available} {available} property).
+
+ HandwritingInputPanel also provides word candidate popup which allows the user
+ to select an alternative word candidate from the list of suggestions generated
+ by the handwriting input method.
+*/
+
+Item {
+ id: handwritingInputPanel
+
+ /*! A reference to the input panel instance.
+
+ This property must be set to the existing input panel instance.
+ */
+ property var inputPanel
+
+ /*! This property controls the availability status of the handwriting input method.
+
+ Setting the property to true prepares the handwriting input method and inhibits
+ the display of keyboard.
+ */
+ property bool available
+
+ /*! This property controls the active status of the handwriting input method.
+
+ Setting the property to true activates the handwriting input method. When the
+ handwriting input method is active, all the touch input is captured by the
+ handwriting input panel and redirected to input engine for processing.
+ */
+ property bool active
+
+ state: enabled && available ? (active ? "active" : "available") : "unavailable"
+ enabled: inputPanel.keyboard.isHandwritingAvailable()
+ visible: enabled && available && active && Qt.inputMethod.visible
+
+ Item {
+ id: keyboard
+ property var style: inputPanel && inputPanel.hasOwnProperty ? inputPanel.keyboard.style : null
+ property var soundEffect: inputPanel && inputPanel.hasOwnProperty ? inputPanel.keyboard.soundEffect : null
+ }
+
+ onEnabledChanged: inputPanel.keyboard.fullScreenHandwritingMode = enabled && available
+ onAvailableChanged: inputPanel.keyboard.fullScreenHandwritingMode = enabled && available
+
+ TraceInputArea {
+ id: hwrInputArea
+ enabled: handwritingInputPanel.enabled && handwritingInputPanel.available && handwritingInputPanel.active
+ objectName: "hwrInputArea"
+ anchors.fill: parent
+ patternRecognitionMode: InputEngine.HandwritingRecoginition
+ canvasType: "fullscreen"
+ }
+
+ Binding {
+ target: InputContext
+ property: "keyboardRectangle"
+ value: Qt.rect(hwrInputArea.x, hwrInputArea.y, hwrInputArea.width, hwrInputArea.height)
+ when: handwritingInputPanel.enabled && handwritingInputPanel.available && handwritingInputPanel.active
+ }
+
+ Binding {
+ target: inputPanel ? inputPanel.keyboard : null
+ property: "active"
+ value: false
+ when: handwritingInputPanel.enabled && handwritingInputPanel.available
+ }
+
+ WordCandidatePopupList {
+ z: 1
+ objectName: "wordCandidatePopupList"
+ enabled: handwritingInputPanel.enabled && handwritingInputPanel.available && handwritingInputPanel.active
+ }
+}
diff --git a/src/virtualkeyboard/content/InputPanel.qml b/src/virtualkeyboard/content/InputPanel.qml
index 60c3526c..ccfcb048 100644
--- a/src/virtualkeyboard/content/InputPanel.qml
+++ b/src/virtualkeyboard/content/InputPanel.qml
@@ -33,6 +33,19 @@ import QtQuick.Enterprise.VirtualKeyboard 2.0
*/
Item {
+ id: inputPanel
+
+ /*! \qmlproperty bool Active state of the input panel
+ \since QtQuick.Enterprise.VirtualKeyboard 2.0
+
+ This property reflects the active status of the input panel.
+ The keyboard should be made visible to user when the active is true.
+ */
+ property alias active: keyboard.active
+
+ /*! \internal */
+ property alias keyboard: keyboard
+
implicitHeight: keyboard.height
Keyboard {
id: keyboard
diff --git a/src/virtualkeyboard/content/components/HandwritingModeKey.qml b/src/virtualkeyboard/content/components/HandwritingModeKey.qml
index 554c8a69..2c044475 100644
--- a/src/virtualkeyboard/content/components/HandwritingModeKey.qml
+++ b/src/virtualkeyboard/content/components/HandwritingModeKey.qml
@@ -34,7 +34,7 @@ Key {
key: Qt.Key_Context2
displayText: "HWR"
functionKey: true
- visible: VirtualKeyboardInputMethods.indexOf("HandwritingInputMethod") !== -1
+ visible: keyboard.isHandwritingAvailable()
onClicked: keyboard.handwritingMode = !keyboard.handwritingMode
keyPanelDelegate: keyboard.style ? keyboard.style.handwritingKeyPanel : undefined
}
diff --git a/src/virtualkeyboard/content/components/Keyboard.qml b/src/virtualkeyboard/content/components/Keyboard.qml
index f0f4d908..8cabc4cd 100644
--- a/src/virtualkeyboard/content/components/Keyboard.qml
+++ b/src/virtualkeyboard/content/components/Keyboard.qml
@@ -50,6 +50,7 @@ Item {
property bool active: Qt.inputMethod.visible
property bool uppercased: InputContext.shift
property bool handwritingMode
+ property bool fullScreenHandwritingMode
property bool symbolMode
property var defaultInputMethod: initDefaultInputMethod()
property var plainInputMethod: PlainInputMethod {}
@@ -101,6 +102,8 @@ Item {
inputModeNeedsReset = true
updateInputMethod()
}
+ onHandwritingModeChanged: if (!keyboard.handwritingMode) keyboard.fullScreenHandwritingMode = false
+ onFullScreenHandwritingModeChanged: if (keyboard.fullScreenHandwritingMode) keyboard.handwritingMode = true
Connections {
target: InputContext
@@ -404,7 +407,7 @@ Item {
target: InputContext
property: "keyboardRectangle"
value: Qt.rect(keyboard.x, keyboard.y, keyboard.width, keyboard.height)
- when: !InputContext.animating
+ when: keyboard.active && !InputContext.animating
}
Loader {
id: styleLoader
@@ -1021,4 +1024,8 @@ Item {
return layoutFile
return ""
}
+
+ function isHandwritingAvailable() {
+ return VirtualKeyboardInputMethods.indexOf("HandwritingInputMethod") !== -1 && layoutExists(locale, "handwriting")
+ }
}
diff --git a/src/virtualkeyboard/content/components/TraceInputArea.qml b/src/virtualkeyboard/content/components/TraceInputArea.qml
index 5bc38f6a..3043f141 100644
--- a/src/virtualkeyboard/content/components/TraceInputArea.qml
+++ b/src/virtualkeyboard/content/components/TraceInputArea.qml
@@ -75,6 +75,14 @@ MultiPointTouchArea {
traceInputArea.height) :
Qt.rect(0, 0, 0, 0)
+ /*! Canvas type of this trace input area.
+
+ This property can be used to distinguish between different types of canvases.
+ For example, in full screen handwriting mode this property is set to "fullscreen", and
+ in keyboard handwriting mode this property is set to "keyboard".
+ */
+ property string canvasType
+
property var __traceCanvasList: ([])
/*! \internal */
@@ -103,7 +111,8 @@ MultiPointTouchArea {
({
boundingBox: traceInputArea.boundingBox,
horizontalRulers: traceInputArea.horizontalRulers,
- verticalRulers: traceInputArea.verticalRulers
+ verticalRulers: traceInputArea.verticalRulers,
+ canvasType: traceInputArea.canvasType
})
enabled: patternRecognitionMode !== InputEngine.PatternRecognitionDisabled && InputContext.inputEngine.patternRecognitionModes.indexOf(patternRecognitionMode) !== -1
diff --git a/src/virtualkeyboard/content/components/TraceInputKey.qml b/src/virtualkeyboard/content/components/TraceInputKey.qml
index 30ec01cb..6309d6f0 100644
--- a/src/virtualkeyboard/content/components/TraceInputKey.qml
+++ b/src/virtualkeyboard/content/components/TraceInputKey.qml
@@ -76,11 +76,19 @@ Item {
*/
readonly property alias boundingBox: traceInputArea.boundingBox
+ /*! Canvas type of this trace input area.
+
+ This property can be used to distinguish between different types of canvases.
+ The default value is "keyboard".
+ */
+ property alias canvasType: traceInputArea.canvasType
+
Layout.minimumWidth: traceInputKeyPanel.implicitWidth
Layout.minimumHeight: traceInputKeyPanel.implicitHeight
Layout.preferredWidth: weight
Layout.fillWidth: true
Layout.fillHeight: true
+ canvasType: "keyboard"
Loader {
id: traceInputKeyPanel
diff --git a/src/virtualkeyboard/content/components/WordCandidatePopupList.qml b/src/virtualkeyboard/content/components/WordCandidatePopupList.qml
new file mode 100644
index 00000000..3032f911
--- /dev/null
+++ b/src/virtualkeyboard/content/components/WordCandidatePopupList.qml
@@ -0,0 +1,78 @@
+/******************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd
+** All rights reserved.
+** For any questions to The Qt Company, please use contact form at http://qt.io
+**
+** This file is part of the Qt Virtual Keyboard module.
+**
+** Licensees holding valid commercial license for Qt may use this file in
+** accordance with the Qt License Agreement provided with the Software
+** or, alternatively, in accordance with the terms contained in a written
+** agreement between you and The Qt Company.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.io
+**
+******************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Enterprise.VirtualKeyboard 2.0
+
+ListView {
+ id: wordCandidatePopupList
+
+ property int maxVisibleItems: 5
+ readonly property real contentWidth: contentItem.childrenRect.width
+
+ clip: true
+ visible: enabled && count > 0
+ height: currentItem ? currentItem.height * Math.min(maxVisibleItems, count) + (spacing * Math.min(maxVisibleItems, count) - 1) : 0
+ Binding {
+ target: wordCandidatePopupList
+ property: "x"
+ value: Qt.inputMethod.cursorRectangle.x -
+ (wordCandidatePopupList.currentItem ?
+ (wordCandidatePopupList.currentItem.hasOwnProperty("cursorAnchor") ?
+ wordCandidatePopupList.currentItem.cursorAnchor : wordCandidatePopupList.currentItem.width) : 0)
+ when: wordCandidatePopupList.visible
+ }
+ Binding {
+ target: wordCandidatePopupList
+ property: "y"
+ value: Qt.inputMethod.cursorRectangle.y + Qt.inputMethod.cursorRectangle.height
+ when: wordCandidatePopupList.visible
+ }
+ orientation: ListView.Vertical
+ snapMode: ListView.SnapToItem
+ delegate: keyboard.style.popupListDelegate
+ highlight: keyboard.style.popupListHighlight ? keyboard.style.popupListHighlight : null
+ highlightMoveDuration: 0
+ highlightResizeDuration: 0
+ add: keyboard.style.popupListAdd
+ remove: keyboard.style.popupListRemove
+ keyNavigationWraps: true
+ model: enabled ? InputContext.inputEngine.wordCandidateListModel : null
+
+ onContentWidthChanged: viewResizeTimer.restart()
+ onCurrentItemChanged: if (currentItem) keyboard.soundEffect.register(currentItem.soundEffect)
+
+ Timer {
+ id: viewResizeTimer
+ interval: 0
+ repeat: false
+ onTriggered: wordCandidatePopupList.width = wordCandidatePopupList.contentWidth
+ }
+
+ Connections {
+ target: wordCandidatePopupList.model ? wordCandidatePopupList.model : null
+ onActiveItemChanged: wordCandidatePopupList.currentIndex = index
+ onItemSelected: if (wordCandidatePopupList.currentItem) keyboard.soundEffect.play(wordCandidatePopupList.currentItem.soundEffect)
+ }
+
+ Loader {
+ sourceComponent: keyboard.style.popupListBackground
+ anchors.fill: parent
+ z: -1
+ }
+}
diff --git a/src/virtualkeyboard/content/content.qrc b/src/virtualkeyboard/content/content.qrc
index 6c23d86a..9814208e 100644
--- a/src/virtualkeyboard/content/content.qrc
+++ b/src/virtualkeyboard/content/content.qrc
@@ -1,6 +1,7 @@
<RCC>
<qresource prefix="/content">
<file>InputPanel.qml</file>
+ <file>HandwritingInputPanel.qml</file>
<file>components/AlternativeKeys.qml</file>
<file>components/AutoScroller.qml</file>
<file>components/BackspaceKey.qml</file>
@@ -25,5 +26,6 @@
<file>components/TraceInputKey.qml</file>
<file>components/TraceInputArea.qml</file>
<file>components/HandwritingModeKey.qml</file>
+ <file>components/WordCandidatePopupList.qml</file>
</qresource>
</RCC>
diff --git a/src/virtualkeyboard/content/styles/default/style.qml b/src/virtualkeyboard/content/styles/default/style.qml
index 827f3617..2737de43 100644
--- a/src/virtualkeyboard/content/styles/default/style.qml
+++ b/src/virtualkeyboard/content/styles/default/style.qml
@@ -719,13 +719,73 @@ KeyboardStyle {
if (!available)
return
var ctx = getContext("2d")
- ctx.lineWidth = 10 * scaleHint
+ if (parent.canvasType === "fullscreen") {
+ ctx.lineWidth = 10
+ ctx.strokeStyle = Qt.rgba(0, 0, 0)
+ } else {
+ ctx.lineWidth = 10 * scaleHint
+ ctx.strokeStyle = Qt.rgba(0xFF, 0xFF, 0xFF)
+ }
ctx.lineCap = "round"
- ctx.strokeStyle = Qt.rgba(0xFF, 0xFF, 0xFF)
ctx.fillStyle = ctx.strokeStyle
}
autoDestroyDelay: 800
onTraceChanged: if (trace === null) opacity = 0
Behavior on opacity { PropertyAnimation { easing.type: Easing.OutCubic; duration: 150 } }
}
+
+ popupListDelegate: SelectionListItem {
+ property real cursorAnchor: popupListLabel.x + popupListLabel.width
+ id: popupListItem
+ width: popupListLabel.width + popupListLabel.anchors.leftMargin * 2
+ height: popupListLabel.height + popupListLabel.anchors.topMargin * 2
+ Text {
+ id: popupListLabel
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.leftMargin: popupListLabel.height / 2
+ anchors.topMargin: popupListLabel.height / 3
+ text: decorateText(display, wordCompletionLength)
+ color: "#5CAA15"
+ font {
+ family: fontFamily
+ weight: Font.Normal
+ pixelSize: Qt.inputMethod.cursorRectangle.height * 0.8
+ }
+ function decorateText(text, wordCompletionLength) {
+ if (wordCompletionLength > 0) {
+ return text.slice(0, -wordCompletionLength) + '<u>' + text.slice(-wordCompletionLength) + '</u>'
+ }
+ return text
+ }
+ }
+ states: State {
+ name: "current"
+ when: popupListItem.ListView.isCurrentItem
+ PropertyChanges {
+ target: popupListLabel
+ color: "black"
+ }
+ }
+ }
+
+ popupListBackground: Item {
+ Rectangle {
+ width: parent.width
+ height: parent.height
+ color: "white"
+ border {
+ width: 1
+ color: "#929495"
+ }
+ }
+ }
+
+ popupListAdd: Transition {
+ NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 200 }
+ }
+
+ popupListRemove: Transition {
+ NumberAnimation { property: "opacity"; to: 0; duration: 200 }
+ }
}
diff --git a/src/virtualkeyboard/content/styles/retro/style.qml b/src/virtualkeyboard/content/styles/retro/style.qml
index c8dbf7a2..bc825cae 100644
--- a/src/virtualkeyboard/content/styles/retro/style.qml
+++ b/src/virtualkeyboard/content/styles/retro/style.qml
@@ -849,7 +849,7 @@ KeyboardStyle {
if (!available)
return
var ctx = getContext("2d")
- ctx.lineWidth = 10 * scaleHint
+ ctx.lineWidth = parent.canvasType === "fullscreen" ? 10 : 10 * scaleHint
ctx.lineCap = "round"
ctx.strokeStyle = Qt.rgba(0, 0, 0)
ctx.fillStyle = ctx.strokeStyle
@@ -858,4 +858,59 @@ KeyboardStyle {
onTraceChanged: if (trace === null) opacity = 0
Behavior on opacity { PropertyAnimation { easing.type: Easing.OutCubic; duration: 150 } }
}
+
+ popupListDelegate: SelectionListItem {
+ property real cursorAnchor: popupListLabel.x + popupListLabel.width
+ id: popupListItem
+ width: popupListLabel.width + popupListLabel.anchors.leftMargin * 2
+ height: popupListLabel.height + popupListLabel.anchors.topMargin * 2
+ Text {
+ id: popupListLabel
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.leftMargin: popupListLabel.height / 2
+ anchors.topMargin: popupListLabel.height / 3
+ text: decorateText(display, wordCompletionLength)
+ color: "#5CAA15"
+ font {
+ family: "Sans"
+ weight: Font.Normal
+ pixelSize: Qt.inputMethod.cursorRectangle.height * 0.8
+ }
+ function decorateText(text, wordCompletionLength) {
+ if (wordCompletionLength > 0) {
+ return text.slice(0, -wordCompletionLength) + '<u>' + text.slice(-wordCompletionLength) + '</u>'
+ }
+ return text
+ }
+ }
+ states: State {
+ name: "current"
+ when: popupListItem.ListView.isCurrentItem
+ PropertyChanges {
+ target: popupListLabel
+ color: "black"
+ }
+ }
+ }
+
+ popupListBackground: Item {
+ Rectangle {
+ width: parent.width
+ height: parent.height
+ color: "white"
+ border {
+ width: 1
+ color: "#929495"
+ }
+ }
+ }
+
+ popupListAdd: Transition {
+ NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 200 }
+ }
+
+ popupListRemove: Transition {
+ NumberAnimation { property: "opacity"; to: 0; duration: 200 }
+ }
}
diff --git a/src/virtualkeyboard/desktopinputpanel.cpp b/src/virtualkeyboard/desktopinputpanel.cpp
index 7251954f..c7c5e21e 100644
--- a/src/virtualkeyboard/desktopinputpanel.cpp
+++ b/src/virtualkeyboard/desktopinputpanel.cpp
@@ -32,11 +32,11 @@
#include <QtCore/private/qobject_p.h>
#include <QtCore/QLibraryInfo>
-class DesktopInputPanelPrivate : public QObjectPrivate
+class DesktopInputPanelPrivate : public AppInputPanelPrivate
{
public:
DesktopInputPanelPrivate() :
- QObjectPrivate(),
+ AppInputPanelPrivate(),
view(),
keyboardRect(),
previewRect(),
@@ -51,7 +51,7 @@ public:
};
DesktopInputPanel::DesktopInputPanel(QObject *parent) :
- AbstractInputPanel(*new DesktopInputPanelPrivate(), parent)
+ AppInputPanel(*new DesktopInputPanelPrivate(), parent)
{
/* Activate the alpha buffer for this application.
*/
@@ -66,6 +66,7 @@ DesktopInputPanel::~DesktopInputPanel()
void DesktopInputPanel::show()
{
+ AppInputPanel::show();
Q_D(DesktopInputPanel);
if (d->view) {
repositionView(QGuiApplication::primaryScreen()->availableGeometry());
@@ -75,6 +76,7 @@ void DesktopInputPanel::show()
void DesktopInputPanel::hide()
{
+ AppInputPanel::hide();
Q_D(DesktopInputPanel);
if (d->view)
d->view->hide();
@@ -82,8 +84,7 @@ void DesktopInputPanel::hide()
bool DesktopInputPanel::isVisible() const
{
- Q_D(const DesktopInputPanel);
- return d->view && d->view->isVisible();
+ return AppInputPanel::isVisible();
}
void DesktopInputPanel::setInputRect(const QRect &inputRect)
diff --git a/src/virtualkeyboard/desktopinputpanel.h b/src/virtualkeyboard/desktopinputpanel.h
index 10f7de3e..a97c0576 100644
--- a/src/virtualkeyboard/desktopinputpanel.h
+++ b/src/virtualkeyboard/desktopinputpanel.h
@@ -19,7 +19,7 @@
#ifndef DESKTOPINPUTPANEL_H
#define DESKTOPINPUTPANEL_H
-#include "abstractinputpanel.h"
+#include "appinputpanel.h"
QT_BEGIN_NAMESPACE
class QWindow;
@@ -27,7 +27,7 @@ QT_END_NAMESPACE
class DesktopInputPanelPrivate;
-class DesktopInputPanel : public AbstractInputPanel
+class DesktopInputPanel : public AppInputPanel
{
Q_OBJECT
Q_DECLARE_PRIVATE(DesktopInputPanel)
diff --git a/src/virtualkeyboard/plugin.cpp b/src/virtualkeyboard/plugin.cpp
index d796c249..542d89d2 100644
--- a/src/virtualkeyboard/plugin.cpp
+++ b/src/virtualkeyboard/plugin.cpp
@@ -145,6 +145,7 @@ QPlatformInputContext *PlatformInputContextPlugin::create(const QString &system,
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 1, 2, "InputPanel");
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 1, 3, "InputPanel");
qmlRegisterType(QUrl(path + QLatin1String("InputPanel.qml")), pluginUri, 2, 0, "InputPanel");
+ qmlRegisterType(QUrl(path + QLatin1String("HandwritingInputPanel.qml")), pluginUri, 2, 0, "HandwritingInputPanel");
const QString componentsPath = path + QStringLiteral("components/");
qmlRegisterType(QUrl(componentsPath + QLatin1String("AlternativeKeys.qml")), pluginUri, 1, 0, "AlternativeKeys");
qmlRegisterType(QUrl(componentsPath + QLatin1String("AutoScroller.qml")), pluginUri, 1, 0, "AutoScroller");
@@ -190,6 +191,7 @@ QPlatformInputContext *PlatformInputContextPlugin::create(const QString &system,
qmlRegisterType(QUrl(componentsPath + QLatin1String("HandwritingModeKey.qml")), pluginUri, 2, 0, "HandwritingModeKey");
qmlRegisterType(QUrl(componentsPath + QLatin1String("TraceInputArea.qml")), pluginUri, 2, 0, "TraceInputArea");
qmlRegisterType(QUrl(componentsPath + QLatin1String("TraceInputKey.qml")), pluginUri, 2, 0, "TraceInputKey");
+ qmlRegisterType(QUrl(componentsPath + QLatin1String("WordCandidatePopupList.qml")), pluginUri, 2, 0, "WordCandidatePopupList");
if (system.compare(system, QLatin1String(pluginName), Qt::CaseInsensitive) == 0) {
platformInputContext = new PlatformInputContext();
diff --git a/src/virtualkeyboard/styles/KeyboardStyle.qml b/src/virtualkeyboard/styles/KeyboardStyle.qml
index 50ae5ca6..fbb3a328 100644
--- a/src/virtualkeyboard/styles/KeyboardStyle.qml
+++ b/src/virtualkeyboard/styles/KeyboardStyle.qml
@@ -282,4 +282,47 @@ QtObject {
\note The delegate must be based on TraceCanvas type.
*/
property Component traceCanvasDelegate: null
+
+ /*! \since QtQuick.Enterprise.VirtualKeyboard.Styles 2.0
+
+ Template for the popup list item.
+
+ \note The delegate is used as \c ListView.delegate.
+ \note The delegate must be based on SelectionListItem type.
+
+ The following attached properties are available to the item:
+ \list
+ \li \c display Display text for current item.
+ \li \c wordCompletionLength Word completion length measured from the end of the display text.
+ \endlist
+ */
+ property Component popupListDelegate: null
+
+ /*! \since QtQuick.Enterprise.VirtualKeyboard.Styles 2.0
+
+ Template for the popup list highlight.
+
+ \note The delegate is used as \c ListView.highlight.
+ */
+ property Component popupListHighlight: null
+
+ /*! \since QtQuick.Enterprise.VirtualKeyboard.Styles 2.0
+
+ Template for the popup list background.
+ */
+ property Component popupListBackground: null
+
+ /*! \since QtQuick.Enterprise.VirtualKeyboard.Styles 2.0
+
+ This property holds the transition to apply to items that
+ are added to the popup list view.
+ */
+ property Transition popupListAdd
+
+ /*! \since QtQuick.Enterprise.VirtualKeyboard.Styles 2.0
+
+ This property holds the transition to apply to items that
+ are removed from the popup list view.
+ */
+ property Transition popupListRemove
}