pragma Singleton pragma ComponentBehavior import QtQuick import Quickshell import Quickshell.Services.UPower Singleton { id: root readonly property UPowerDevice device: UPower.displayDevice readonly property bool batteryAvailable: device && device.ready && device.isLaptopBattery readonly property int batteryLevel: batteryAvailable ? device.percentage * 100 : 0 readonly property bool isCharging: batteryAvailable && device.state === UPowerDeviceState.Charging readonly property bool isLowBattery: batteryAvailable && batteryLevel <= 20 readonly property string batteryHealth: batteryAvailable && device.healthSupported ? Math.round( device.healthPercentage * 100) + "%" : "N/A" readonly property real batteryCapacity: batteryAvailable && device.energyCapacity > 0 ? device.energyCapacity : 0 readonly property string batteryStatus: { if (!batteryAvailable) return "No Battery" return UPowerDeviceState.toString(device.state) } readonly property int timeRemaining: { if (!batteryAvailable) return 0 return isCharging ? (device.timeToFull || 0) : (device.timeToEmpty || 0) } readonly property bool suggestPowerSaver: batteryAvailable && isLowBattery && UPower.onBattery && (typeof PowerProfiles !== "undefined" && PowerProfiles.profile !== PowerProfile.PowerSaver) readonly property var bluetoothDevices: { var btDevices = [] for (var i = 0; i < UPower.devices.count; i++) { var dev = UPower.devices.get(i) if (dev && dev.ready && (dev.type === UPowerDeviceType.BluetoothGeneric || dev.type === UPowerDeviceType.Headphones || dev.type === UPowerDeviceType.Headset || dev.type === UPowerDeviceType.Keyboard || dev.type === UPowerDeviceType.Mouse || dev.type === UPowerDeviceType.Speakers)) btDevices.push({ "name": dev.model || UPowerDeviceType.toString(dev.type), "percentage": Math.round(dev.percentage), "type": dev.type }) } return btDevices } function formatTimeRemaining() { if (!batteryAvailable || timeRemaining <= 0) return "Unknown" const hours = Math.floor(timeRemaining / 3600) const minutes = Math.floor((timeRemaining % 3600) / 60) if (hours > 0) return hours + "h " + minutes + "m" else return minutes + "m" } }