feat(dock): integrate StaticDockPanel with main Dock logic and replace separate peek window with panel-based hover detection

This commit is contained in:
tibssy
2026-02-04 01:42:35 +00:00
parent ce027062fa
commit 4b5c6c4619
2 changed files with 30 additions and 41 deletions
+25 -4
View File
@@ -13,7 +13,7 @@ import qs.Widgets
Loader {
active: Settings.data.dock.enabled && Settings.data.dock.dockType !== "static"
active: Settings.data.dock.enabled
sourceComponent: Variants {
model: Quickshell.screens
@@ -72,6 +72,7 @@ Loader {
readonly property string displayMode: Settings.data.dock.displayMode
readonly property bool autoHide: displayMode === "auto_hide"
readonly property bool exclusive: displayMode === "exclusive"
readonly property bool isStaticMode: Settings.data.dock.dockType === "static"
readonly property int hideDelay: 500
readonly property int showDelay: 100
readonly property int hideAnimationDuration: Math.max(0, Math.round(Style.animationFast / (Settings.data.dock.animationSpeed || 1.0)))
@@ -133,6 +134,10 @@ Loader {
}
}
function getStaticDockPanel() {
return PanelService.getPanel("staticDockPanel", modelData, false);
}
function getAppKey(appData) {
if (!appData)
return null;
@@ -416,7 +421,17 @@ Loader {
menuHovered = false;
}
if (autoHide && !dockHovered && !anyAppHovered && !peekHovered && !menuHovered) {
closeAllContextMenus();
if (isStaticMode) {
const panel = getStaticDockPanel();
if (panel && panel.isDockHovered) {
restart();
return;
}
if (panel)
panel.close();
} else {
closeAllContextMenus();
}
hidden = true;
unloadTimer.restart(); // Start unload timer when hiding
} else if (autoHide && !dockHovered && !peekHovered) {
@@ -432,7 +447,13 @@ Loader {
interval: showDelay
onTriggered: {
if (autoHide) {
dockLoaded = true; // Load dock immediately
if (isStaticMode) {
const panel = getStaticDockPanel();
if (panel && !panel.isPanelOpen)
panel.open();
} else {
dockLoaded = true; // Load dock immediately
}
hidden = false; // Then trigger show animation
unloadTimer.stop(); // Cancel any pending unload
}
@@ -526,7 +547,7 @@ Loader {
Loader {
id: dockWindowLoader
active: Settings.data.dock.enabled && (barIsReady || !hasBar) && modelData && (Settings.data.dock.monitors.length === 0 || Settings.data.dock.monitors.includes(modelData.name)) && dockLoaded && ToplevelManager && (dockApps.length > 0)
active: Settings.data.dock.enabled && !isStaticMode && (barIsReady || !hasBar) && modelData && (Settings.data.dock.monitors.length === 0 || Settings.data.dock.monitors.includes(modelData.name)) && dockLoaded && ToplevelManager && (dockApps.length > 0)
sourceComponent: PanelWindow {
id: dockWindow
+5 -37
View File
@@ -13,6 +13,7 @@ SmartPanel {
readonly property string dockPosition: Settings.data.dock.position
readonly property bool isVertical: dockPosition === "left" || dockPosition === "right"
readonly property bool isStaticMode: Settings.data.dock.dockType === "static"
property bool isDockHovered: false
panelAnchorTop: dockPosition === "top"
panelAnchorBottom: dockPosition === "bottom"
@@ -28,43 +29,6 @@ SmartPanel {
preferredWidth: 200
preferredHeight: 200
// Peek Window to detect hover when panel is closed
Loader {
active: root.isStaticMode && !root.isPanelOpen && !root.isClosing && root.screen
sourceComponent: PanelWindow {
id: peekWindow
screen: root.screen
color: "transparent"
focusable: false
// Layer config
WlrLayershell.namespace: "noctalia-static-dock-peek-" + (screen?.name || "unknown")
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.exclusionMode: ExclusionMode.Ignore
// implicitHeight: barAtSameEdge && !isVertical ? 3 : peekHeight
// implicitWidth: barAtSameEdge && isVertical ? 3 : peekHeight
// Anchors
anchors.top: root.dockPosition === "top" || root.isVertical
anchors.bottom: root.dockPosition === "bottom" || root.isVertical
anchors.left: root.dockPosition === "left" || !root.isVertical
anchors.right: root.dockPosition === "right" || !root.isVertical
// Size - 2px thick strip
implicitWidth: root.isVertical ? 2 : (root.screen ? Math.round(root.screen.width) : 0)
implicitHeight: !root.isVertical ? 2 : (root.screen ? Math.round(root.screen.height) : 0)
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: {
root.open(null, null);
}
}
}
}
panelContent: Item {
id: panelContent
@@ -76,7 +40,11 @@ SmartPanel {
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: {
root.isDockHovered = true;
}
onExited: {
root.isDockHovered = false;
root.close();
}
}