feat(battery): add charge threshold slider when sysfs available

- Show FlatScale slider (20-100%) next to charge limit toggle
- Display current threshold value as label
- Only rendered when sysfs charge_control path is detected
This commit is contained in:
sankalp committed 2026-07-23 11:32:11 +05:45
1 parent dda54bab19
commit ea68fdab47
1 file changed
+53 -2
+53 -2
View File
@@ -9,6 +9,7 @@ from fabric.widgets.separator import Separator
from services.battery import Battery
from services.gamemode import GameModeService
from shared.capture import CaptureNotifier
from shared.widgets.flat_scale import FlatScale
from utils.functions import clear_children, format_duration
from utils.gtk_utils import svg_file
@@ -92,6 +93,10 @@ class ChargeLimitButton(Box):
super().__init__(name="energy-mode-button", h_expand=True, **kwargs)
self.battery_service = battery_service
self.parent = parent
self._has_threshold = (
battery_service.charge_limit is not None
and battery_service.charge_limit.sysfs_path is not None
)
self.charge_icon_svg = svg_file("zap.svg", size=16)
@@ -120,7 +125,37 @@ class ChargeLimitButton(Box):
h_expand=True,
)
self.children = [self.button]
children = [self.button]
if self._has_threshold:
self.threshold_label = Label(
label="80%",
style_classes="charge-threshold-value",
h_align="end",
)
self.slider = FlatScale(
value=80.0,
min_value=20.0,
max_value=100.0,
step=5.0,
draw_value=True,
orientation="horizontal",
on_value_changed=self._on_slider_changed,
name="charge-threshold-slider",
style_classes="charge-threshold-flat-scale",
h_expand=True,
)
self.slider_box = Box(
orientation="horizontal",
spacing=8,
children=[self.slider, self.threshold_label],
)
children.append(self.slider_box)
self.children = children
self.update_state()
def on_clicked(self, *args):
@@ -132,9 +167,14 @@ class ChargeLimitButton(Box):
_charge_notifier.notify(
"Charge Limit",
f"Battery charge limit {state}",
icon="battery-full-charging-symbolic",
icon="battery-full-charged-symbolic",
)
def _on_slider_changed(self, _scale, value):
threshold = round(value)
self.threshold_label.set_label(f"{threshold}%")
self.battery_service.set_charge_threshold(threshold)
def update_state(self, *_):
cl = self.battery_service.charge_limit
if cl is not None and cl.enabled:
@@ -142,6 +182,17 @@ class ChargeLimitButton(Box):
else:
self.charge_icon.remove_style_class("connected")
if self._has_threshold:
threshold = self.battery_service.get_charge_threshold()
if threshold is not None:
self.slider.handler_block_by_func(self._on_slider_changed)
self.slider.set_value(float(threshold))
self.slider.handler_unblock_by_func(self._on_slider_changed)
self.threshold_label.set_label(f"{threshold}%")
is_enabled = cl is not None and cl.enabled
self.slider.set_sensitive(is_enabled)
self.slider_box.set_visible(is_enabled)
class GameModeButton(Box):
def __init__(self, parent, **kwargs):