Improve background check handling, and hide services until connection is proved.
This commit is contained in:
110
launcher/ui.py
110
launcher/ui.py
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user