feat: battery

This commit is contained in:
2025-09-29 09:01:23 +02:00
parent df2bef7685
commit fc264dda44
7 changed files with 126 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ from fabric.widgets.datetime import DateTime
from fabric.widgets.centerbox import CenterBox
from bar.modules.player import Player
from bar.modules.vinyl import VinylButton
from bar.modules.battery import Battery
from fabric.widgets.wayland import WaylandWindow as Window
from fabric.system_tray.widgets import SystemTray
from fabric.river.widgets import (
@@ -19,7 +20,7 @@ from fabric.utils import (
)
from fabric.widgets.circularprogressbar import CircularProgressBar
from bar.config import VINYL
from bar.config import VINYL, BATTERY
class StatusBar(Window):
@@ -80,6 +81,10 @@ class StatusBar(Window):
if VINYL["enable"]:
self.vinyl = VinylButton()
self.battery = None
if BATTERY["enable"]:
self.battery = Battery()
print(self.battery)
self.status_container = Box(
name="widgets-container",
spacing=4,
@@ -92,6 +97,9 @@ class StatusBar(Window):
if self.vinyl:
end_container_children.append(self.vinyl)
if self.battery:
end_container_children.append(self.battery)
end_container_children.append(self.status_container)
if self.system_tray:
end_container_children.append(self.system_tray)

85
bar/modules/battery.py Normal file
View File

@@ -0,0 +1,85 @@
import psutil
from gi.repository import GLib
from fabric.widgets.box import Box
from fabric.widgets.label import Label
from fabric.widgets.icon import Icon
from fabric import Fabricator
class BatteryProvider:
def __init__(self):
self.bat_percent = 0.0
self.bat_charging = None
GLib.timeout_add_seconds(1, self._update)
def _update(self):
battery = psutil.sensors_battery()
if battery is None:
self.bat_percent = 0.0
self.bat_charging = None
else:
self.bat_percent = battery.percent
self.bat_charging = battery.power_plugged
return True
def get_battery(self):
return (self.bat_percent, self.bat_charging)
class Battery(Box):
def __init__(self, **kwargs):
super().__init__(name="battery-widget", orientation="h", spacing=4, **kwargs)
self.bat_provider = BatteryProvider()
self.bat_icon = Icon(
name="bat-icon",
icon_name="battery-full-symbolic",
icon_size=16
)
self.bat_label = Label(
name="bat-label",
label="100%"
)
self.bat_fabricator = Fabricator(
poll_from=lambda: self.bat_provider.get_battery(),
on_changed=self.update_battery,
interval=1000,
stream=False,
default_value=(100, False),
)
self.children = [self.bat_icon, self.bat_label]
self.show_all()
GLib.idle_add(self.update_battery, None, self.bat_provider.get_battery())
def _icon_lookup(self, bat, charging):
if charging:
return "battery-charging-symbolic"
match bat:
case _ if bat > 90:
return "battery-full-symbolic"
case _ if bat > 50:
return "battery-good-symbolic"
case _ if bat >= 20:
return "battery-medium-symbolic"
case _:
return "battery-low-symbolic"
def update_battery(self, sender, battery_data):
value, charging = battery_data
icon_name = self._icon_lookup(value, charging)
self.bat_icon.set_property("icon-name", icon_name)
self.bat_label.set_text(f"{int(value)}%")
if value < 20 and not charging:
self.bat_label.add_css_class("battery-low")
else:
self.bat_label.remove_css_class("battery-low")
return True