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"); } } } }