Show the update dialog as modal

This commit is contained in:
alfrix 2022-11-23 02:38:38 -03:00
parent f8cde7bfe1
commit cdb40e8ce1
3 changed files with 79 additions and 91 deletions

View File

@ -40,6 +40,12 @@ class ScreenPanel:
else: else:
self.bts = .5 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): def emergency_stop(self, widget):
if self._config.get_main_config().getboolean('confirm_estop', False): 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?"), self._screen._confirm_send_action(widget, _("Are you sure you want to run Emergency Stop?"),

View File

@ -211,9 +211,29 @@ class BasePanel(ScreenPanel):
self._screen._menu_go_back() self._screen._menu_go_back()
def process_update(self, action, data): 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: if action != "notify_status_update" or self._screen.printer is None:
return return
devices = self._screen.printer.get_temp_store_devices() devices = self._screen.printer.get_temp_store_devices()
if devices is not None: if devices is not None:
for device in devices: 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}") logging.info(f"Titlebar name type: {self.titlebar_name_type} items: {self.titlebar_items}")
else: else:
self.titlebar_items = [] 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()

View File

@ -31,7 +31,6 @@ class SystemPanel(ScreenPanel):
def __init__(self, screen, title): def __init__(self, screen, title):
super().__init__(screen, title) super().__init__(screen, title)
self.refresh = None self.refresh = None
self.update_status = None
self.update_dialog = None self.update_dialog = None
grid = self._gtk.HomogeneousGrid() grid = self._gtk.HomogeneousGrid()
grid.set_row_homogeneous(False) grid.set_row_homogeneous(False)
@ -56,9 +55,9 @@ class SystemPanel(ScreenPanel):
infogrid = Gtk.Grid() infogrid = Gtk.Grid()
infogrid.get_style_context().add_class("system-program-grid") infogrid.get_style_context().add_class("system-program-grid")
update_resp = self._screen.apiclient.send_request("machine/update/status") update_resp = self._screen.apiclient.send_request("machine/update/status")
self.update_status = None
if not update_resp: if not update_resp:
self.update_status = {}
logging.info("No update manager configured") logging.info("No update manager configured")
else: else:
self.update_status = update_resp['result'] self.update_status = update_resp['result']
@ -98,11 +97,6 @@ class SystemPanel(ScreenPanel):
def activate(self): def activate(self):
self.get_updates() 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): def refresh_updates(self, widget=None):
self.refresh.set_sensitive(False) self.refresh.set_sensitive(False)
self._screen.show_popup_message(_("Checking for updates, please wait..."), level=1) 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"): def get_updates(self, refresh="false"):
update_resp = self._screen.apiclient.send_request(f"machine/update/status?refresh={refresh}") update_resp = self._screen.apiclient.send_request(f"machine/update/status?refresh={refresh}")
if not update_resp: if not update_resp:
self.update_status = {}
logging.info("No update manager configured") logging.info("No update manager configured")
else: else:
self.update_status = update_resp['result'] self.update_status = update_resp['result']
@ -121,16 +116,6 @@ class SystemPanel(ScreenPanel):
self.refresh.set_sensitive(True) self.refresh.set_sensitive(True)
self._screen.close_popup_message() 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): def restart(self, widget, program):
if program not in ALLOWED_SERVICES: if program not in ALLOWED_SERVICES:
return return
@ -139,13 +124,7 @@ class SystemPanel(ScreenPanel):
self._screen._ws.send_method("machine.services.restart", {"service": program}) self._screen._ws.send_method("machine.services.restart", {"service": program})
def show_update_info(self, widget, program): def show_update_info(self, widget, program):
info = self.update_status['version_info'][program] if program in self.update_status['version_info'] else {}
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}
scroll = self._gtk.ScrolledWindow() scroll = self._gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
@ -156,7 +135,10 @@ class SystemPanel(ScreenPanel):
label = Gtk.Label() label = Gtk.Label()
label.set_line_wrap(True) label.set_line_wrap(True)
if 'configured_type' in info and info['configured_type'] == 'git_repo': if program == "full":
label.set_markup('<b>' + _("Perform a full upgrade?") + '</b>')
vbox.add(label)
elif 'configured_type' in info and info['configured_type'] == 'git_repo':
if not info['is_valid'] or info['is_dirty']: if not info['is_valid'] or info['is_dirty']:
label.set_markup(_("Do you want to recover %s?") % program) label.set_markup(_("Do you want to recover %s?") % program)
vbox.add(label) vbox.add(label)
@ -217,9 +199,6 @@ class SystemPanel(ScreenPanel):
if pos == 2: if pos == 2:
i += 1 i += 1
vbox.add(grid) vbox.add(grid)
elif "full" in info:
label.set_markup('<b>' + _("Perform a full upgrade?") + '</b>')
vbox.add(label)
else: else:
label.set_markup( label.set_markup(
"<b>" + _("%s will be updated to version") % program.capitalize() "<b>" + _("%s will be updated to version") % program.capitalize()
@ -253,72 +232,26 @@ class SystemPanel(ScreenPanel):
def reset_repo(self, widget, program, hard): def reset_repo(self, widget, program, hard):
if self._screen.updating: if self._screen.updating:
return return
msg = _("Starting recovery for") + f' {program}...'
buttons = [ self._screen._websocket_callback("notify_update_response",
{"name": _("Finish"), "response": Gtk.ResponseType.CANCEL} {'application': {program}, 'message': msg, 'complete': False})
] logging.info(f"Sending machine.update.recover name: {program} hard: {hard}")
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}")
self._screen._ws.send_method("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): def update_program(self, widget, program):
if self._screen.updating: if self._screen.updating or not self.update_status:
return
if not self.update_status:
return return
if program in self.update_status['version_info']: if program in self.update_status['version_info']:
info = self.update_status['version_info'][program] info = self.update_status['version_info'][program]
logging.info(f"program: {info}") logging.info(f"program: {info}")
else:
info = {"full": True}
logging.info("full upgrade")
if "package_count" in info and info['package_count'] == 0 \ if "package_count" in info and info['package_count'] == 0 \
or "version" in info and info['version'] == info['remote_version']: or "version" in info and info['version'] == info['remote_version']:
return return
buttons = [
{"name": _("Finish"), "response": Gtk.ResponseType.CANCEL}
]
scroll = self._gtk.ScrolledWindow() msg = _("Updating") if program == "full" else _("Starting update for") + f' {program}...'
scroll.set_property("overlay-scrolling", True) self._screen._websocket_callback("notify_update_response",
{'application': {program}, 'message': msg, 'complete': False})
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
if program in ['klipper', 'moonraker', 'system', 'full']: if program in ['klipper', 'moonraker', 'system', 'full']:
logging.info(f"Sending machine.update.{program}") logging.info(f"Sending machine.update.{program}")
@ -326,7 +259,6 @@ class SystemPanel(ScreenPanel):
else: else:
logging.info(f"Sending machine.update.client name: {program}") logging.info(f"Sending machine.update.client name: {program}")
self._screen._ws.send_method("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): 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"].get_style_context().add_class('update')
self.labels[f"{p}_status"].set_sensitive(True) 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): def reboot_poweroff(self, widget, method):
scroll = self._gtk.ScrolledWindow() scroll = self._gtk.ScrolledWindow()
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)