quickshell/modules/bar/Battery.qml
2026-01-27 17:32:08 +01:00

125 lines
4.6 KiB
QML

import Quickshell.Services.UPower
import QtQuick
import Quickshell.Widgets
import Qt5Compat.GraphicalEffects
import Quickshell
import qs
import qs.reusables
import qs.settings
Loader {
id: batLoader
active: UPower.displayDevice.isLaptopBattery
anchors.verticalCenter: parent.verticalCenter
sourceComponent: Rectangle {
id: container
radius: implicitHeight / 2
color: clickHandler.containsMouse ? Colors.secondaryContainer : Colors.primaryContainer
anchors.verticalCenter: parent.verticalCenter
implicitWidth: root.implicitWidth + 20
implicitHeight: Settings.config.barHeight - 10
Item {
id: root
anchors.centerIn: parent
property bool frame1: UPower.displayDevice.percentage <= 0.16
property bool frame2: UPower.displayDevice.percentage < 0.32
property bool frame3: UPower.displayDevice.percentage < 0.48
property bool frame4: UPower.displayDevice.percentage < 0.74
property bool frame5: UPower.displayDevice.percentage < 0.90
property bool frame6: UPower.displayDevice.percentage <= 1
function getBatteryIcon() {
if (UPower.displayDevice.state == UPowerDeviceState.Charging) {
return "battery_android_frame_bolt";
}
if (frame1) {
return "battery_android_frame_1";
}
if (frame2) {
return "battery_android_frame_2";
}
if (frame3) {
return "battery_android_frame_3";
}
if (frame4) {
return "battery_android_frame_4";
}
if (frame5) {
return "battery_android_frame_5";
}
if (frame6) {
return "battery_android_frame_full";
}
}
function getProfileIcon() {
if (PowerProfiles.profile.toString() == "2") {
return "power-profile-performance-symbolic";
}
if (PowerProfiles.profile.toString() == "1") {
return "power-profile-balanced-symbolic";
}
if (PowerProfiles.profile.toString() == "0") {
return "power-profile-power-saver-symbolic";
}
}
implicitWidth: batRow.width
implicitHeight: Settings.config.barHeight
Row {
id: batRow
anchors.verticalCenter: parent.verticalCenter
spacing: 5
CustomText {
id: batText
anchors.verticalCenter: parent.verticalCenter
text: Math.round(UPower.displayDevice.percentage * 100) + "%"
}
CustomIcon {
id: batIcon
font.family: "Material Symbols Rounded"
text: root.getBatteryIcon()
}
Item {
anchors.verticalCenter: parent.verticalCenter
implicitWidth: 12
implicitHeight: 12
IconImage {
id: rawProfileIcon
anchors.fill: parent
source: Quickshell.iconPath(root.getProfileIcon())
visible: false
}
ColorOverlay {
anchors.fill: parent
source: rawProfileIcon
color: Colors.onSurfaceColor
}
}
}
MouseArea {
id: clickHandler
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
hoverEnabled: true
onClicked: mouse => {
const modes = [PowerProfile.PowerSaver, PowerProfile.Balanced, PowerProfile.Performance];
let current = PowerProfiles.profile;
let currentIndex = modes.indexOf(current);
let nextIndex = (currentIndex + 1) % modes.length;
let prevIndex = (currentIndex - 1) % modes.length;
if (mouse.button == Qt.LeftButton)
PowerProfiles.profile = modes[nextIndex];
if (mouse.button == Qt.RightButton)
PowerProfiles.profile = modes[prevIndex];
}
}
}
}
}