// SPDX-License-Identifier: GPL-2.0-only // Copyright (C) 2026 Danilo M. // // Shutdown, restart, sleep and hibernate. Each icon is the path udt-accent // resolved from the selected icon theme, falling back to the bundled line art // when the key is empty or the file fails to load. Each button is disabled when // SDDM reports the action is unavailable. import QtQuick import QtQuick.Controls.Basic import QtQuick.Effects Row { id: bar spacing: 12 readonly property var actions: [ { icon: config.stringValue("powerIcon"), fallback: "../icons/power.svg", label: "Shut down", enabled: sddm.canPowerOff, run: function() { sddm.powerOff() } }, { icon: config.stringValue("rebootIcon"), fallback: "../icons/reboot.svg", label: "Restart", enabled: sddm.canReboot, run: function() { sddm.reboot() } }, { icon: config.stringValue("suspendIcon"), fallback: "../icons/suspend.svg", label: "Sleep", enabled: sddm.canSuspend, run: function() { sddm.suspend() } }, { icon: config.stringValue("hibernateIcon"), fallback: "../icons/hibernate.svg", label: "Hibernate", enabled: sddm.canHibernate, run: function() { sddm.hibernate() } } ] Repeater { model: bar.actions delegate: Item { width: 56 height: 56 opacity: modelData.enabled ? 1 : 0.35 // A resolved icon-theme path is drawn exactly as the theme ships // it. Only the bundled line art is tinted to the palette. readonly property bool themed: modelData.icon !== "" && String(icon.source) === modelData.icon Rectangle { anchors.fill: parent radius: 10 color: config.stringValue("surface0") opacity: mouse.containsMouse && modelData.enabled ? 1 : 0 } Image { id: icon anchors.centerIn: parent width: 34 height: 34 sourceSize.width: width sourceSize.height: height source: modelData.icon !== "" ? modelData.icon : modelData.fallback visible: false onStatusChanged: { if (status === Image.Error && String(source) !== modelData.fallback) source = modelData.fallback } } MultiEffect { anchors.fill: icon source: icon colorization: themed ? 0.0 : 1.0 colorizationColor: mouse.containsMouse && modelData.enabled ? config.stringValue("accent") : config.stringValue("subtext0") } MouseArea { id: mouse anchors.fill: parent hoverEnabled: true enabled: modelData.enabled onClicked: modelData.run() } ToolTip.visible: mouse.containsMouse && modelData.enabled ToolTip.text: modelData.label ToolTip.delay: 400 } } }