diff --git a/modules/Bar.qml b/modules/Bar.qml index 909b0fd..28a7868 100644 --- a/modules/Bar.qml +++ b/modules/Bar.qml @@ -83,7 +83,7 @@ PanelWindow { M.Memory { visible: M.Modules.memory } M.Disk { visible: M.Modules.disk } M.Battery {} - M.Wlogout { visible: M.Modules.wlogout } + M.Wlogout { bar: bar; visible: M.Modules.wlogout } } } } diff --git a/modules/PowerMenu.qml b/modules/PowerMenu.qml new file mode 100644 index 0000000..3c8e1ad --- /dev/null +++ b/modules/PowerMenu.qml @@ -0,0 +1,131 @@ +import QtQuick +import Quickshell +import Quickshell.Io +import Quickshell.Wayland +import "." as M + +PanelWindow { + id: menuWindow + + required property var screen + required property real anchorX + + signal menuClosed() + + visible: true + color: "transparent" + + WlrLayershell.layer: WlrLayer.Overlay + WlrLayershell.exclusiveZone: 0 + WlrLayershell.namespace: "nova-powermenu" + + anchors.top: true + anchors.left: true + anchors.right: true + anchors.bottom: true + + MouseArea { + anchors.fill: parent + onClicked: menuWindow.menuClosed() + } + + Item { + id: panel + + x: Math.max(0, Math.min( + Math.round(menuWindow.anchorX - menuCol.width / 2), + menuWindow.width - menuCol.width + )) + y: 0 + + width: menuCol.width + height: menuCol.height + + MouseArea { + anchors.fill: parent + } + + Rectangle { + anchors.fill: parent + color: M.Theme.base01 + opacity: Math.max(M.Theme.barOpacity, 0.85) + topLeftRadius: 0 + topRightRadius: 0 + bottomLeftRadius: M.Theme.radius + bottomRightRadius: M.Theme.radius + } + + Column { + id: menuCol + + width: 180 + topPadding: 4 + bottomPadding: 4 + spacing: 2 + + Repeater { + model: [ + { label: "Lock", icon: "\uF023", cmd: ["loginctl", "lock-session"], color: M.Theme.base0D }, + { label: "Suspend", icon: "\uF186", cmd: ["systemctl", "suspend"], color: M.Theme.base0E }, + { label: "Logout", icon: "\uF2F5", cmd: ["loginctl", "terminate-user", ""], color: M.Theme.base0A }, + { label: "Reboot", icon: "\uF021", cmd: ["systemctl", "reboot"], color: M.Theme.base09 }, + { label: "Shutdown", icon: "\uF011", cmd: ["systemctl", "poweroff"], color: M.Theme.base08 } + ] + + delegate: Item { + id: entry + + required property var modelData + required property int index + + width: menuCol.width + height: 32 + + Rectangle { + anchors.fill: parent + anchors.leftMargin: 4 + anchors.rightMargin: 4 + color: entryArea.containsMouse ? M.Theme.base02 : "transparent" + radius: M.Theme.radius + } + + Text { + id: entryIcon + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 12 + text: entry.modelData.icon + color: entry.modelData.color + font.pixelSize: M.Theme.fontSize + 1 + font.family: M.Theme.iconFontFamily + } + + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.left: entryIcon.right + anchors.leftMargin: 10 + text: entry.modelData.label + color: M.Theme.base05 + font.pixelSize: M.Theme.fontSize + font.family: M.Theme.fontFamily + } + + Process { + id: runner + command: entry.modelData.cmd + } + + MouseArea { + id: entryArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + runner.running = true; + menuWindow.menuClosed(); + } + } + } + } + } + } +} diff --git a/modules/Wlogout.qml b/modules/Wlogout.qml index 1d4bd21..640b024 100644 --- a/modules/Wlogout.qml +++ b/modules/Wlogout.qml @@ -1,20 +1,27 @@ import QtQuick -import Quickshell.Io import "." as M M.BarIcon { + id: root icon: "\uF011" color: M.Theme.base08 - tooltip: "Open logout menu" + tooltip: "Power menu" - Process { - id: proc - command: ["wlogout"] - } + required property var bar MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: proc.running = true + onClicked: menuLoader.active = !menuLoader.active + } + + Loader { + id: menuLoader + active: false + sourceComponent: M.PowerMenu { + screen: root.bar.screen + anchorX: root.mapToGlobal(root.width / 2, 0).x + onMenuClosed: menuLoader.active = false + } } } diff --git a/modules/qmldir b/modules/qmldir index 3fbd13d..2b06466 100644 --- a/modules/qmldir +++ b/modules/qmldir @@ -11,6 +11,7 @@ Clock 1.0 Clock.qml Volume 1.0 Volume.qml Tray 1.0 Tray.qml TrayMenu 1.0 TrayMenu.qml +PowerMenu 1.0 PowerMenu.qml ThemedIcon 1.0 ThemedIcon.qml Battery 1.0 Battery.qml Mpris 1.0 Mpris.qml