dock: pinned mode acts as screen split - bar shrinks, corners adjust, opaque background

This commit is contained in:
Damocles 2026-04-25 21:48:35 +02:00
parent c22eb51dcd
commit f501f977d1
9 changed files with 52 additions and 21 deletions

View file

@ -14,11 +14,11 @@ PanelWindow {
required property var screen
visible: D.DockState.open
visible: S.DockState.open
color: "transparent"
WlrLayershell.layer: D.DockState.mode === "pinned" ? WlrLayer.Top : WlrLayer.Overlay
WlrLayershell.exclusiveZone: D.DockState.mode === "pinned" ? _dockWidth : 0
WlrLayershell.layer: S.DockState.mode === "pinned" ? WlrLayer.Top : WlrLayer.Overlay
WlrLayershell.exclusiveZone: S.DockState.mode === "pinned" ? _dockWidth : 0
WlrLayershell.namespace: "nova-dock"
anchors.top: true
@ -31,8 +31,21 @@ PanelWindow {
implicitWidth: _dockWidth
// Set reserved width for bar/corners when pinned
onVisibleChanged: {
if (S.DockState.mode === "pinned")
S.DockState.reservedWidth = _dockWidth;
}
Connections {
target: S.DockState
function onModeChanged() {
if (S.DockState.mode === "pinned")
S.DockState.reservedWidth = root._dockWidth;
}
}
// Slide animation
property real _slideX: D.DockState.open ? 0 : _dockWidth
property real _slideX: S.DockState.open ? 0 : _dockWidth
Behavior on _slideX {
enabled: !S.Theme.reducedMotion
@ -46,7 +59,7 @@ PanelWindow {
HoverHandler {
id: _dockHover
onHoveredChanged: {
if (!hovered && D.DockState.mode === "overlay")
if (!hovered && S.DockState.mode === "overlay")
_overlayCloseTimer.restart();
else
_overlayCloseTimer.stop();
@ -56,16 +69,16 @@ PanelWindow {
Timer {
id: _overlayCloseTimer
interval: 200
onTriggered: if (D.DockState.mode === "overlay")
D.DockState.close()
onTriggered: if (S.DockState.mode === "overlay")
S.DockState.close()
}
// Background
// Background - fully opaque when pinned, semi-transparent in overlay
Rectangle {
id: _bg
anchors.fill: parent
color: S.Theme.base00
opacity: Math.max(S.Theme.barOpacity, 0.85)
opacity: S.DockState.mode === "pinned" ? 1.0 : Math.max(S.Theme.barOpacity, 0.85)
transform: Translate {
x: root._slideX
@ -355,7 +368,7 @@ PanelWindow {
_runner.command = cmd;
_runner.running = true;
}
onDismiss: D.DockState.close()
onDismiss: S.DockState.close()
}
}
}
@ -370,13 +383,13 @@ PanelWindow {
M.ProcessList {
id: _cpuProcs
sortBy: "cpu"
active: _cpuCard.expanded && D.DockState.open
active: _cpuCard.expanded && S.DockState.open
}
M.ProcessList {
id: _memProcs
sortBy: "mem"
active: _memCard.expanded && D.DockState.open
active: _memCard.expanded && S.DockState.open
}
PwObjectTracker {

View file

@ -1,7 +1,7 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import "." as D
import "../services" as S
// Invisible 2px-wide PanelWindow at the right screen edge.
// When cursor enters, opens the dock in overlay mode.
@ -10,7 +10,7 @@ PanelWindow {
required property var screen
visible: !D.DockState.open
visible: !S.DockState.open
color: "transparent"
WlrLayershell.layer: WlrLayer.Overlay
@ -25,8 +25,8 @@ PanelWindow {
HoverHandler {
onHoveredChanged: {
if (hovered && !D.DockState.open)
D.DockState.openOverlay();
if (hovered && !S.DockState.open)
S.DockState.openOverlay();
}
}
}

View file

@ -1,29 +0,0 @@
pragma Singleton
import QtQuick
QtObject {
// "closed" | "pinned" | "overlay"
property string mode: "closed"
readonly property bool open: mode !== "closed"
function openPinned() {
mode = "pinned";
}
function openOverlay() {
if (mode === "closed")
mode = "overlay";
}
function close() {
mode = "closed";
}
function toggle() {
if (mode === "pinned")
mode = "closed";
else
mode = "pinned";
}
}

View file

@ -3,5 +3,4 @@ module dock
AppletDock 1.0 AppletDock.qml
DockCard 1.0 DockCard.qml
DockEdgeTrigger 1.0 DockEdgeTrigger.qml
singleton DockState 1.0 DockState.qml
# keep-sorted end