import QtQuick import Sloposk Window { id: root required property LayoutModel layoutModel required property KeyboardController controller required property Settings settings property var placement: null // FloatingWindow, set from C++ property bool settingsOpen: false // Height of the key area, for C++ keeping key sizes when rows change. readonly property real keysHeight: keyboard.height // Transparent room above the keyboard for long-press popups on the top row. readonly property real popupMargin: 90 // Outside this, input passes through to whatever is below the window. readonly property rect inputRegion: keyboard.alternates.open ? Qt.rect(0, 0, width, height) : Qt.rect(panel.x, panel.y, panel.width, panel.height) width: 1000 height: 340 + popupMargin minimumWidth: 480 minimumHeight: 180 + popupMargin visible: false color: "transparent" onInputRegionChanged: placement?.setInputRegion(inputRegion) onPlacementChanged: placement?.setInputRegion(inputRegion) Rectangle { id: panel anchors { fill: parent; topMargin: root.popupMargin } radius: Theme.windowRadius color: Theme.background Keyboard { id: keyboard anchors { left: parent.left; right: parent.right; top: parent.top; bottom: handle.top } anchors.margins: 2 visible: !root.settingsOpen model: root.layoutModel controller: root.controller } SettingsPanel { anchors.fill: keyboard visible: root.settingsOpen settings: root.settings layoutModel: root.layoutModel } DragHandle { id: handle anchors { left: parent.left; right: parent.right; bottom: parent.bottom } onMoved: (dx, dy) => root.placement?.moveBy(dx, dy) } SettingsButton { anchors { left: parent.left; leftMargin: 8; bottom: parent.bottom } checked: root.settingsOpen onClicked: root.settingsOpen = !root.settingsOpen } ResizeHandle { anchors { right: parent.right; bottom: parent.bottom } onResized: (dw, dh) => root.placement?.resizeBy(dw, dh) } } }