Files
andrew b0c95b9e78 Add desktop app service and VM dev session tooling
Introduces a new `core/applications` QML/C++ module (`Nebula.Applications`) to discover `.desktop` entries, expose filterable application models, and launch installed apps safely from the shell. The desktop launcher now uses real installed apps with themed icon loading and fallback glyphs, adds output-aware surface sizing via `OutputTracker`, and wires in image/icon providers. It also adds VMware-focused Sway/shell wrapper scripts, updates Sway config/session env defaults, and refreshes README docs to document the new development flow and Desktop 0.1 behavior.
2026-08-26 17:19:30 +12:00

83 lines
2.5 KiB
QML

import QtQuick
import QtQuick.Window
import org.kde.layershell 1.0 as LayerShell
import Nebula.UI
Window {
id: root
readonly property int outputWidth: OutputTracker.width > 0
? OutputTracker.width
: (screen && screen.width > 0 ? screen.width : Screen.width)
readonly property int outputHeight: OutputTracker.height > 0
? OutputTracker.height
: (screen && screen.height > 0 ? screen.height : Screen.height)
title: qsTr("Nebula Launcher")
color: "transparent"
flags: Qt.FramelessWindowHint
visible: ShellState.launcherOpen || launcher.opacity > 0.01
width: outputWidth
height: Math.max(1, outputHeight - Theme.topBarHeight)
LayerShell.Window.scope: "nebula-launcher"
LayerShell.Window.layer: LayerShell.Window.LayerOverlay
LayerShell.Window.anchors: LayerShell.Window.AnchorTop
| LayerShell.Window.AnchorBottom
| LayerShell.Window.AnchorLeft
| LayerShell.Window.AnchorRight
LayerShell.Window.margins.top: Theme.topBarHeight
LayerShell.Window.exclusionZone: 0
LayerShell.Window.keyboardInteractivity: ShellState.launcherOpen
? LayerShell.Window.KeyboardInteractivityExclusive
: LayerShell.Window.KeyboardInteractivityNone
Item {
anchors.fill: parent
focus: ShellState.launcherOpen
Keys.onEscapePressed: {
event.accepted = true
ShellState.closeLauncher()
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: ShellState.closeLauncher()
}
Launcher {
id: launcher
x: 10
y: 10
width: Math.min(420, parent.width - 20)
height: Math.min(implicitHeight, Math.min(640, parent.height - 24))
opacity: ShellState.launcherOpen ? 1 : 0
yOffset: ShellState.launcherOpen ? 0 : -6
scale: ShellState.launcherOpen ? 1 : 0.985
focus: ShellState.launcherOpen
Behavior on opacity {
NumberAnimation {
duration: Theme.animationNormal
easing.type: Easing.OutCubic
}
}
Behavior on yOffset {
NumberAnimation {
duration: Theme.animationNormal
easing.type: Easing.OutCubic
}
}
Behavior on scale {
NumberAnimation {
duration: Theme.animationNormal
easing.type: Easing.OutCubic
}
}
}
}