Files
dotfiles/modules/quickshell/quickshell/bar/widgets/Battery.qml
2025-12-30 16:35:44 +00:00

87 lines
2.8 KiB
QML

import Quickshell
import Quickshell.Io
import QtQuick
import QtQuick.Layouts
import Quickshell.Widgets
import Quickshell.Services.Pipewire
import QtQuick.VectorImage
import QtQuick.Effects
import Quickshell.Services.UPower
import "common" as Common
Rectangle {
// TODO eventually fix the alignment (it isnt centered horizentally)
id: root
property int battPercent: 58
implicitWidth: itemContent.width + 8
implicitHeight: 24
visible: {
if (UPower.displayDevice.ready) {
true;
} else {
false;
}
}
radius: 5.5
Layout.alignment: Qt.AlignVCenter
color: "#2a2a2a" // Define item color
RowLayout {
id: itemContent
implicitWidth: 24
implicitHeight: 24
anchors.centerIn: parent
Text {
// anchors.centerIn: parent
text: Math.round(UPower.displayDevice.percentage * 100) + "%"
color: Common.Colors.colors.primary
font.weight: Font.DemiBold
font.pointSize: 12
}
Item {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
implicitWidth: icon.width
implicitHeight: icon.height
Text {
id: icon
anchors.centerIn: parent
text: root.getBatteryState(UPower.displayDevice.percentage * 100, ((UPower.displayDevice.timeToFull > 0)))
color: root.getBatteryColor(UPower.displayDevice.percentage * 100)
font.weight: Font.DemiBold
font.pointSize: 24 / 1.4
}
}
}
function getBatteryState(level, isCharging) {
if (level === null || level === 0) {
// Return the battery empty icon
return isCharging ? Common.Icons.battery.charging["1"] : Common.Icons.battery["0"];
}
if (level === 100) {
// Return the battery full icon
return isCharging ? Common.Icons.battery.charging["10"] : Common.Icons.battery["10"];
}
// Calculate step as a value between 1 and 10 (divide level into 10 ranges)
let step = Math.ceil(level / 10); // Range mapping
if (step > 10)
step = 10; // Clamp to 10 if it exceeds bounds
// Return the correct icon based on state
return isCharging ? Common.Icons.battery.charging[String(step)] : Common.Icons.battery[String(step)];
}
function getBatteryColor(level) {
if (level === null || level === 0) {
// Use critical color for empty battery
return Common.Colors.colors.critial2;
}
if (level > 0 && level <= 20) {
// Use critical color for low battery
return Common.Colors.colors.critial2;
}
// Default color if no specific condition is met
return Common.Colors.colors.primary;
}
}