aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/FunctionPopupList.qml
blob: d9b2e1cd8940bfcc64a9c6fe83fe088e21f78b49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

import QtQuick
import QtQuick.VirtualKeyboard

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.HideInputPanel,
                 QtVirtualKeyboard.ChangeLanguage,
                 QtVirtualKeyboard.ToggleHandwritingMode,
             ]) {
            if (keyboard.isKeyboardFunctionAvailable(keyboardFunction)) {
                const listElement = {
                    keyboardFunction: keyboardFunction
                }
                listModel.append(listElement)
            }
        }
        origin = Qt.binding(function() {
            return Qt.point(Math.min(Math.max(0, originX), width - listView.width), originY)
        })
        listView.currentIndex = (listModel.count > 0) ? 0 : -1
        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
    }
}