power menu
This commit is contained in:
parent
6f80224d6c
commit
5b82205e63
4 changed files with 147 additions and 8 deletions
|
|
@ -83,7 +83,7 @@ PanelWindow {
|
||||||
M.Memory { visible: M.Modules.memory }
|
M.Memory { visible: M.Modules.memory }
|
||||||
M.Disk { visible: M.Modules.disk }
|
M.Disk { visible: M.Modules.disk }
|
||||||
M.Battery {}
|
M.Battery {}
|
||||||
M.Wlogout { visible: M.Modules.wlogout }
|
M.Wlogout { bar: bar; visible: M.Modules.wlogout }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
131
modules/PowerMenu.qml
Normal file
131
modules/PowerMenu.qml
Normal file
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,20 +1,27 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Io
|
|
||||||
import "." as M
|
import "." as M
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
|
id: root
|
||||||
icon: "\uF011"
|
icon: "\uF011"
|
||||||
color: M.Theme.base08
|
color: M.Theme.base08
|
||||||
tooltip: "Open logout menu"
|
tooltip: "Power menu"
|
||||||
|
|
||||||
Process {
|
required property var bar
|
||||||
id: proc
|
|
||||||
command: ["wlogout"]
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
cursorShape: Qt.PointingHandCursor
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ Clock 1.0 Clock.qml
|
||||||
Volume 1.0 Volume.qml
|
Volume 1.0 Volume.qml
|
||||||
Tray 1.0 Tray.qml
|
Tray 1.0 Tray.qml
|
||||||
TrayMenu 1.0 TrayMenu.qml
|
TrayMenu 1.0 TrayMenu.qml
|
||||||
|
PowerMenu 1.0 PowerMenu.qml
|
||||||
ThemedIcon 1.0 ThemedIcon.qml
|
ThemedIcon 1.0 ThemedIcon.qml
|
||||||
Battery 1.0 Battery.qml
|
Battery 1.0 Battery.qml
|
||||||
Mpris 1.0 Mpris.qml
|
Mpris 1.0 Mpris.qml
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue