Files
hyprland/config/quickbar/modules/bar/widgets/info.py
T
2025-01-11 08:03:49 +05:45

90 lines
2.9 KiB
Python

import psutil
from fabric import Fabricator
from fabric.widgets.box import Box
from fabric.widgets.button import Button
from fabric.widgets.circularprogressbar import CircularProgressBar
from fabric.widgets.label import Label
from fabric.widgets.overlay import Overlay
from snippets import MaterialIcon
class SystemInfo(Button):
ICONS = [
("CPU", "settings_motion_mode"),
("Swap", "swap_horiz"),
("RAM", "memory_alt"),
("Temp", "thermometer"),
]
def __init__(self):
super().__init__(child=self._initialize_content())
self.fabricator = Fabricator(poll_from=self._refresh_system_info, interval=1000)
def _initialize_content(self):
self.box = Box(orientation="h", name="info")
self.progress_bars = {}
self.labels = {}
self.icons = {}
for system, icon_name in self.ICONS:
self._create_system_item(system, icon_name)
return self.box
def _create_system_item(self, system, icon_name):
self.progress_bars[system] = self._create_progress_bar()
self.labels[system] = self._create_label()
self.icons[system] = self._create_icon(icon_name)
overlay = Overlay(child=self.progress_bars[system], overlays=self.icons[system])
self.box.pack_start(overlay, False, False, 0)
self.box.pack_start(self.labels[system], False, False, 0)
def _create_progress_bar(self):
return CircularProgressBar(
name="progress", line_style="round", line_width=1, size=30
)
def _create_label(self):
return Label(style="font-size:14px; margin: 4px;")
def _create_icon(self, icon_name):
return MaterialIcon(icon_name, size=16)
def _refresh_system_info(self, *_):
usages = self._retrieve_system_data()
self._update_tooltip(usages)
return True
@staticmethod
def _get_device_temperature():
try:
temps = psutil.sensors_temperatures()
if "coretemp" in temps:
return temps["coretemp"][0].current
elif "cpu_thermal" in temps:
return temps["cpu_thermal"][0].current
return None
except Exception:
return None
def _retrieve_system_data(self):
return {
"CPU": round(psutil.cpu_percent()),
"RAM": round(psutil.virtual_memory().percent),
"Swap": round(psutil.swap_memory().percent),
"Temp": self._get_device_temperature(),
}
def _update_tooltip(self, usages):
for system, usage in usages.items():
if usage is None:
usage = 0
self.labels[system].set_label("N/A")
else:
usage = int(usage)
self.progress_bars[system].value = usage / 100
self.labels[system].set_label(f"{usage}")
self.progress_bars[system].set_tooltip_text(f"{system} Usage: {usage}%")