1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-29 07:52:50 -05:00

osd: try to optimize power profile osd more

This commit is contained in:
bbedward
2025-11-23 17:29:56 -05:00
parent 5ce1cb87ea
commit 2ae911230d
3 changed files with 127 additions and 84 deletions

View File

@@ -558,7 +558,7 @@ Item {
LazyLoader { LazyLoader {
id: powerProfileOSDLoader id: powerProfileOSDLoader
active: SettingsData.osdPowerProfileEnabled active: false
Variants { Variants {
model: SettingsData.getFilteredScreens("osd") model: SettingsData.getFilteredScreens("osd")
@@ -569,6 +569,14 @@ Item {
} }
} }
Connections {
target: BatteryService
function onPowerProfileChanged() {
powerProfileOSDLoader.active = true
}
}
Variants { Variants {
model: SettingsData.getFilteredScreens("osd") model: SettingsData.getFilteredScreens("osd")

View File

@@ -12,22 +12,19 @@ DankOSD {
autoHideInterval: 2000 autoHideInterval: 2000
enableMouseInteraction: false enableMouseInteraction: false
property int lastProfile: -1
Connections { Connections {
target: typeof PowerProfiles !== "undefined" ? PowerProfiles : null target: BatteryService
function onProfileChanged() { function onPowerProfileChanged() {
if (lastProfile !== -1 && lastProfile !== PowerProfiles.profile && SettingsData.osdPowerProfileEnabled) { if (SettingsData.osdPowerProfileEnabled) {
root.show() root.show()
} }
lastProfile = PowerProfiles.profile
} }
} }
Component.onCompleted: { Component.onCompleted: {
if (typeof PowerProfiles !== "undefined") { if (SettingsData.osdPowerProfileEnabled) {
lastProfile = PowerProfiles.profile root.show()
} }
} }

View File

@@ -1,10 +1,8 @@
pragma Singleton pragma Singleton
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import Quickshell import Quickshell
import Quickshell.Io
import Quickshell.Services.UPower import Quickshell.Services.UPower
import qs.Common import qs.Common
@@ -13,6 +11,10 @@ Singleton {
property bool suppressSound: true property bool suppressSound: true
property bool previousPluggedState: false property bool previousPluggedState: false
property int currentPowerProfile: -1
property int previousPowerProfile: -1
signal powerProfileChanged
Timer { Timer {
id: startupTimer id: startupTimer
@@ -22,6 +24,27 @@ Singleton {
onTriggered: root.suppressSound = false onTriggered: root.suppressSound = false
} }
Connections {
target: typeof PowerProfiles !== "undefined" ? PowerProfiles : null
function onProfileChanged() {
if (typeof PowerProfiles !== "undefined") {
root.previousPowerProfile = root.currentPowerProfile;
root.currentPowerProfile = PowerProfiles.profile;
if (root.previousPowerProfile !== -1) {
root.powerProfileChanged();
}
}
}
}
Component.onCompleted: {
if (typeof PowerProfiles !== "undefined") {
root.currentPowerProfile = PowerProfiles.profile;
root.previousPowerProfile = PowerProfiles.profile;
}
}
readonly property string preferredBatteryOverride: Quickshell.env("DMS_PREFERRED_BATTERY") readonly property string preferredBatteryOverride: Quickshell.env("DMS_PREFERRED_BATTERY")
// List of laptop batteries // List of laptop batteries
@@ -31,25 +54,28 @@ Singleton {
// Main battery (for backward compatibility) // Main battery (for backward compatibility)
readonly property UPowerDevice device: { readonly property UPowerDevice device: {
var preferredDev var preferredDev;
if (usePreferred) { if (usePreferred) {
preferredDev = batteries.find(dev => dev.nativePath.toLowerCase().includes(preferredBatteryOverride.toLowerCase())) preferredDev = batteries.find(dev => dev.nativePath.toLowerCase().includes(preferredBatteryOverride.toLowerCase()));
} }
return preferredDev || batteries[0] || null return preferredDev || batteries[0] || null;
} }
// Whether at least one battery is available // Whether at least one battery is available
readonly property bool batteryAvailable: batteries.length > 0 readonly property bool batteryAvailable: batteries.length > 0
// Aggregated charge level (percentage) // Aggregated charge level (percentage)
readonly property real batteryLevel: { readonly property real batteryLevel: {
if (!batteryAvailable) return 0 if (!batteryAvailable)
return 0;
if (batteryCapacity === 0) { if (batteryCapacity === 0) {
if (usePreferred && device && device.ready) return Math.round(device.percentage * 100) if (usePreferred && device && device.ready)
const validBatteries = batteries.filter(b => b.ready && b.percentage >= 0) return Math.round(device.percentage * 100);
if (validBatteries.length === 0) return 0 const validBatteries = batteries.filter(b => b.ready && b.percentage >= 0);
const avgPercentage = validBatteries.reduce((sum, b) => sum + b.percentage, 0) / validBatteries.length if (validBatteries.length === 0)
return Math.round(avgPercentage * 100) return 0;
const avgPercentage = validBatteries.reduce((sum, b) => sum + b.percentage, 0) / validBatteries.length;
return Math.round(avgPercentage * 100);
} }
return Math.round((batteryEnergy * 100) / batteryCapacity) return Math.round((batteryEnergy * 100) / batteryCapacity);
} }
readonly property bool isCharging: batteryAvailable && batteries.some(b => b.state === UPowerDeviceState.Charging) readonly property bool isCharging: batteryAvailable && batteries.some(b => b.state === UPowerDeviceState.Charging)
@@ -59,170 +85,182 @@ Singleton {
onIsPluggedInChanged: { onIsPluggedInChanged: {
if (suppressSound || !batteryAvailable) { if (suppressSound || !batteryAvailable) {
previousPluggedState = isPluggedIn previousPluggedState = isPluggedIn;
return return;
} }
if (SettingsData.soundsEnabled && SettingsData.soundPluggedIn) { if (SettingsData.soundsEnabled && SettingsData.soundPluggedIn) {
if (isPluggedIn && !previousPluggedState) { if (isPluggedIn && !previousPluggedState) {
AudioService.playPowerPlugSound() AudioService.playPowerPlugSound();
} else if (!isPluggedIn && previousPluggedState) { } else if (!isPluggedIn && previousPluggedState) {
AudioService.playPowerUnplugSound() AudioService.playPowerUnplugSound();
} }
} }
previousPluggedState = isPluggedIn previousPluggedState = isPluggedIn;
} }
// Aggregated charge/discharge rate // Aggregated charge/discharge rate
readonly property real changeRate: { readonly property real changeRate: {
if (!batteryAvailable) return 0 if (!batteryAvailable)
if (usePreferred && device && device.ready) return device.changeRate return 0;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.changeRate, 0) : 0 if (usePreferred && device && device.ready)
return device.changeRate;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.changeRate, 0) : 0;
} }
// Aggregated battery health // Aggregated battery health
readonly property string batteryHealth: { readonly property string batteryHealth: {
if (!batteryAvailable) return "N/A" if (!batteryAvailable)
return "N/A";
// If a preferred battery is selected and ready // If a preferred battery is selected and ready
if (usePreferred && device && device.ready && device.healthSupported) return `${Math.round(device.healthPercentage)}%` if (usePreferred && device && device.ready && device.healthSupported)
return `${Math.round(device.healthPercentage)}%`;
// Otherwise, calculate the average health of all laptop batteries // Otherwise, calculate the average health of all laptop batteries
const validBatteries = batteries.filter(b => b.healthSupported && b.healthPercentage > 0) const validBatteries = batteries.filter(b => b.healthSupported && b.healthPercentage > 0);
if (validBatteries.length === 0) return "N/A" if (validBatteries.length === 0)
return "N/A";
const avgHealth = validBatteries.reduce((sum, b) => sum + b.healthPercentage, 0) / validBatteries.length const avgHealth = validBatteries.reduce((sum, b) => sum + b.healthPercentage, 0) / validBatteries.length;
return `${Math.round(avgHealth)}%` return `${Math.round(avgHealth)}%`;
} }
readonly property real batteryEnergy: { readonly property real batteryEnergy: {
if (!batteryAvailable) return 0 if (!batteryAvailable)
if (usePreferred && device && device.ready) return device.energy return 0;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.energy, 0) : 0 if (usePreferred && device && device.ready)
return device.energy;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.energy, 0) : 0;
} }
// Total battery capacity (Wh) // Total battery capacity (Wh)
readonly property real batteryCapacity: { readonly property real batteryCapacity: {
if (!batteryAvailable) return 0 if (!batteryAvailable)
if (usePreferred && device && device.ready) return device.energyCapacity return 0;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.energyCapacity, 0) : 0 if (usePreferred && device && device.ready)
return device.energyCapacity;
return batteries.length > 0 ? batteries.reduce((sum, b) => sum + b.energyCapacity, 0) : 0;
} }
// Aggregated battery status // Aggregated battery status
readonly property string batteryStatus: { readonly property string batteryStatus: {
if (!batteryAvailable) { if (!batteryAvailable) {
return "No Battery" return "No Battery";
} }
if (isCharging && !batteries.some(b => b.changeRate > 0)) return "Plugged In" if (isCharging && !batteries.some(b => b.changeRate > 0))
return "Plugged In";
const states = batteries.map(b => b.state) const states = batteries.map(b => b.state);
if (states.every(s => s === states[0])) return UPowerDeviceState.toString(states[0]) if (states.every(s => s === states[0]))
return UPowerDeviceState.toString(states[0]);
return isCharging ? "Charging" : (isPluggedIn ? "Plugged In" : "Discharging") return isCharging ? "Charging" : (isPluggedIn ? "Plugged In" : "Discharging");
} }
readonly property bool suggestPowerSaver: batteryAvailable && isLowBattery && UPower.onBattery && (typeof PowerProfiles !== "undefined" && PowerProfiles.profile !== PowerProfile.PowerSaver) readonly property bool suggestPowerSaver: batteryAvailable && isLowBattery && UPower.onBattery && (typeof PowerProfiles !== "undefined" && PowerProfiles.profile !== PowerProfile.PowerSaver)
readonly property var bluetoothDevices: { readonly property var bluetoothDevices: {
const btDevices = [] const btDevices = [];
const bluetoothTypes = [UPowerDeviceType.BluetoothGeneric, UPowerDeviceType.Headphones, UPowerDeviceType.Headset, UPowerDeviceType.Keyboard, UPowerDeviceType.Mouse, UPowerDeviceType.Speakers] const bluetoothTypes = [UPowerDeviceType.BluetoothGeneric, UPowerDeviceType.Headphones, UPowerDeviceType.Headset, UPowerDeviceType.Keyboard, UPowerDeviceType.Mouse, UPowerDeviceType.Speakers];
for (var i = 0; i < UPower.devices.count; i++) { for (var i = 0; i < UPower.devices.count; i++) {
const dev = UPower.devices.get(i) const dev = UPower.devices.get(i);
if (dev && dev.ready && bluetoothTypes.includes(dev.type)) { if (dev && dev.ready && bluetoothTypes.includes(dev.type)) {
btDevices.push({ btDevices.push({
"name": dev.model || UPowerDeviceType.toString(dev.type), "name": dev.model || UPowerDeviceType.toString(dev.type),
"percentage": Math.round(dev.percentage * 100), "percentage": Math.round(dev.percentage * 100),
"type": dev.type "type": dev.type
}) });
} }
} }
return btDevices return btDevices;
} }
// Format time remaining for charge/discharge // Format time remaining for charge/discharge
function formatTimeRemaining() { function formatTimeRemaining() {
if (!batteryAvailable) { if (!batteryAvailable) {
return "Unknown" return "Unknown";
} }
let totalTime = 0 let totalTime = 0;
totalTime = (isCharging) ? ((batteryCapacity - batteryEnergy) / changeRate) : (batteryEnergy / changeRate) totalTime = (isCharging) ? ((batteryCapacity - batteryEnergy) / changeRate) : (batteryEnergy / changeRate);
const avgTime = Math.abs(totalTime * 3600) const avgTime = Math.abs(totalTime * 3600);
if (!avgTime || avgTime <= 0 || avgTime > 86400) return "Unknown" if (!avgTime || avgTime <= 0 || avgTime > 86400)
return "Unknown";
const hours = Math.floor(avgTime / 3600) const hours = Math.floor(avgTime / 3600);
const minutes = Math.floor((avgTime % 3600) / 60) const minutes = Math.floor((avgTime % 3600) / 60);
return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m` return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
} }
function getBatteryIcon() { function getBatteryIcon() {
if (!batteryAvailable) { if (!batteryAvailable) {
return "power" return "power";
} }
if (isCharging) { if (isCharging) {
if (batteryLevel >= 90) { if (batteryLevel >= 90) {
return "battery_charging_full" return "battery_charging_full";
} }
if (batteryLevel >= 80) { if (batteryLevel >= 80) {
return "battery_charging_90" return "battery_charging_90";
} }
if (batteryLevel >= 60) { if (batteryLevel >= 60) {
return "battery_charging_80" return "battery_charging_80";
} }
if (batteryLevel >= 50) { if (batteryLevel >= 50) {
return "battery_charging_60" return "battery_charging_60";
} }
if (batteryLevel >= 30) { if (batteryLevel >= 30) {
return "battery_charging_50" return "battery_charging_50";
} }
if (batteryLevel >= 20) { if (batteryLevel >= 20) {
return "battery_charging_30" return "battery_charging_30";
} }
return "battery_charging_20" return "battery_charging_20";
} }
if (isPluggedIn) { if (isPluggedIn) {
if (batteryLevel >= 90) { if (batteryLevel >= 90) {
return "battery_charging_full" return "battery_charging_full";
} }
if (batteryLevel >= 80) { if (batteryLevel >= 80) {
return "battery_charging_90" return "battery_charging_90";
} }
if (batteryLevel >= 60) { if (batteryLevel >= 60) {
return "battery_charging_80" return "battery_charging_80";
} }
if (batteryLevel >= 50) { if (batteryLevel >= 50) {
return "battery_charging_60" return "battery_charging_60";
} }
if (batteryLevel >= 30) { if (batteryLevel >= 30) {
return "battery_charging_50" return "battery_charging_50";
} }
if (batteryLevel >= 20) { if (batteryLevel >= 20) {
return "battery_charging_30" return "battery_charging_30";
} }
return "battery_charging_20" return "battery_charging_20";
} }
if (batteryLevel >= 95) { if (batteryLevel >= 95) {
return "battery_full" return "battery_full";
} }
if (batteryLevel >= 85) { if (batteryLevel >= 85) {
return "battery_6_bar" return "battery_6_bar";
} }
if (batteryLevel >= 70) { if (batteryLevel >= 70) {
return "battery_5_bar" return "battery_5_bar";
} }
if (batteryLevel >= 55) { if (batteryLevel >= 55) {
return "battery_4_bar" return "battery_4_bar";
} }
if (batteryLevel >= 40) { if (batteryLevel >= 40) {
return "battery_3_bar" return "battery_3_bar";
} }
if (batteryLevel >= 25) { if (batteryLevel >= 25) {
return "battery_2_bar" return "battery_2_bar";
} }
return "battery_1_bar" return "battery_1_bar";
} }
} }