// 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 !== null && 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 } }