From b75f8bc1d2deb69d500b0adb7116db378dc7793e Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Tue, 12 Aug 2025 22:33:44 -0400 Subject: [PATCH 1/3] move bar to Shell module --- modules/Shell.qml | 18 ++++++ modules/bar/Bar.qml | 140 ++++++++++++++++++++++---------------------- shell.qml | 3 +- 3 files changed, 88 insertions(+), 73 deletions(-) create mode 100644 modules/Shell.qml diff --git a/modules/Shell.qml b/modules/Shell.qml new file mode 100644 index 0000000..4d3403c --- /dev/null +++ b/modules/Shell.qml @@ -0,0 +1,18 @@ +import "bar" +import Quickshell +import Quickshell.Wayland +import Quickshell.Hyprland +import QtQuick +import QtQuick.Effects + +Variants { + model: Quickshell.screens + + Scope { + id: scope + + required property ShellScreen modelData + + Bar {} + } +} diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 8ca1c91..06f5572 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -8,107 +8,105 @@ import "components/hyprland" import "components/notifications" import "components/tray" -Scope { - PanelWindow { - id: parentWindow +PanelWindow { + id: parentWindow - anchors.top: true - anchors.left: true - anchors.right: true + anchors.top: true + anchors.left: true + anchors.right: true - implicitHeight: Dimensions.bar.height - color: 'transparent' + implicitHeight: Dimensions.bar.height + color: 'transparent' - Item { + Item { + anchors.fill: parent + anchors.leftMargin: Dimensions.bar.horizontalMargins + anchors.rightMargin: Dimensions.bar.horizontalMargins + anchors.topMargin: Dimensions.bar.verticalMargins + anchors.bottomMargin: Dimensions.bar.verticalMargins + + Rectangle { + id: background anchors.fill: parent - anchors.leftMargin: Dimensions.bar.horizontalMargins - anchors.rightMargin: Dimensions.bar.horizontalMargins - anchors.topMargin: Dimensions.bar.verticalMargins - anchors.bottomMargin: Dimensions.bar.verticalMargins + color: Theme.palette.base300 + radius: Dimensions.radius - Rectangle { - id: background - anchors.fill: parent - color: Theme.palette.base300 - radius: Dimensions.radius + border { + color: Theme.palette.base100 + width: Dimensions.bar.border + pixelAligned: true + } + } - border { - color: Theme.palette.base100 - width: Dimensions.bar.border - pixelAligned: true - } + RowLayout { + id: leftbar + + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + + anchors.leftMargin: Dimensions.bar.horizontalPadding + anchors.topMargin: Dimensions.bar.verticalPadding + anchors.bottomMargin: Dimensions.bar.verticalPadding + + spacing: Dimensions.bar.spacing + + SystemLogo { + implicitSize: 22 } - RowLayout { - id: leftbar + Workspaces {} - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter + Tray {} + } - anchors.leftMargin: Dimensions.bar.horizontalPadding - anchors.topMargin: Dimensions.bar.verticalPadding - anchors.bottomMargin: Dimensions.bar.verticalPadding + RowLayout { + id: centerbar - spacing: Dimensions.bar.spacing + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter - SystemLogo { - implicitSize: 22 - } + anchors.topMargin: Dimensions.bar.verticalPadding + anchors.bottomMargin: Dimensions.bar.verticalPadding - Workspaces {} + spacing: Dimensions.bar.spacing - Tray {} - } + Mpris {} + } - RowLayout { - id: centerbar + RowLayout { + id: rightbar - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter - anchors.topMargin: Dimensions.bar.verticalPadding - anchors.bottomMargin: Dimensions.bar.verticalPadding + anchors.rightMargin: Dimensions.bar.horizontalPadding + anchors.topMargin: Dimensions.bar.verticalPadding + anchors.bottomMargin: Dimensions.bar.verticalPadding - spacing: Dimensions.bar.spacing + spacing: Dimensions.bar.spacing - Mpris {} - } + Pywal {} - RowLayout { - id: rightbar + Pipewire {} - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter + Caffeine {} - anchors.rightMargin: Dimensions.bar.horizontalPadding - anchors.topMargin: Dimensions.bar.verticalPadding - anchors.bottomMargin: Dimensions.bar.verticalPadding + Network {} - spacing: Dimensions.bar.spacing + Bluetooth {} - Pywal {} + Storage {} - Pipewire {} + Memory {} - Caffeine {} + Cpu {} - Network {} + Gpu {} - Bluetooth {} + Clock {} - Storage {} - - Memory {} - - Cpu {} - - Gpu {} - - Clock {} - - Notifications {} - } + Notifications {} } } } diff --git a/shell.qml b/shell.qml index 6c722f8..caf8510 100644 --- a/shell.qml +++ b/shell.qml @@ -2,12 +2,11 @@ import Quickshell import "modules" -import "modules/bar" ShellRoot { ReloadPopup {} - Bar {} + Shell {} Shortcuts {} } From 7a1bed7d8943c982173e7d043e7ced8d5c7a79fc Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Mon, 18 Aug 2025 22:46:07 -0400 Subject: [PATCH 2/3] update theme with content colors --- config/Theme.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/Theme.qml b/config/Theme.qml index 076c50b..91fbf0b 100644 --- a/config/Theme.qml +++ b/config/Theme.qml @@ -16,16 +16,24 @@ Singleton { id: palette property color primary: "#1fb854" + property color primarycontent: "#000000" property color secondary: "#1eb88e" + property color secondarycontent: "#000c07" property color accent: "#1fb8ab" + property color accentcontent: "#010c0b" property color neutral: "#19362d" + property color neutralcontent: "#cdd3d1" property color base100: "#1b1717" property color base200: "#161212" property color base300: "#110d0d" property color basecontent: "#cac9c9" property color info: "#00b5ff" + property color infocontent: "#000000" property color success: "#00a96e" + property color successcontent: "#000000" property color warning: "#ffbe00" + property color warningcontent: "#000000" property color error: "#ff5861" + property color errorcontent: "#000000" } } From 3d3381ea159c5834b52f7e12240cefcf374ead5c Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Mon, 18 Aug 2025 23:41:59 -0400 Subject: [PATCH 3/3] power menu!!! --- modules/Shell.qml | 2 + modules/Shortcuts.qml | 7 ++ modules/powermenu/PowerMenu.qml | 127 ++++++++++++++++++++++++++++++++ services/Visibility.qml | 1 + widgets/StyledText.qml | 8 +- 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 modules/powermenu/PowerMenu.qml diff --git a/modules/Shell.qml b/modules/Shell.qml index 4d3403c..8e92771 100644 --- a/modules/Shell.qml +++ b/modules/Shell.qml @@ -1,4 +1,5 @@ import "bar" +import "powermenu" import Quickshell import Quickshell.Wayland import Quickshell.Hyprland @@ -14,5 +15,6 @@ Variants { required property ShellScreen modelData Bar {} + PowerMenu {} } } diff --git a/modules/Shortcuts.qml b/modules/Shortcuts.qml index d965bec..b0dcb10 100644 --- a/modules/Shortcuts.qml +++ b/modules/Shortcuts.qml @@ -1,3 +1,4 @@ +import qs.services import qs.widgets import Quickshell @@ -11,4 +12,10 @@ Scope { console.log("Launcher shortcut pressed"); } } + + LuxShortcut { + name: 'power-menu' + description: 'Open the Power Menu' + onPressed: Visibility.powermenu = !Visibility.powermenu + } } diff --git a/modules/powermenu/PowerMenu.qml b/modules/powermenu/PowerMenu.qml new file mode 100644 index 0000000..a9f1533 --- /dev/null +++ b/modules/powermenu/PowerMenu.qml @@ -0,0 +1,127 @@ +pragma ComponentBehavior: Bound + +import qs.config +import qs.services +import qs.widgets +import Quickshell.Hyprland +import Quickshell.Io +import Quickshell.Wayland +import Quickshell.Widgets +import QtQuick +import QtQuick.Layouts + +StyledWindow { + id: root + name: "powermenu" + + visible: Visibility.powermenu + implicitWidth: rect.width + implicitHeight: rect.height + + WlrLayershell.layer: WlrLayer.Top + WlrLayershell.keyboardFocus: root.visible ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None + + Process { + id: process + } + + WrapperRectangle { + id: rect + + color: Theme.palette.base300 + margin: 14 + radius: 8 + + HyprlandFocusGrab { + active: Visibility.powermenu + windows: [root] + onCleared: { + Visibility.powermenu = false; + } + } + + StyledListView { + id: list + + Layout.fillWidth: true + + focus: Visibility.powermenu + Keys.onEscapePressed: event => { + event.accepted = true; + root.visible = false; + } + Keys.onEnterPressed: event => { + event.accepted = true; + console.log(list.currentItem.command); + } + Keys.onUpPressed: event => { + event.accepted = true; + list.decrementCurrentIndex(); + } + Keys.onDownPressed: event => { + event.accepted = true; + list.incrementCurrentIndex(); + } + + model: [ + { + text: "󰍃 Logout", + command: "hyprctl dispatch exit" + }, + { + text: "󰜉 Reboot", + command: "systemctl reboot" + }, + { + text: " Shutdown", + command: "systemctl poweroff" + } + ] + + spacing: 8 + + implicitWidth: 220 + implicitHeight: 185 + + highlightMoveDuration: 1000 + highlightResizeDuration: 0 + highlight: Rectangle { + radius: 8 + color: Theme.palette.primary + } + + onCurrentItemChanged: { + process.command = ["sh", "-c", list.currentItem.modelData.command]; + } + + delegate: StyledText { + id: button + required property var modelData + required property int index + + anchors.left: parent.left + anchors.right: parent.right + + MouseArea { + hoverEnabled: true + anchors.fill: button + onEntered: { + console.log("blyat"); + list.currentIndex = button.index; + } + onClicked: { + console.log(process.command); + process.running = true; + // process.startDetached(); + } + } + + padding: 16 + color: list.currentIndex == index ? Theme.palette.primarycontent : Theme.palette.basecontent + text: modelData.text + font.pixelSize: 18 + font.bold: true + } + } + } +} diff --git a/services/Visibility.qml b/services/Visibility.qml index 3015f7a..1e93a77 100644 --- a/services/Visibility.qml +++ b/services/Visibility.qml @@ -4,6 +4,7 @@ import qs.widgets import Quickshell Singleton { + property bool powermenu property StyledPopupWindow activePopup function togglePopup(popup: StyledPopupWindow) { diff --git a/widgets/StyledText.qml b/widgets/StyledText.qml index a11a4ea..eca51b9 100644 --- a/widgets/StyledText.qml +++ b/widgets/StyledText.qml @@ -2,6 +2,12 @@ import qs.config import QtQuick Text { - color: Theme.palette.basecontent font.family: Theme.fontFamily + color: Theme.palette.basecontent + Behavior on color { + ColorAnimation { + duration: 200 + easing.type: Easing.InOutQuad + } + } }