diff --git a/Modules/Dock/Dock.qml b/Modules/Dock/Dock.qml index 52f21800..730516b6 100644 --- a/Modules/Dock/Dock.qml +++ b/Modules/Dock/Dock.qml @@ -454,7 +454,13 @@ Variants { id: contextMenu scaling: root.scaling onHoveredChanged: menuHovered = hovered - onRequestClose: contextMenu.hide() + onRequestClose: { + contextMenu.hide() + // Restart hide timer after menu action if auto-hide is enabled + if (autoHide && !dockHovered && !anyAppHovered && !peekHovered) { + hideTimer.restart() + } + } onAppClosed: root.updateDockApps // Force immediate dock update when app is closed onVisibleChanged: { if (visible) { @@ -493,11 +499,23 @@ Variants { } onClicked: function (mouse) { - // Close any existing context menu first - if (mouse.button !== Qt.RightButton || root.currentContextMenu !== contextMenu) { + if (mouse.button === Qt.RightButton) { + // If right-clicking on the same app with an open context menu, close it + if (root.currentContextMenu === contextMenu && contextMenu.visible) { + root.closeAllContextMenus() + return + } + // Close any other existing context menu first root.closeAllContextMenus() + // Hide tooltip when showing context menu + appTooltip.hide() + contextMenu.show(appButton, modelData.toplevel || modelData) + return } + // Close any existing context menu for non-right-click actions + root.closeAllContextMenus() + // Check if toplevel is still valid (not a stale reference) const isValidToplevel = modelData?.toplevel && ToplevelManager && ToplevelManager.toplevels.values.includes(modelData.toplevel) @@ -512,10 +530,6 @@ Variants { // Pinned app not running - launch it Quickshell.execDetached(["gtk-launch", modelData.appId]) } - } else if (mouse.button === Qt.RightButton) { - // Hide tooltip when showing context menu - appTooltip.hide() - contextMenu.show(appButton, modelData.toplevel || modelData) } } } diff --git a/Modules/Dock/DockMenu.qml b/Modules/Dock/DockMenu.qml index f4b78ae5..5b8cebd9 100644 --- a/Modules/Dock/DockMenu.qml +++ b/Modules/Dock/DockMenu.qml @@ -19,7 +19,7 @@ PopupWindow { signal requestClose - implicitWidth: 160 * scaling + implicitWidth: 140 * scaling implicitHeight: contextMenuColumn.implicitHeight + (Style.marginM * scaling * 2) color: Color.transparent visible: false @@ -75,7 +75,14 @@ PopupWindow { id: menuMouseArea anchors.fill: parent hoverEnabled: true - onClicked: root.hide() // Close when clicking on the background (outside menu content) + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: function (mouse) { + if (mouse.button === Qt.RightButton) { + root.hide() // Close on right-click + } else { + root.hide() // Close when clicking on the background (outside menu content) + } + } } Shortcut { @@ -105,11 +112,11 @@ PopupWindow { anchors.margins: Style.marginM * scaling spacing: 0 - // Activate/Focus item + // Focus item Rectangle { width: parent.width height: 32 * scaling - color: activateMouseArea.containsMouse ? Qt.alpha(Color.mSecondary, 0.2) : Color.transparent + color: activateMouseArea.containsMouse ? Color.mTertiary : Color.transparent radius: Style.radiusXS * scaling Row { @@ -121,20 +128,14 @@ PopupWindow { NIcon { icon: "eye" font.pointSize: Style.fontSizeL * scaling - color: Color.mOnSurface + color: activateMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } NText { - text: { - if (!root.toplevel) - return "Activate" - // Check if this toplevel is active by comparing with ToplevelManager.activeToplevel - const isActive = ToplevelManager.activeToplevel && ToplevelManager.activeToplevel === root.toplevel - return isActive ? "Focus" : "Activate" - } + text: "Focus" font.pointSize: Style.fontSizeS * scaling - color: Color.mOnSurface + color: activateMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } } @@ -150,6 +151,7 @@ PopupWindow { root.toplevel.activate() } root.hide() + root.requestClose() } } } @@ -158,7 +160,7 @@ PopupWindow { Rectangle { width: parent.width height: 32 * scaling - color: pinMouseArea.containsMouse ? Qt.alpha(Color.mTertiary, 0.2) : Color.transparent + color: pinMouseArea.containsMouse ? Color.mTertiary : Color.transparent radius: Style.radiusXS * scaling Row { @@ -174,7 +176,7 @@ PopupWindow { return root.isAppPinned(root.toplevel.appId) ? "pinned-off" : "pin" } font.pointSize: Style.fontSizeL * scaling - color: Color.mOnSurface + color: pinMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } @@ -185,7 +187,7 @@ PopupWindow { return root.isAppPinned(root.toplevel.appId) ? "Unpin" : "Pin" } font.pointSize: Style.fontSizeS * scaling - color: Color.mOnSurface + color: pinMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } } @@ -201,6 +203,7 @@ PopupWindow { root.toggleAppPin(root.toplevel.appId) } root.hide() + root.requestClose() } } } @@ -209,7 +212,7 @@ PopupWindow { Rectangle { width: parent.width height: 32 * scaling - color: closeMouseArea.containsMouse ? Qt.alpha(Color.mPrimary, 0.2) : Color.transparent + color: closeMouseArea.containsMouse ? Color.mTertiary : Color.transparent radius: Style.radiusXS * scaling Row { @@ -221,14 +224,14 @@ PopupWindow { NIcon { icon: "x" font.pointSize: Style.fontSizeL * scaling - color: closeMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurface + color: closeMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } NText { text: "Close" font.pointSize: Style.fontSizeS * scaling - color: closeMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurface + color: closeMouseArea.containsMouse ? Color.mOnTertiary : Color.mOnSurface anchors.verticalCenter: parent.verticalCenter } } @@ -253,6 +256,7 @@ PopupWindow { Logger.warn("DockMenu", "Cannot close app - invalid toplevel reference") } root.hide() + root.requestClose() } } }