202 lines
6.6 KiB
Python
202 lines
6.6 KiB
Python
from fabric.widgets.box import Box
|
|
from fabric.widgets.label import Label
|
|
from fabric.widgets.image import Image
|
|
from fabric.widgets.overlay import Overlay
|
|
from fabric.widgets.datetime import DateTime
|
|
from fabric.widgets.centerbox import CenterBox
|
|
from sims.modules.player import Player, PlayerSmall
|
|
from sims.modules.battery import Battery
|
|
from sims.modules.control_center import ControlCenter
|
|
from sims.modules.notmuch import NotmuchWidget
|
|
from sims.modules.screenrec import ScreenrecWidget
|
|
from fabric.widgets.wayland import WaylandWindow as Window
|
|
from fabric.system_tray.widgets import SystemTray
|
|
from sims.widgets.fenster import FensterWorkspaces, FensterActiveWindow
|
|
from sims.services.screenrec import ScreenrecService
|
|
from sims.services.smart_corners import get_smart_corners_service
|
|
from fabric.widgets.button import Button
|
|
from fabric.widgets.circularprogressbar import CircularProgressBar
|
|
from sims.services.system_stats import SystemStatsService
|
|
|
|
from sims.config import BATTERY, BAR_HEIGHT, WINDOW_TITLE, NOTMUCH
|
|
|
|
|
|
class StatusBar(Window):
|
|
def __init__(
|
|
self,
|
|
display: str,
|
|
tray: SystemTray | None = None,
|
|
monitor: int = 1,
|
|
screenrec_service: ScreenrecService | None = None,
|
|
control_center: ControlCenter | None = None,
|
|
):
|
|
super().__init__(
|
|
name="sims",
|
|
layer="top",
|
|
anchor="left top right",
|
|
margin="0px 0px -2px 0px",
|
|
exclusivity="auto",
|
|
visible=False,
|
|
all_visible=False,
|
|
monitor=monitor,
|
|
)
|
|
self.output = display
|
|
self._corners_rounded = False
|
|
self._right_flat = False
|
|
|
|
self.workspaces = FensterWorkspaces(
|
|
output=display,
|
|
name="workspaces",
|
|
spacing=4,
|
|
)
|
|
|
|
datetime_widget = DateTime(name="date-time", formatters="%d %b - %H:%M")
|
|
self.date_time = Button(
|
|
name="date-time-button",
|
|
child=datetime_widget,
|
|
on_clicked=self._on_date_time_clicked,
|
|
style="background: transparent; border: none; padding: 0; margin: 0; box-shadow: none;",
|
|
)
|
|
self.control_center = control_center
|
|
|
|
self.system_tray = tray
|
|
|
|
self.active_window = FensterActiveWindow(
|
|
name="active-window",
|
|
max_length=50,
|
|
style="color: #ffffff; font-size: 14px; font-weight: bold;",
|
|
)
|
|
|
|
self.ram_progress_bar = CircularProgressBar(
|
|
name="ram-progress-bar", pie=True, size=24
|
|
)
|
|
self.cpu_progress_bar = CircularProgressBar(
|
|
name="cpu-progress-bar", pie=True, size=24
|
|
)
|
|
|
|
self.progress_label = Label(
|
|
"", style="margin: 0px 6px 0px 0px; font-size: 12px"
|
|
)
|
|
self.progress_bars_overlay = Overlay(
|
|
child=self.ram_progress_bar,
|
|
overlays=[self.cpu_progress_bar, self.progress_label],
|
|
)
|
|
self.player = Player()
|
|
self.player_small = PlayerSmall()
|
|
|
|
self.battery = None
|
|
if BATTERY["enable"]:
|
|
self.battery = Battery()
|
|
|
|
self.notmuch = None
|
|
if NOTMUCH["enable"]:
|
|
self.notmuch = NotmuchWidget()
|
|
|
|
self.screenrec = None
|
|
if screenrec_service is not None:
|
|
self.screenrec = ScreenrecWidget(screenrec_service)
|
|
|
|
self.status_container = Box(
|
|
name="widgets-container",
|
|
spacing=4,
|
|
orientation="h",
|
|
children=self.progress_bars_overlay,
|
|
)
|
|
|
|
end_container_children = []
|
|
|
|
end_container_children.append(self.status_container)
|
|
if self.system_tray:
|
|
end_container_children.append(self.system_tray)
|
|
|
|
if self.battery:
|
|
end_container_children.append(self.battery)
|
|
|
|
if self.notmuch:
|
|
end_container_children.append(self.notmuch)
|
|
|
|
if self.screenrec:
|
|
end_container_children.append(self.screenrec)
|
|
|
|
end_container_children.append(self.date_time)
|
|
|
|
center_children = []
|
|
if WINDOW_TITLE["enable"]:
|
|
center_children.append(self.active_window)
|
|
|
|
self.inner = CenterBox(
|
|
name="sims-inner",
|
|
start_children=Box(
|
|
name="start-container",
|
|
spacing=6,
|
|
orientation="h",
|
|
children=[
|
|
Image(name="nixos-label", icon_name="nix-snowflake-white", icon_size=20),
|
|
self.workspaces,
|
|
self.player_small,
|
|
],
|
|
),
|
|
center_children=Box(
|
|
name="center-container",
|
|
spacing=4,
|
|
orientation="h",
|
|
children=center_children,
|
|
),
|
|
end_children=Box(
|
|
name="end-container",
|
|
spacing=4,
|
|
orientation="h",
|
|
children=end_container_children,
|
|
),
|
|
)
|
|
self.children = self.inner
|
|
|
|
self.system_stats_service = SystemStatsService(update_interval=3000)
|
|
self.system_stats_service.connect("stats-changed", self.update_progress_bars)
|
|
|
|
self.set_size_request(-1, BAR_HEIGHT)
|
|
|
|
smart_corners = get_smart_corners_service()
|
|
smart_corners.connect("state-changed", self._on_smart_corners_changed)
|
|
self.set_corners_rounded(not smart_corners.get(display))
|
|
|
|
if self.control_center is not None:
|
|
self.control_center.add_visibility_listener(self.set_right_flat)
|
|
|
|
self.show_all()
|
|
|
|
@property
|
|
def corners_rounded(self) -> bool:
|
|
return self._corners_rounded
|
|
|
|
def set_corners_rounded(self, rounded: bool) -> None:
|
|
if rounded == self._corners_rounded:
|
|
return
|
|
if rounded:
|
|
self.inner.add_style_class("rounded-bottom")
|
|
else:
|
|
self.inner.remove_style_class("rounded-bottom")
|
|
self._corners_rounded = rounded
|
|
|
|
def _on_smart_corners_changed(self, _service, output: str, active: bool):
|
|
if output != self.output:
|
|
return
|
|
self.set_corners_rounded(not active)
|
|
|
|
def set_right_flat(self, flat: bool) -> None:
|
|
if flat == self._right_flat:
|
|
return
|
|
if flat:
|
|
self.inner.set_style("border-radius: 0 0 0 28px;")
|
|
else:
|
|
self.inner.set_style("")
|
|
self._right_flat = flat
|
|
|
|
def update_progress_bars(self, service, cpu_percent, memory_percent):
|
|
self.cpu_progress_bar.value = cpu_percent
|
|
self.ram_progress_bar.value = memory_percent
|
|
|
|
def _on_date_time_clicked(self, _button=None):
|
|
if self.control_center is not None:
|
|
self.control_center.toggle()
|