2026-01-15 15:14:29 +01:00
|
|
|
import Quickshell.Services.UPower
|
|
|
|
|
import QtQuick
|
2026-01-19 00:06:43 +01:00
|
|
|
import Quickshell.Widgets
|
|
|
|
|
import Qt5Compat.GraphicalEffects
|
|
|
|
|
import Quickshell
|
2026-01-15 15:14:29 +01:00
|
|
|
import "../../reusables/"
|
|
|
|
|
import "../../settings/"
|
2026-01-18 23:18:42 +01:00
|
|
|
import "../../"
|
2026-01-15 15:14:29 +01:00
|
|
|
|
2026-01-15 17:43:03 +01:00
|
|
|
Loader {
|
|
|
|
|
id: batLoader
|
|
|
|
|
active: UPower.displayDevice.isLaptopBattery
|
2026-01-18 23:18:42 +01:00
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
2026-01-15 15:14:29 +01:00
|
|
|
|
2026-01-18 23:18:42 +01:00
|
|
|
sourceComponent: Rectangle {
|
|
|
|
|
id: container
|
|
|
|
|
radius: implicitHeight / 2
|
|
|
|
|
color: Colors.color0
|
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
|
implicitWidth: root.implicitWidth + 20
|
|
|
|
|
implicitHeight: Settings.config.barHeight - 10
|
|
|
|
|
Item {
|
|
|
|
|
id: root
|
2026-01-19 00:06:43 +01:00
|
|
|
anchors.centerIn: parent
|
2026-01-16 14:44:10 +01:00
|
|
|
|
2026-01-18 23:18:42 +01:00
|
|
|
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
|
2026-01-16 14:44:10 +01:00
|
|
|
|
2026-01-18 23:18:42 +01:00
|
|
|
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";
|
|
|
|
|
}
|
2026-01-16 14:44:10 +01:00
|
|
|
}
|
2026-01-19 00:06:43 +01:00
|
|
|
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";
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-16 14:44:10 +01:00
|
|
|
|
2026-01-18 23:18:42 +01:00
|
|
|
implicitWidth: batRow.width
|
|
|
|
|
implicitHeight: Settings.config.barHeight
|
2026-01-15 15:14:29 +01:00
|
|
|
|
2026-01-18 23:18:42 +01:00
|
|
|
Row {
|
|
|
|
|
id: batRow
|
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
|
spacing: 5
|
|
|
|
|
CustomText {
|
|
|
|
|
id: batText
|
|
|
|
|
text: Math.round(UPower.displayDevice.percentage * 100) + "%"
|
|
|
|
|
}
|
|
|
|
|
CustomIcon {
|
|
|
|
|
id: batIcon
|
|
|
|
|
text: root.getBatteryIcon()
|
|
|
|
|
}
|
2026-01-19 00:06:43 +01:00
|
|
|
Item {
|
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
|
implicitWidth: 12
|
|
|
|
|
implicitHeight: 12
|
|
|
|
|
|
|
|
|
|
IconImage {
|
|
|
|
|
id: rawProfileIcon
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
source: Quickshell.iconPath(root.getProfileIcon())
|
|
|
|
|
visible: false // 🤫 Shh! Hide the dark original
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ColorOverlay {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
source: rawProfileIcon
|
|
|
|
|
color: "white" // ✨ The magic dye!
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
MouseArea {
|
|
|
|
|
anchors.fill: parent
|
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
|
|
|
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];
|
|
|
|
|
}
|
2026-01-15 17:43:03 +01:00
|
|
|
}
|
2026-01-15 15:14:29 +01:00
|
|
|
}
|
2026-01-16 15:15:44 +01:00
|
|
|
}
|
2026-01-15 15:14:29 +01:00
|
|
|
}
|