aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/FunctionPopupList.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/FunctionPopupList.qml')
-rw-r--r--src/components/FunctionPopupList.qml110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/components/FunctionPopupList.qml b/src/components/FunctionPopupList.qml
new file mode 100644
index 00000000..ed617656
--- /dev/null
+++ b/src/components/FunctionPopupList.qml
@@ -0,0 +1,110 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.VirtualKeyboard
+import QtQuick.VirtualKeyboard.Settings
+
+Item {
+ property bool active
+ property alias listView: listView
+ property point origin
+ signal clicked
+ LayoutMirroring.enabled: false
+ LayoutMirroring.childrenInherit: true
+
+ z: 1
+ visible: active
+ anchors.fill: parent
+
+ ListModel {
+ id: listModel
+ }
+
+ ListView {
+ id: listView
+ spacing: 0
+ model: listModel
+ currentIndex: -1
+ delegate: keyboard.style.functionPopupListDelegate
+ highlight: keyboard.style.functionPopupListHighlight ? keyboard.style.functionPopupListHighlight : defaultHighlight
+ highlightMoveDuration: 0
+ highlightResizeDuration: 0
+ keyNavigationWraps: true
+ orientation: ListView.Horizontal
+ width: contentItem.childrenRect.width
+ height: contentItem.childrenRect.height
+ x: {
+ var result = origin.x
+ if (count > 0) {
+ const item = itemAtIndex(0)
+ if (item) {
+ result -= Math.round(item.width / 2)
+ }
+ }
+ return result
+ }
+ y: origin.y - height
+ Component {
+ id: defaultHighlight
+ Item {}
+ }
+ }
+
+ Loader {
+ id: backgroundLoader
+ sourceComponent: keyboard.style.functionPopupListBackground
+ anchors.fill: listView
+ z: -1
+ Binding {
+ target: backgroundLoader.item
+ property: "view"
+ value: listView
+ when: backgroundLoader.item && backgroundLoader.item.hasOwnProperty("view")
+ }
+ }
+
+ onClicked: {
+ if (active && listView.currentIndex >= 0 && listView.currentIndex < listView.model.count) {
+ const listElement = listView.model.get(listView.currentIndex)
+ keyboard.doKeyboardFunction(listElement.keyboardFunction)
+ }
+ }
+
+ function open(key, originX, originY) {
+ listModel.clear()
+ for (const keyboardFunction of [
+ QtVirtualKeyboard.KeyboardFunction.HideInputPanel,
+ QtVirtualKeyboard.KeyboardFunction.ChangeLanguage,
+ QtVirtualKeyboard.KeyboardFunction.ToggleHandwritingMode,
+ ]) {
+ const functionKey = InputContext.priv.keyboardFunctionKey(keyboardFunction)
+ if (keyboard.isKeyboardFunctionAvailable(keyboardFunction) &&
+ !(VirtualKeyboardSettings.visibleFunctionKeys & functionKey)) {
+ const listElement = {
+ keyboardFunction: keyboardFunction
+ }
+ listModel.append(listElement)
+ }
+ }
+ listView.currentIndex = (listModel.count > 0) ? 0 : -1
+ origin = Qt.binding(function() {
+ return Qt.point(Math.min(Math.max(0, originX), width - listView.width), originY)
+ })
+ active = listView.currentIndex !== -1
+ return active
+ }
+
+ function move(pt) {
+ var listPt = mapToItem(listView, pt.x, pt.y)
+ var newIndex = listView.indexAt(listPt.x, Math.max(1, Math.min(listView.height - 1, listPt.y)))
+ if (newIndex !== listView.currentIndex) {
+ listView.currentIndex = newIndex
+ }
+ }
+
+ function close() {
+ listView.currentIndex = -1
+ active = false
+ }
+}