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.
72 lines
2.7 KiB
QML
72 lines
2.7 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 Desktop")
|
|
color: "transparent"
|
|
flags: Qt.FramelessWindowHint | Qt.WindowDoesNotAcceptFocus
|
|
visible: true
|
|
width: outputWidth
|
|
height: outputHeight
|
|
|
|
LayerShell.Window.scope: "nebula-desktop"
|
|
LayerShell.Window.layer: LayerShell.Window.LayerBackground
|
|
LayerShell.Window.anchors: LayerShell.Window.AnchorTop
|
|
| LayerShell.Window.AnchorBottom
|
|
| LayerShell.Window.AnchorLeft
|
|
| LayerShell.Window.AnchorRight
|
|
LayerShell.Window.exclusionZone: 0
|
|
LayerShell.Window.keyboardInteractivity: LayerShell.Window.KeyboardInteractivityNone
|
|
|
|
Canvas {
|
|
id: backdrop
|
|
anchors.fill: parent
|
|
onPaint: {
|
|
const ctx = getContext("2d")
|
|
ctx.reset()
|
|
ctx.fillStyle = Theme.background
|
|
ctx.fillRect(0, 0, width, height)
|
|
|
|
let glow = ctx.createRadialGradient(width * 0.12, height * -0.08, 0, width * 0.12, height * -0.08, width * 0.7)
|
|
glow.addColorStop(0, "rgba(110, 140, 180, 0.16)")
|
|
glow.addColorStop(0.52, "rgba(110, 140, 180, 0)")
|
|
ctx.fillStyle = glow
|
|
ctx.fillRect(0, 0, width, height)
|
|
|
|
glow = ctx.createRadialGradient(width * 0.88, height * 1.08, 0, width * 0.88, height * 1.08, width * 0.45)
|
|
glow.addColorStop(0, "rgba(42, 68, 98, 0.28)")
|
|
glow.addColorStop(0.58, "rgba(42, 68, 98, 0)")
|
|
ctx.fillStyle = glow
|
|
ctx.fillRect(0, 0, width, height)
|
|
|
|
glow = ctx.createRadialGradient(width * 0.62, height * 0.38, 0, width * 0.62, height * 0.38, width * 0.28)
|
|
glow.addColorStop(0, "rgba(72, 92, 120, 0.08)")
|
|
glow.addColorStop(0.7, "rgba(72, 92, 120, 0)")
|
|
ctx.fillStyle = glow
|
|
ctx.fillRect(0, 0, width, height)
|
|
|
|
const veil = ctx.createLinearGradient(0, 0, 0, height)
|
|
veil.addColorStop(0, "rgba(8, 11, 17, 0.22)")
|
|
veil.addColorStop(0.16, "rgba(8, 11, 17, 0)")
|
|
veil.addColorStop(0.78, "rgba(8, 11, 17, 0)")
|
|
veil.addColorStop(1, "rgba(8, 11, 17, 0.38)")
|
|
ctx.fillStyle = veil
|
|
ctx.fillRect(0, 0, width, height)
|
|
}
|
|
|
|
onWidthChanged: requestPaint()
|
|
onHeightChanged: requestPaint()
|
|
}
|
|
}
|