diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py
index 5099cbce..3c64e30f 100644
--- a/ks_includes/screen_panel.py
+++ b/ks_includes/screen_panel.py
@@ -40,6 +40,12 @@ class ScreenPanel:
else:
self.bts = .5
+ self.update_dialog = None
+
+ def _autoscroll(self, scroll, *args):
+ adj = scroll.get_vadjustment()
+ adj.set_value(adj.get_upper() - adj.get_page_size())
+
def emergency_stop(self, widget):
if self._config.get_main_config().getboolean('confirm_estop', False):
self._screen._confirm_send_action(widget, _("Are you sure you want to run Emergency Stop?"),
diff --git a/panels/base_panel.py b/panels/base_panel.py
index 27d4b9cb..dc92d89c 100644
--- a/panels/base_panel.py
+++ b/panels/base_panel.py
@@ -211,9 +211,29 @@ class BasePanel(ScreenPanel):
self._screen._menu_go_back()
def process_update(self, action, data):
+ if action == "notify_update_response":
+ if self.update_dialog is None:
+ self.show_update_dialog()
+ with contextlib.suppress(KeyError):
+ self.labels['update_progress'].set_text(
+ f"{self.labels['update_progress'].get_text().strip()}\n"
+ f"{data['message']}\n")
+ with contextlib.suppress(KeyError):
+ if data['complete']:
+ logging.info("Update complete")
+ if self.update_dialog is not None:
+ try:
+ self.update_dialog.set_response_sensitive(Gtk.ResponseType.OK, True)
+ self.update_dialog.get_widget_for_response(Gtk.ResponseType.OK).show()
+ return
+ except AttributeError:
+ logging.error("error trying to show the updater button the dialog might be closed")
+ self._screen.updating = False
+ for dialog in self._screen.dialogs:
+ self._gtk.remove_dialog(dialog)
+
if action != "notify_status_update" or self._screen.printer is None:
return
-
devices = self._screen.printer.get_temp_store_devices()
if devices is not None:
for device in devices:
@@ -313,3 +333,37 @@ class BasePanel(ScreenPanel):
logging.info(f"Titlebar name type: {self.titlebar_name_type} items: {self.titlebar_items}")
else:
self.titlebar_items = []
+
+ def show_update_dialog(self):
+ if self.update_dialog is not None:
+ return
+ button = [{"name": _("Finish"), "response": Gtk.ResponseType.OK}]
+ self.labels['update_progress'] = Gtk.Label()
+ self.labels['update_progress'].set_halign(Gtk.Align.START)
+ self.labels['update_progress'].set_valign(Gtk.Align.START)
+ self.labels['update_progress'].set_ellipsize(Pango.EllipsizeMode.END)
+ self.labels['update_scroll'] = self._gtk.ScrolledWindow()
+ self.labels['update_scroll'].set_property("overlay-scrolling", True)
+ self.labels['update_scroll'].add(self.labels['update_progress'])
+ self.labels['update_scroll'].connect("size-allocate", self._autoscroll)
+ dialog = self._gtk.Dialog(self._screen, button, self.labels['update_scroll'], self.finish_updating)
+ dialog.connect("delete-event", self.close_update_dialog)
+ dialog.set_response_sensitive(Gtk.ResponseType.OK, False)
+ dialog.get_widget_for_response(Gtk.ResponseType.OK).hide()
+ self.update_dialog = dialog
+ self._screen.updating = True
+
+ def finish_updating(self, dialog, response_id):
+ if response_id != Gtk.ResponseType.OK:
+ return
+ logging.info("Finishing update")
+ self._screen.updating = False
+ self._gtk.remove_dialog(dialog)
+ self._screen._menu_go_home()
+
+ def close_update_dialog(self, *args):
+ logging.info("Closing update dialog")
+ if self.update_dialog in self._screen.dialogs:
+ self._screen.dialogs.remove(self.update_dialog)
+ self.update_dialog = None
+ self._screen._menu_go_home()
diff --git a/panels/system.py b/panels/system.py
index d680ff7c..f885a875 100644
--- a/panels/system.py
+++ b/panels/system.py
@@ -31,7 +31,6 @@ class SystemPanel(ScreenPanel):
def __init__(self, screen, title):
super().__init__(screen, title)
self.refresh = None
- self.update_status = None
self.update_dialog = None
grid = self._gtk.HomogeneousGrid()
grid.set_row_homogeneous(False)
@@ -56,9 +55,9 @@ class SystemPanel(ScreenPanel):
infogrid = Gtk.Grid()
infogrid.get_style_context().add_class("system-program-grid")
update_resp = self._screen.apiclient.send_request("machine/update/status")
- self.update_status = None
if not update_resp:
+ self.update_status = {}
logging.info("No update manager configured")
else:
self.update_status = update_resp['result']
@@ -98,11 +97,6 @@ class SystemPanel(ScreenPanel):
def activate(self):
self.get_updates()
- def finish_updating(self, dialog, response_id):
- self._screen.updating = False
- self._gtk.remove_dialog(dialog)
- self.get_updates()
-
def refresh_updates(self, widget=None):
self.refresh.set_sensitive(False)
self._screen.show_popup_message(_("Checking for updates, please wait..."), level=1)
@@ -111,6 +105,7 @@ class SystemPanel(ScreenPanel):
def get_updates(self, refresh="false"):
update_resp = self._screen.apiclient.send_request(f"machine/update/status?refresh={refresh}")
if not update_resp:
+ self.update_status = {}
logging.info("No update manager configured")
else:
self.update_status = update_resp['result']
@@ -121,16 +116,6 @@ class SystemPanel(ScreenPanel):
self.refresh.set_sensitive(True)
self._screen.close_popup_message()
- def process_update(self, action, data):
- if action == "notify_update_response" and 'application' in data:
- self.labels['update_progress'].set_text(
- f"{self.labels['update_progress'].get_text().strip()}\n"
- f"{data['message']}\n"
- )
- if data['complete']:
- self.update_dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, True)
- self.update_dialog.get_widget_for_response(Gtk.ResponseType.CANCEL).show()
-
def restart(self, widget, program):
if program not in ALLOWED_SERVICES:
return
@@ -139,13 +124,7 @@ class SystemPanel(ScreenPanel):
self._screen._ws.send_method("machine.services.restart", {"service": program})
def show_update_info(self, widget, program):
-
- if not self.update_status:
- return
- if program in self.update_status['version_info']:
- info = self.update_status['version_info'][program]
- else:
- info = {"full": True}
+ info = self.update_status['version_info'][program] if program in self.update_status['version_info'] else {}
scroll = self._gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
@@ -156,7 +135,10 @@ class SystemPanel(ScreenPanel):
label = Gtk.Label()
label.set_line_wrap(True)
- if 'configured_type' in info and info['configured_type'] == 'git_repo':
+ if program == "full":
+ label.set_markup('' + _("Perform a full upgrade?") + '')
+ vbox.add(label)
+ elif 'configured_type' in info and info['configured_type'] == 'git_repo':
if not info['is_valid'] or info['is_dirty']:
label.set_markup(_("Do you want to recover %s?") % program)
vbox.add(label)
@@ -217,9 +199,6 @@ class SystemPanel(ScreenPanel):
if pos == 2:
i += 1
vbox.add(grid)
- elif "full" in info:
- label.set_markup('' + _("Perform a full upgrade?") + '')
- vbox.add(label)
else:
label.set_markup(
"" + _("%s will be updated to version") % program.capitalize()
@@ -253,72 +232,26 @@ class SystemPanel(ScreenPanel):
def reset_repo(self, widget, program, hard):
if self._screen.updating:
return
-
- buttons = [
- {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL}
- ]
-
- scroll = self._gtk.ScrolledWindow()
- scroll.set_property("overlay-scrolling", True)
-
- self.labels['update_progress'] = Gtk.Label(_("Starting recovery for") + f' {program}...')
- self.labels['update_progress'].set_halign(Gtk.Align.START)
- self.labels['update_progress'].set_valign(Gtk.Align.START)
- self.labels['update_progress'].set_ellipsize(Pango.EllipsizeMode.END)
- self.labels['update_progress'].connect("size-allocate", self._autoscroll)
- scroll.add(self.labels['update_progress'])
- self.labels['update_scroll'] = scroll
-
- dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating)
- dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False)
- dialog.get_widget_for_response(Gtk.ResponseType.CANCEL).hide()
-
- self.update_dialog = dialog
-
- logging.info(f"Sending machine.update.recover name: {program}")
-
+ msg = _("Starting recovery for") + f' {program}...'
+ self._screen._websocket_callback("notify_update_response",
+ {'application': {program}, 'message': msg, 'complete': False})
+ logging.info(f"Sending machine.update.recover name: {program} hard: {hard}")
self._screen._ws.send_method("machine.update.recover", {"name": program, "hard": hard})
- self._screen.updating = True
def update_program(self, widget, program):
- if self._screen.updating:
- return
-
- if not self.update_status:
+ if self._screen.updating or not self.update_status:
return
if program in self.update_status['version_info']:
info = self.update_status['version_info'][program]
logging.info(f"program: {info}")
- else:
- info = {"full": True}
- logging.info("full upgrade")
+ if "package_count" in info and info['package_count'] == 0 \
+ or "version" in info and info['version'] == info['remote_version']:
+ return
- if "package_count" in info and info['package_count'] == 0 \
- or "version" in info and info['version'] == info['remote_version']:
- return
- buttons = [
- {"name": _("Finish"), "response": Gtk.ResponseType.CANCEL}
- ]
-
- scroll = self._gtk.ScrolledWindow()
- scroll.set_property("overlay-scrolling", True)
-
- if "full" in info:
- self.labels['update_progress'] = Gtk.Label(_("Updating") + '\n')
- else:
- self.labels['update_progress'] = Gtk.Label(_("Starting update for") + f' {program}...')
- self.labels['update_progress'].set_halign(Gtk.Align.START)
- self.labels['update_progress'].set_valign(Gtk.Align.START)
- self.labels['update_progress'].connect("size-allocate", self._autoscroll)
- scroll.add(self.labels['update_progress'])
- self.labels['update_scroll'] = scroll
-
- dialog = self._gtk.Dialog(self._screen, buttons, scroll, self.finish_updating)
- dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, False)
- dialog.get_widget_for_response(Gtk.ResponseType.CANCEL).hide()
-
- self.update_dialog = dialog
+ msg = _("Updating") if program == "full" else _("Starting update for") + f' {program}...'
+ self._screen._websocket_callback("notify_update_response",
+ {'application': {program}, 'message': msg, 'complete': False})
if program in ['klipper', 'moonraker', 'system', 'full']:
logging.info(f"Sending machine.update.{program}")
@@ -326,7 +259,6 @@ class SystemPanel(ScreenPanel):
else:
logging.info(f"Sending machine.update.client name: {program}")
self._screen._ws.send_method("machine.update.client", {"name": program})
- self._screen.updating = True
def update_program_info(self, p):
@@ -377,10 +309,6 @@ class SystemPanel(ScreenPanel):
self.labels[f"{p}_status"].get_style_context().add_class('update')
self.labels[f"{p}_status"].set_sensitive(True)
- def _autoscroll(self, *args):
- adj = self.labels['update_scroll'].get_vadjustment()
- adj.set_value(adj.get_upper() - adj.get_page_size())
-
def reboot_poweroff(self, widget, method):
scroll = self._gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)