summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml165
1 files changed, 165 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml
new file mode 100644
index 0000000..51d4b54
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/Battery.qml
@@ -0,0 +1,165 @@
+import QtQuick
+import Quickshell.Services.UPower
+import qs.Common
+import qs.Modules.Plugins
+import qs.Services
+import qs.Widgets
+
+BasePill {
+ id: battery
+
+ property bool batteryPopupVisible: false
+ property var popoutTarget: null
+
+ property real touchpadAccumulator: 0
+
+ readonly property int barPosition: {
+ switch (axis?.edge) {
+ case "top":
+ return 0;
+ case "bottom":
+ return 1;
+ case "left":
+ return 2;
+ case "right":
+ return 3;
+ default:
+ return 0;
+ }
+ }
+
+ signal toggleBatteryPopup
+
+ visible: true
+
+ content: Component {
+ Item {
+ implicitWidth: battery.isVerticalOrientation ? (battery.widgetThickness - battery.horizontalPadding * 2) : batteryContent.implicitWidth
+ implicitHeight: battery.isVerticalOrientation ? batteryColumn.implicitHeight : (battery.widgetThickness - battery.horizontalPadding * 2)
+
+ Column {
+ id: batteryColumn
+ visible: battery.isVerticalOrientation
+ anchors.centerIn: parent
+ spacing: 1
+
+ DankIcon {
+ name: BatteryService.getBatteryIcon()
+ size: Theme.barIconSize(battery.barThickness, undefined, battery.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
+ color: {
+ if (!BatteryService.batteryAvailable) {
+ return Theme.widgetIconColor;
+ }
+
+ if (BatteryService.isLowBattery && !BatteryService.isCharging) {
+ return Theme.error;
+ }
+
+ if (BatteryService.isCharging || BatteryService.isPluggedIn) {
+ return Theme.primary;
+ }
+
+ return Theme.widgetIconColor;
+ }
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ StyledText {
+ text: BatteryService.batteryLevel.toString()
+ font.pixelSize: Theme.barTextSize(battery.barThickness, battery.barConfig?.fontScale, battery.barConfig?.maximizeWidgetText)
+ color: Theme.widgetTextColor
+ anchors.horizontalCenter: parent.horizontalCenter
+ visible: BatteryService.batteryAvailable
+ }
+ }
+
+ Row {
+ id: batteryContent
+ visible: !battery.isVerticalOrientation
+ anchors.centerIn: parent
+ spacing: (barConfig?.noBackground ?? false) ? 1 : 2
+
+ DankIcon {
+ name: BatteryService.getBatteryIcon()
+ size: Theme.barIconSize(battery.barThickness, -4, battery.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
+ color: {
+ if (!BatteryService.batteryAvailable) {
+ return Theme.widgetIconColor;
+ }
+
+ if (BatteryService.isLowBattery && !BatteryService.isCharging) {
+ return Theme.error;
+ }
+
+ if (BatteryService.isCharging || BatteryService.isPluggedIn) {
+ return Theme.primary;
+ }
+
+ return Theme.widgetIconColor;
+ }
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: `${BatteryService.batteryLevel}%`
+ font.pixelSize: Theme.barTextSize(battery.barThickness, battery.barConfig?.fontScale, battery.barConfig?.maximizeWidgetText)
+ color: Theme.widgetTextColor
+ anchors.verticalCenter: parent.verticalCenter
+ visible: BatteryService.batteryAvailable
+ }
+ }
+ }
+ }
+
+ MouseArea {
+ x: -battery.leftMargin
+ y: -battery.topMargin
+ width: battery.width + battery.leftMargin + battery.rightMargin
+ height: battery.height + battery.topMargin + battery.bottomMargin
+ cursorShape: Qt.PointingHandCursor
+ acceptedButtons: Qt.LeftButton
+ onPressed: mouse => {
+ battery.triggerRipple(this, mouse.x, mouse.y);
+ toggleBatteryPopup();
+ }
+ onWheel: wheel => {
+ var delta = wheel.angleDelta.y;
+ if (delta === 0)
+ return;
+
+ // Check if this is a touchpad
+ if (delta !== 120 && delta !== -120) {
+ touchpadAccumulator += delta;
+ console.info("Acc: "+touchpadAccumulator);
+ if (Math.abs(touchpadAccumulator) < 500)
+ return;
+ delta = touchpadAccumulator;
+ touchpadAccumulator = 0;
+ }
+ console.info("Trigger! Delta: "+delta)
+
+ // This is after the other delta checks so it only shows on valid Y scroll
+ if (typeof PowerProfiles === "undefined") {
+ ToastService.showError("power-profiles-daemon not available");
+ return;
+ }
+
+ // Get list of profiles, and current index
+ const profiles = [PowerProfile.PowerSaver, PowerProfile.Balanced].concat(PowerProfiles.hasPerformanceProfile ? [PowerProfile.Performance] : []);
+ var index = profiles.findIndex(profile => PowerProfiles.profile === profile);
+
+ // Step once based on mouse wheel direction
+ if (delta > 0) index += 1;
+ else index -= 1;
+
+ // Already at end of list, can't go further
+ if (index < 0 || index >= profiles.length) return;
+
+ // Set new profile
+ PowerProfiles.profile = profiles[index];
+ if (PowerProfiles.profile !== profiles[index]) {
+ ToastService.showError("Failed to set power profile");
+ }
+ }
+ }
+}