// 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
    }
}
