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:
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?"),

View File

@ -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()

View File

@ -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('<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']:
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('<b>' + _("Perform a full upgrade?") + '</b>')
vbox.add(label)
else:
label.set_markup(
"<b>" + _("%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
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)