Improve background check handling, and hide services until connection is proved.

This commit is contained in:
2026-08-26 21:32:18 +01:00
parent 80c2fc086f
commit d2cb0b0645
7 changed files with 223 additions and 58 deletions

View File

@@ -12,47 +12,78 @@ class UIController:
self,
ui_file="window.ui",
css_file="style.css",
status_provider_callback=None,
power_action_callback=None
system_checks=None,
power_action_callback=None,
service_action_callback=None,
services = None
):
self.builder = Gtk.Builder.new_from_file(ui_file)
self.window = self.builder.get_object("main_window")
self._load_styles(css_file)
self._setup_clock()
self._initialist_power_options()
self._initialise_power_options()
self.power_action_callback = power_action_callback
self.system_checks = system_checks
self.service_action_callback = service_action_callback
self.services = services or []
if status_provider_callback:
self.setup_status_poller(status_provider_callback)
self._cards_created = False
self._services_visible = False
def setup_status_poller(self, status_provider_callback, interval_seconds=20):
""" Accepts any function that returns a dictionary of statuses,
currently: {'net':True, 'ziti':True}
"""
def poll():
try:
statuses = status_provider_callback()
print(f"Status result {statuses}")
if self.system_checks:
self._setup_system_status()
# UPDATE UI
self._update_label(
"net_status",
"Net: Connected" if statuses.get("net") else "Net: Disconnected",
statuses.get("net"),
)
self._update_label(
"ziti_status",
"Ziti: Connected" if statuses.get("ziti") else "Ziti: Disconnected",
statuses.get("ziti")
)
except Exception as e:
print(f"Error polling status: {e}")
import traceback
traceback.print_exc()
return True
if not self._cards_created:
self._create_cards()
self._cards_created = True
def _setup_system_status(self):
"""Monitor SystemChecks state from GTK Main thread"""
self._update_system_status()
GLib.timeout_add_seconds(
1,
self._update_system_status
)
def _update_system_status(self):
"""Update Status display and create cards when system is ready"""
network = self.system_checks.network_online
ziti = self.system_checks.ziti_online
if network is None:
self._update_label(
"net_status",
"Net: Checking",
None,
)
else:
self._update_label(
"net_status",
"Net: Connected" if network else "Net: Disconnected",
network,
)
if ziti is None:
self._update_label(
"ziti_status",
"Ziti: Checking",
None,
)
else :
self._update_label(
"ziti_status",
"Ziti: Connected" if ziti else "Ziti: Disconnected",
ziti,
)
if self.system_checks.ready and not self._services_visible:
self.builder.get_object("startup_revealer").set_reveal_child(False)
self.builder.get_object("cards_revealer").set_reveal_child(True)
self._services_visible = True
return True
poll()
GLib.timeout_add_seconds(interval_seconds, poll)
def _update_label(self, widget_id, text, is_healthy):
label = self.builder.get_object(widget_id)
@@ -65,6 +96,21 @@ class UIController:
label.remove_css_class("ok-label")
label.add_css_class("error-label")
def _create_cards(self):
"""Create Service Cards"""
for service in self.services:
title = service.get("title", "Service")
desc = service.get("desc", "")
bg_img = service.get("bg_image", "")
self.add_card(
title,
desc,
bg_img,
lambda svc=service: self.service_action_callback(svc),
)
def _load_styles(self, css_file):
css_provider = Gtk.CssProvider()
css_provider.load_from_path(css_file)
@@ -87,7 +133,7 @@ class UIController:
update()
GLib.timeout_add_seconds(10, update)
def _initialist_power_options(self):
def _initialise_power_options(self):
btn_reboot = self.builder.get_object("btn_reboot")
btn_shutdown = self.builder.get_object("btn_shutdown")