Show the update dialog as modal
This commit is contained in:
parent
f8cde7bfe1
commit
cdb40e8ce1
@ -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?"),
|
||||
|
@ -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()
|
||||
|
102
panels/system.py
102
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('<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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user