| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:GPL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 3 or (at your option) any later version |
| ** approved by the KDE Free Qt Foundation. The licenses are as published by |
| ** the Free Software Foundation and appearing in the file LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| import QtQuick 2.7 |
| // Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. |
| import QtQml 2.14 |
| import QtQuick.VirtualKeyboard 2.2 |
| import QtQuick.VirtualKeyboard.Settings 2.2 |
| |
| Item { |
| id: control |
| |
| enabled: keyboard.active && VirtualKeyboardSettings.fullScreenMode |
| |
| MouseArea { |
| anchors.fill: parent |
| } |
| |
| onXChanged: InputContext.priv.shadow.updateSelectionProperties() |
| onYChanged: InputContext.priv.shadow.updateSelectionProperties() |
| |
| Loader { |
| sourceComponent: keyboard.style.fullScreenInputContainerBackground |
| anchors.fill: parent |
| Loader { |
| id: fullScreenInputBackground |
| sourceComponent: keyboard.style.fullScreenInputBackground |
| anchors.fill: parent |
| anchors.margins: keyboard.style.fullScreenInputMargins |
| z: 1 |
| Flickable { |
| id: flickable |
| clip: true |
| z: 2 |
| width: parent.width |
| height: parent.height |
| flickableDirection: Flickable.HorizontalFlick |
| interactive: contentWidth > width |
| contentWidth: shadowInput.width |
| onContentXChanged: InputContext.priv.shadow.updateSelectionProperties() |
| |
| function ensureVisible(rectangle) { |
| if (contentX >= rectangle.x) |
| contentX = rectangle.x |
| else if (contentX + width <= rectangle.x + rectangle.width) |
| contentX = rectangle.x + rectangle.width - width; |
| } |
| |
| TextInput { |
| id: shadowInput |
| objectName: "shadowInput" |
| property bool blinkStatus: true |
| width: Math.max(flickable.width, implicitWidth) |
| height: implicitHeight |
| anchors.verticalCenter: parent.verticalCenter |
| leftPadding: keyboard.style.fullScreenInputPadding |
| rightPadding: keyboard.style.fullScreenInputPadding |
| activeFocusOnPress: false |
| font: keyboard.style.fullScreenInputFont |
| inputMethodHints: InputContext.inputMethodHints |
| cursorDelegate: keyboard.style.fullScreenInputCursor |
| passwordCharacter: keyboard.style.fullScreenInputPasswordCharacter |
| color: keyboard.style.fullScreenInputColor |
| selectionColor: keyboard.style.fullScreenInputSelectionColor |
| selectedTextColor: keyboard.style.fullScreenInputSelectedTextColor |
| echoMode: (InputContext.inputMethodHints & Qt.ImhHiddenText) ? TextInput.Password : TextInput.Normal |
| selectByMouse: !!InputContext.inputItem && !!InputContext.inputItem.selectByMouse |
| onCursorPositionChanged: { |
| cursorSyncTimer.restart() |
| blinkStatus = true |
| cursorTimer.restart() |
| } |
| onSelectionStartChanged: cursorSyncTimer.restart() |
| onSelectionEndChanged: cursorSyncTimer.restart() |
| onCursorRectangleChanged: flickable.ensureVisible(cursorRectangle) |
| |
| function getAnchorPosition() { |
| if (selectionStart == selectionEnd) |
| return cursorPosition |
| else if (selectionStart == cursorPosition) |
| return selectionEnd |
| else |
| return selectionStart |
| } |
| |
| Timer { |
| id: cursorSyncTimer |
| interval: 0 |
| onTriggered: { |
| var anchorPosition = shadowInput.getAnchorPosition() |
| if (anchorPosition !== InputContext.anchorPosition || shadowInput.cursorPosition !== InputContext.cursorPosition) |
| InputContext.priv.forceCursorPosition(anchorPosition, shadowInput.cursorPosition) |
| } |
| } |
| |
| Timer { |
| id: cursorTimer |
| interval: Qt.styleHints.cursorFlashTime / 2 |
| repeat: true |
| running: true |
| onTriggered: shadowInput.blinkStatus = !shadowInput.blinkStatus |
| } |
| } |
| } |
| } |
| } |
| |
| Binding { |
| target: InputContext.priv.shadow |
| property: "inputItem" |
| value: shadowInput |
| when: VirtualKeyboardSettings.fullScreenMode |
| restoreMode: Binding.RestoreBinding |
| } |
| } |