Comments only, no code changes. Replaces vague or personified phrasing with explicit statements of what the code does and why, uses bullet lists for multi-case behavior, and fixes the settings path in WindowSettings.h (~/.config/sloposk/sloposk.conf). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
120 lines
4.6 KiB
QML
120 lines
4.6 KiB
QML
import QtQuick
|
|
import Sloposk
|
|
|
|
Window {
|
|
id: root
|
|
|
|
required property LayoutModel layoutModel
|
|
required property KeyboardController controller
|
|
required property Settings settings
|
|
required property Diagnostics diagnostics
|
|
property var placement: null // FloatingWindow, set from C++
|
|
property var collapse: null // CollapseController, set from C++
|
|
readonly property bool collapsed: collapse?.collapsed ?? false
|
|
property bool settingsOpen: false
|
|
// Read by C++ to keep key size constant when rows are added or removed.
|
|
readonly property real keysHeight: keyboard.height
|
|
|
|
// Transparent space above the keyboard for the top row's long-press popups.
|
|
readonly property real popupMargin: 90
|
|
// Input outside this rect goes to the window underneath.
|
|
readonly property rect inputRegion: collapsed
|
|
? Qt.rect(floatingButton.x, floatingButton.y, floatingButton.width, floatingButton.height)
|
|
: keyboard.alternates.open
|
|
? Qt.rect(0, 0, width, height)
|
|
: Qt.rect(panel.x, panel.y, panel.width, panel.height)
|
|
// Empty (no blur) when collapsed, blur is off, or the background is opaque.
|
|
readonly property rect blurRegion: !collapsed && settings.blurBackground && settings.backgroundOpacity < 1
|
|
? Qt.rect(panel.x, panel.y, panel.width, panel.height)
|
|
: Qt.rect(0, 0, 0, 0)
|
|
|
|
width: 1000
|
|
height: 340 + popupMargin
|
|
// No minimum while collapsed, so the window can shrink to the button.
|
|
minimumWidth: collapsed ? 0 : 480
|
|
minimumHeight: collapsed ? 0 : 180 + popupMargin
|
|
visible: false
|
|
color: "transparent"
|
|
|
|
// Ignore close requests (Alt+F4, task manager): they would hide the window
|
|
// without VisibilityController knowing. Hiding goes through the dismiss key or tray toggle.
|
|
onClosing: close => close.accepted = false
|
|
onInputRegionChanged: placement?.setInputRegion(inputRegion)
|
|
onBlurRegionChanged: placement?.setBlurRegion(blurRegion, Theme.windowRadius)
|
|
// Called by CollapseController.
|
|
function dismissKeyRect() {
|
|
return keyboard.keyRect("dismiss");
|
|
}
|
|
|
|
onPlacementChanged: {
|
|
placement?.setInputRegion(inputRegion);
|
|
placement?.setBlurRegion(blurRegion, Theme.windowRadius);
|
|
}
|
|
|
|
Rectangle {
|
|
id: panel
|
|
anchors { fill: parent; topMargin: root.popupMargin }
|
|
visible: !root.collapsed
|
|
radius: Theme.windowRadius
|
|
color: Qt.rgba(Theme.background.r, Theme.background.g, Theme.background.b, root.settings.backgroundOpacity)
|
|
|
|
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
|
|
popupHeadroom: root.popupMargin + anchors.margins
|
|
}
|
|
|
|
SettingsPanel {
|
|
anchors.fill: keyboard
|
|
visible: root.settingsOpen
|
|
settings: root.settings
|
|
layoutModel: root.layoutModel
|
|
diagnostics: root.diagnostics
|
|
}
|
|
|
|
DragHandle {
|
|
id: handle
|
|
anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
|
|
pillWidth: Math.min(120, width - 2 * (quickToggles.x + quickToggles.width + 12))
|
|
onDragStarted: root.placement.startMove()
|
|
}
|
|
|
|
SettingsButton {
|
|
id: settingsButton
|
|
anchors { left: parent.left; leftMargin: 8; bottom: parent.bottom }
|
|
checked: root.settingsOpen
|
|
alert: root.diagnostics.problems.length > 0
|
|
onClicked: root.settingsOpen = !root.settingsOpen
|
|
}
|
|
|
|
QuickToggles {
|
|
id: quickToggles
|
|
anchors { left: settingsButton.right; bottom: parent.bottom }
|
|
settings: root.settings
|
|
layoutModel: root.layoutModel
|
|
}
|
|
|
|
ResizeHandle {
|
|
anchors { right: parent.right; bottom: parent.bottom }
|
|
onDragStarted: root.placement.startResize(Qt.RightEdge | Qt.BottomEdge)
|
|
}
|
|
}
|
|
|
|
FloatingButton {
|
|
id: floatingButton
|
|
readonly property rect keyRect: root.collapse?.keyRect ?? Qt.rect(0, 0, 0, 0)
|
|
// keyRect is in full-window coordinates; the clamp keeps the button inside the window once it has shrunk.
|
|
x: Math.max(0, Math.min(keyRect.x, root.width - width))
|
|
y: Math.max(0, Math.min(keyRect.y, root.height - height))
|
|
width: keyRect.width
|
|
height: keyRect.height
|
|
visible: root.collapsed
|
|
onTapped: root.collapse.expand()
|
|
onDragStarted: root.placement.startMove()
|
|
}
|
|
}
|