mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
feat(dock): integrate StaticDockPanel with main Dock logic and replace separate peek window with panel-based hover detection
This commit is contained in:
+25
-4
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user