Complete contextual desktop controls

This commit is contained in:
Gabriel Brown
2026-08-20 22:00:53 -04:00
parent a90f6eb357
commit 69ecec7ecf
9 changed files with 249 additions and 23 deletions
@@ -210,6 +210,12 @@ PanelWindow {
DockBody {
id: body
onContextMenuRequested: (anchorItem, entry) => {
dockContextMenu.anchorItem = anchorItem;
dockContextMenu.entry = entry;
dockContextMenu.visible = true;
}
vertical: root.vertical
leftSide: root.position === "left"
@@ -260,4 +266,8 @@ PanelWindow {
}
}
}
DockContextMenu {
id: dockContextMenu
}
}
@@ -116,6 +116,7 @@ Rectangle {
// The item the tooltip is currently describing, or null.
property Item hoveredItem: null
signal contextMenuRequested(Item anchorItem, var entry)
// Set by the Dock. A side dock runs the same strip down the screen instead
// of across it.
@@ -170,6 +171,7 @@ Rectangle {
onEntered: root.hoveredItem = dockItem
onExited: if (root.hoveredItem === dockItem)
root.hoveredItem = null
onContextMenuRequested: root.contextMenuRequested(dockItem, dockItem.entry)
}
}
}
@@ -0,0 +1,84 @@
// The dock's app menu. Desktop-entry actions stay first; the shell-owned
// configuration route is deliberately last so it never displaces app actions.
import Quickshell
import QtQuick
import qs.config
import qs.modules.bar
import qs.services
import qs.widgets
PopupWindow {
id: root
property Item anchorItem: null
property var entry: null
anchor.item: root.anchorItem
anchor.edges: Edges.Top | Edges.Left
anchor.gravity: Edges.Top | Edges.Right
anchor.margins.bottom: 8
implicitWidth: Math.max(menu.implicitWidth + Theme.popoverPadding * 2, 240)
implicitHeight: menu.implicitHeight + Theme.popoverPadding * 2
color: "transparent"
visible: false
grabFocus: true
Rectangle {
anchors.fill: parent
radius: Theme.popoverRadius
color: Theme.alpha(Theme.bgPopover, Theme.popoverAlpha)
border.width: 1
border.color: Theme.alpha(Theme.fg, 0.08)
PrismEdge {
anchors.top: parent.top
anchors.topMargin: 1
anchors.left: parent.left
anchors.right: parent.right
inset: parent.radius
}
Column {
id: menu
anchors.fill: parent
anchors.margins: Theme.popoverPadding
spacing: 2
Repeater {
id: applicationActions
model: root.entry ? root.entry.actions : []
delegate: TrayMenuRow {
required property var modelData
width: parent.width
label: modelData.name
onActivated: {
modelData.execute();
root.visible = false;
}
}
}
Rectangle {
width: parent.width
height: 1
anchors.margins: 3
visible: applicationActions.count > 0
border.width: 0
color: Theme.alpha(Theme.fg, 0.1)
}
TrayMenuRow {
width: parent.width
label: "Dock settings"
onActivated: {
ShellState.openSettings("desktop");
root.visible = false;
}
}
}
}
}
@@ -24,6 +24,7 @@ Item {
// Emitted so DockBody can drive the single shared tooltip.
signal entered
signal exited
signal contextMenuRequested
// The icon may grow past the cell on hover; the cell itself stays a fixed
// size so the row doesn't reflow.
@@ -115,7 +116,7 @@ Item {
id: mouse
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.MiddleButton
acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton
onEntered: root.entered()
onExited: root.exited()
@@ -126,6 +127,10 @@ Item {
root.launch();
return;
}
if (mev.button === Qt.RightButton) {
root.contextMenuRequested();
return;
}
if (root.running)
root.focusNext();
else