Files
dotfiles/.config/quickshell/nucleus-shell/modules/interface/powermenu/Powermenu.qml

154 lines
4.7 KiB
QML

import Qt5Compat.GraphicalEffects
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Hyprland
import Quickshell.Io
import Quickshell.Services.Pipewire
import Quickshell.Wayland
import qs.config
import qs.modules.functions
import qs.services
import qs.modules.interface.lockscreen
import qs.modules.components
PanelWindow {
id: powermenu
WlrLayershell.keyboardFocus: Compositor.require("hyprland") && Globals.visiblility.powermenu
function togglepowermenu() {
Globals.visiblility.powermenu = !Globals.visiblility.powermenu; // Simple toggle logic kept in a function as it might have more things to it later on.
}
WlrLayershell.namespace: "nucleus:powermenu"
WlrLayershell.layer: WlrLayer.Top
visible: Config.initialized && Globals.visiblility.powermenu
color: "transparent"
exclusiveZone: 0
implicitWidth: DisplayMetrics.scaledWidth(0.25)
implicitHeight: DisplayMetrics.scaledWidth(0.168)
HyprlandFocusGrab {
id: grab
active: Compositor.require("hyprland")
windows: [powermenu]
}
StyledRect {
id: container
color: Appearance.m3colors.m3background
radius: Metrics.radius("verylarge")
implicitWidth: powermenu.implicitWidth
anchors.fill: parent
FocusScope {
focus: true
anchors.fill: parent
Keys.onPressed: {
if (event.key === Qt.Key_Escape)
Globals.visiblility.powermenu = false;
}
Item {
id: content
anchors.margins: Metrics.radius(12)
anchors.topMargin: Metrics.radius(16)
anchors.leftMargin: Metrics.radius(18)
anchors.fill: parent
Grid {
columns: 3
rows: 3
rowSpacing: Metrics.spacing(10)
columnSpacing: Metrics.spacing(10)
anchors.fill: parent
PowerMenuButton {
buttonIcon: "power_settings_new"
onClicked: {
Quickshell.execDetached(["poweroff"]);
Globals.visiblility.powermenu = false;
}
}
PowerMenuButton {
buttonIcon: "logout"
onClicked: {
Quickshell.execDetached(["hyprctl", "dispatch", "exit"]);
Globals.visiblility.powermenu = false;
}
}
PowerMenuButton {
buttonIcon: "sleep"
onClicked: {
Quickshell.execDetached(["systemctl", "suspend"]);
Globals.visiblility.powermenu = false;
}
}
PowerMenuButton {
buttonIcon: "lock"
onClicked: {
Quickshell.execDetached(["nucleus", "ipc", "call", "lockscreen", "lock"]);
Globals.visiblility.powermenu = false;
}
}
PowerMenuButton {
buttonIcon: "restart_alt"
onClicked: {
Quickshell.execDetached(["reboot"]);
Globals.visiblility.powermenu = false;
}
}
PowerMenuButton {
buttonIcon: "light_off"
onClicked: {
Quickshell.execDetached(["systemctl", "hibernate"]);
Globals.visiblility.powermenu = false;
}
}
}
component Anim: NumberAnimation {
running: Config.runtime.appearance.animations.enabled
duration: Metrics.chronoDuration(400)
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.animation.curves.standard
}
}
}
}
IpcHandler {
function toggle() {
togglepowermenu();
}
target: "powermenu"
}
component PowerMenuButton: StyledButton {
property string buttonIcon
icon: buttonIcon
iconSize: Metrics.iconSize(50)
width: powermenu.implicitWidth / 3.4
height: powermenu.implicitHeight / 2.3
radius: beingHovered ? Metrics.radius("verylarge") * 2 : Metrics.radius("large")
}
}