lux-shell/modules/powermenu/PowerMenu.qml
2025-08-18 23:48:17 -04:00

128 lines
3.3 KiB
QML

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;
Visibility.powermenu = false;
}
Keys.onReturnPressed: event => {
event.accepted = true;
process.startDetached();
}
Keys.onSpacePressed: event => {
event.accepted = true;
process.startDetached();
}
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: {
list.currentIndex = button.index;
}
onClicked: {
process.startDetached();
}
}
padding: 16
color: list.currentIndex == index ? Theme.palette.primarycontent : Theme.palette.basecontent
text: modelData.text
font.pixelSize: 18
font.bold: true
}
}
}
}