diff --git a/Modules/Bar/Widgets/PowerProfile.qml b/Modules/Bar/Widgets/PowerProfile.qml index 6968413..eb1eff5 100644 --- a/Modules/Bar/Widgets/PowerProfile.qml +++ b/Modules/Bar/Widgets/PowerProfile.qml @@ -11,8 +11,7 @@ NIconButton { property ShellScreen screen property real scaling: 1.0 - property var powerProfiles: PowerProfiles - readonly property bool hasPP: powerProfiles.hasPerformanceProfile + readonly property bool hasPP: PowerProfileService.available sizeRatio: 0.8 visible: hasPP @@ -20,34 +19,29 @@ NIconButton { function profileIcon() { if (!hasPP) return "yin-yang" - if (powerProfiles.profile === PowerProfile.Performance) + if (PowerProfileService.profile === PowerProfile.Performance) return "speedometer2" - if (powerProfiles.profile === PowerProfile.Balanced) + if (PowerProfileService.profile === PowerProfile.Balanced) return "yin-yang" - if (powerProfiles.profile === PowerProfile.PowerSaver) + if (PowerProfileService.profile === PowerProfile.PowerSaver) return "leaf" } function profileName() { if (!hasPP) return "Unknown" - if (powerProfiles.profile === PowerProfile.Performance) + if (PowerProfileService.profile === PowerProfile.Performance) return "Performance" - if (powerProfiles.profile === PowerProfile.Balanced) + if (PowerProfileService.profile === PowerProfile.Balanced) return "Balanced" - if (powerProfiles.profile === PowerProfile.PowerSaver) + if (PowerProfileService.profile === PowerProfile.PowerSaver) return "Power Saver" } function changeProfile() { if (!hasPP) return - if (powerProfiles.profile === PowerProfile.Performance) - powerProfiles.profile = PowerProfile.PowerSaver - else if (powerProfiles.profile === PowerProfile.Balanced) - powerProfiles.profile = PowerProfile.Performance - else if (powerProfiles.profile === PowerProfile.PowerSaver) - powerProfiles.profile = PowerProfile.Balanced + PowerProfileService.cycleProfile() } icon: root.profileIcon() diff --git a/Modules/SidePanel/Cards/PowerProfilesCard.qml b/Modules/SidePanel/Cards/PowerProfilesCard.qml index 842d432..0d4ae21 100644 --- a/Modules/SidePanel/Cards/PowerProfilesCard.qml +++ b/Modules/SidePanel/Cards/PowerProfilesCard.qml @@ -13,9 +13,8 @@ NBox { Layout.preferredWidth: 1 implicitHeight: powerRow.implicitHeight + Style.marginM * 2 * scaling - // PowerProfiles service - property var powerProfiles: PowerProfiles - readonly property bool hasPP: powerProfiles.hasPerformanceProfile + // Centralized service + readonly property bool hasPP: PowerProfileService.available property real spacing: 0 RowLayout { @@ -32,12 +31,12 @@ NBox { tooltipText: "Set performance power profile." enabled: hasPP opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && powerProfiles.profile === PowerProfile.Performance) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && powerProfiles.profile === PowerProfile.Performance) ? Color.mOnPrimary : Color.mPrimary + colorBg: (enabled + && PowerProfileService.profile === PowerProfile.Performance) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.Performance) ? Color.mOnPrimary : Color.mPrimary onClicked: { if (enabled) { - powerProfiles.profile = PowerProfile.Performance - ToastService.showNotice("Power Profile", "Performance") + PowerProfileService.setProfile(PowerProfile.Performance) } } } @@ -47,12 +46,12 @@ NBox { tooltipText: "Set balanced power profile." enabled: hasPP opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && powerProfiles.profile === PowerProfile.Balanced) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && powerProfiles.profile === PowerProfile.Balanced) ? Color.mOnPrimary : Color.mPrimary + colorBg: (enabled + && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.Balanced) ? Color.mOnPrimary : Color.mPrimary onClicked: { if (enabled) { - powerProfiles.profile = PowerProfile.Balanced - ToastService.showNotice("Power Profile", "Balanced") + PowerProfileService.setProfile(PowerProfile.Balanced) } } } @@ -62,12 +61,12 @@ NBox { tooltipText: "Set eco power profile." enabled: hasPP opacity: enabled ? Style.opacityFull : Style.opacityMedium - colorBg: (enabled && powerProfiles.profile === PowerProfile.PowerSaver) ? Color.mPrimary : Color.mSurfaceVariant - colorFg: (enabled && powerProfiles.profile === PowerProfile.PowerSaver) ? Color.mOnPrimary : Color.mPrimary + colorBg: (enabled + && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mPrimary : Color.mSurfaceVariant + colorFg: (enabled && PowerProfileService.profile === PowerProfile.PowerSaver) ? Color.mOnPrimary : Color.mPrimary onClicked: { if (enabled) { - powerProfiles.profile = PowerProfile.PowerSaver - ToastService.showNotice("Power Profile", "Power Saver") + PowerProfileService.setProfile(PowerProfile.PowerSaver) } } } diff --git a/Services/PowerProfileService.qml b/Services/PowerProfileService.qml new file mode 100644 index 0000000..950e4ee --- /dev/null +++ b/Services/PowerProfileService.qml @@ -0,0 +1,58 @@ +pragma Singleton + +import QtQuick +import Quickshell +import Quickshell.Services.UPower +import qs.Commons +import qs.Services + +Singleton { + id: root + + readonly property var powerProfiles: PowerProfiles + readonly property bool available: powerProfiles && powerProfiles.hasPerformanceProfile + property int profile: powerProfiles ? powerProfiles.profile : PowerProfile.Balanced + + function profileName(p) { + const prof = (p !== undefined) ? p : profile + if (!available) + return "Unknown" + if (prof === PowerProfile.Performance) + return "Performance" + if (prof === PowerProfile.Balanced) + return "Balanced" + if (prof === PowerProfile.PowerSaver) + return "Power Saver" + return "Unknown" + } + + function setProfile(p) { + if (!available) + return + try { + powerProfiles.profile = p + } catch (e) { + Logger.error("PowerProfileService", "Failed to set profile:", e) + } + } + + function cycleProfile() { + if (!available) + return + const current = powerProfiles.profile + if (current === PowerProfile.Performance) + setProfile(PowerProfile.PowerSaver) + else if (current === PowerProfile.Balanced) + setProfile(PowerProfile.Performance) + else if (current === PowerProfile.PowerSaver) + setProfile(PowerProfile.Balanced) + } + + Connections { + target: powerProfiles + function onProfileChanged() { + root.profile = powerProfiles.profile + ToastService.showNotice("Power Profile", root.profileName()) + } + } +}