From 5eaf088e6d602406021f7757ce2954fdd74b7f1e Mon Sep 17 00:00:00 2001 From: Niklas Kapelle Date: Thu, 9 Oct 2025 16:19:55 +0200 Subject: [PATCH] implemented power menu --- launcher/Powermenu.qml | 127 +++++++++++++++++++++++++++++++++++ launcher/PowermenuButton.qml | 24 +++++++ 2 files changed, 151 insertions(+) create mode 100644 launcher/Powermenu.qml create mode 100644 launcher/PowermenuButton.qml diff --git a/launcher/Powermenu.qml b/launcher/Powermenu.qml new file mode 100644 index 0000000..67cf78e --- /dev/null +++ b/launcher/Powermenu.qml @@ -0,0 +1,127 @@ +import Quickshell +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Quickshell.Wayland +import Quickshell.Io +import "root:/singeltons" + +PanelWindow { + id: root + + property bool show: false + property int selectedIndex: 0 + property int buttonCount: 4 + + + implicitWidth: 600 + implicitHeight: 400 + visible: show + focusable: true + color: "transparent" + + WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive + WlrLayershell.layer: WlrLayer.Top + + IpcHandler { + target: "powermenu" + + function open(): void { + root.selectedIndex = 0 + root.show = true + } + + function close(): void { + root.show = false + } + } + + function executeButton(index){ + switch (index){ + case 0: + console.log("0") + break + case 1: + console.log("1") + break + case 2: + console.log("2") + break + case 3: + console.log("3") + break + } + } + + // Main window + Rectangle { + anchors.fill: parent + anchors.centerIn: parent + + + focus: true + + color: "#363a4f" + border.color: Qt.hsla(0, 0, 1, 0.2) + border.width: 2 + radius: 12 + + Keys.onPressed: (event) => { + switch (event.key){ + case (Qt.Key_Escape): + root.show = false + event.accepted = true + break + case (Qt.Key_Return): + case (Qt.Key_Enter): + root.show = false + executeButton(root.selectedIndex) + event.accepted = true + break + case (Qt.Key_Tab): + case (Qt.Key_Right): + root.selectedIndex = (root.selectedIndex + 1) % root.buttonCount + event.accepted = true + break + case (Qt.Key_Left): + root.selectedIndex = (root.selectedIndex - 1 + root.buttonCount) % root.buttonCount + event.accepted = true + break + + } + } + + RowLayout { + anchors.fill: parent + anchors.margins: 20 + + PowermenuButton { + active: root.selectedIndex == 0 + icon: "⏻" + } + + Item { Layout.fillWidth: true } // spacer + + PowermenuButton { + active: root.selectedIndex == 1 + icon: "" + + } + + Item { Layout.fillWidth: true } // spacer + + PowermenuButton { + active: root.selectedIndex == 2 + icon: "" + } + + Item { Layout.fillWidth: true } // spacer + + PowermenuButton { + active: root.selectedIndex == 3 + icon: "" + } + } + } +} + diff --git a/launcher/PowermenuButton.qml b/launcher/PowermenuButton.qml new file mode 100644 index 0000000..d66f0e5 --- /dev/null +++ b/launcher/PowermenuButton.qml @@ -0,0 +1,24 @@ +import Quickshell +import QtQuick + +Rectangle { + implicitWidth: 100 + implicitHeight: 50 + + property bool active: false + property string icon: "?" + + color: active + ? "#5b6078" // Hover/focus color + : "#494d64" // Normal color + radius: 12 + + Text { + anchors.centerIn: parent + + text: parent.icon + + font.pointSize: 28 + color: "#cad3f5" + } +}