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

@@ -50,3 +50,4 @@ if app_config is None:
raise Exception("Config file missing") raise Exception("Config file missing")
VINYL = app_config.get("vinyl", {"enable": False}) VINYL = app_config.get("vinyl", {"enable": False})
BATTERY = app_config.get("battery", {"enable": False})

View File

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

View File

@@ -15,6 +15,27 @@
font-weight: bold; font-weight: bold;
} }
#battery-widget {
background-color: var(--module-bg);
padding: 4px 8px;
border-radius: 4px;
}
#bat-icon {
color: var(--blue);
margin-right: 2px;
}
#bat-label {
color: var(--foreground);
font-size: 14px;
}
#bat-label.battery-low {
color: var(--red);
font-weight: bold;
}
#cpu-progress-bar, #cpu-progress-bar,
#ram-progress-bar, #ram-progress-bar,
#volume-progress-bar { #volume-progress-bar {

0
bar/widgets/battery.py Normal file
View File

View File

@@ -1,2 +1,4 @@
vinyl: vinyl:
enabled: true enable: true
battery:
enable: true

View File

@@ -76,10 +76,17 @@
default = false; default = false;
}; };
}; };
battery = {
enable = lib.mkOption {
type = lib.types.bool;
default = false;
};
};
}; };
}; };
default = { default = {
vinyl.enable = false; vinyl.enable = false;
battery.enable = false;
}; };
}; };
}; };