import logging import os import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango from ks_includes.screen_panel import ScreenPanel class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) image = self._gtk.Image("klipper", self._gtk.content_width * .2, self._gtk.content_height * .5) self.labels['text'] = Gtk.Label( label=_("Initializing printer..."), wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) self.labels['menu'] = self._gtk.Button("settings", _("Menu"), "color4") self.labels['menu'].connect("clicked", self._screen._go_to_submenu, "") self.labels['restart'] = self._gtk.Button("refresh", _("Klipper Restart"), "color1") self.labels['restart'].connect("clicked", self.restart_klipper) self.labels['firmware_restart'] = self._gtk.Button("refresh", _("Firmware Restart"), "color2") self.labels['firmware_restart'].connect("clicked", self.firmware_restart) self.labels['restart_system'] = self._gtk.Button("refresh", _("System Restart"), "color1") self.labels['restart_system'].connect("clicked", self.reboot_poweroff, 'reboot') self.labels['shutdown'] = self._gtk.Button("shutdown", _('System Shutdown'), "color2") self.labels['shutdown'].connect("clicked", self.reboot_poweroff, 'shutdown') self.labels['retry'] = self._gtk.Button("load", _('Retry'), "color3") self.labels['retry'].connect("clicked", self.retry) self.labels['actions'] = Gtk.Box(hexpand=True, vexpand=False, homogeneous=True) scroll = self._gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) scroll.add(self.labels['text']) info = Gtk.Box() info.pack_start(image, False, True, 8) info.pack_end(scroll, True, True, 8) main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) main.pack_start(info, True, True, 8) main.pack_end(self.labels['actions'], False, False, 0) self.show_restart_buttons() self.content.add(main) def update_text(self, text): self.labels['text'].set_label(f"{text}") self.show_restart_buttons() def clear_action_bar(self): for child in self.labels['actions'].get_children(): self.labels['actions'].remove(child) def show_restart_buttons(self): self.clear_action_bar() if self.ks_printer_cfg is not None and self._screen._ws.connected: power_devices = self.ks_printer_cfg.get("power_devices", "") if power_devices and self._printer.get_power_devices(): logging.info(f"Associated power devices: {power_devices}") self.add_power_button(power_devices) if self._screen.initialized: self.labels['actions'].add(self.labels['restart']) self.labels['actions'].add(self.labels['firmware_restart']) else: self.labels['actions'].add(self.labels['restart_system']) self.labels['actions'].add(self.labels['shutdown']) self.labels['actions'].add(self.labels['menu']) if self._screen._ws and not self._screen._ws.connecting or self._screen.reinit_count > self._screen.max_retries: self.labels['actions'].add(self.labels['retry']) self.labels['actions'].show_all() def add_power_button(self, powerdevs): self.labels['power'] = self._gtk.Button("shutdown", _("Power On Printer"), "color3") self.labels['power'].connect("clicked", self._screen.power_devices, powerdevs, True) self.check_power_status() self.labels['actions'].add(self.labels['power']) def activate(self): self.check_power_status() def check_power_status(self): if 'power' in self.labels: devices = self._printer.get_power_devices() if devices is not None: for device in devices: if self._printer.get_power_device_status(device) == "off": self.labels['power'].set_sensitive(True) break elif self._printer.get_power_device_status(device) == "on": self.labels['power'].set_sensitive(False) def firmware_restart(self, widget): self._screen._ws.klippy.restart_firmware() def restart_klipper(self, widget): self._screen._ws.klippy.restart() def retry(self, widget): if self._screen._ws and not self._screen._ws.connecting: self._screen._ws.retry() self._screen.reinit_count = 0 self._screen._init_printer(_("Connecting to %s") % self._screen.connecting_to_printer) self.show_restart_buttons() def reboot_poweroff(self, widget, method): label = Gtk.Label(wrap=True, hexpand=True, vexpand=True) if method == "reboot": label.set_label(_("Are you sure you wish to reboot the system?")) title = _("Restart") else: label.set_label(_("Are you sure you wish to shutdown the system?")) title = _("Shutdown") buttons = [ {"name": _("Host"), "response": Gtk.ResponseType.OK, "style": 'dialog-info'}, {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": 'dialog-error'} ] if self._screen._ws.connected: buttons.insert(1, {"name": _("Printer"), "response": Gtk.ResponseType.APPLY, "style": 'dialog-warning'}) self._gtk.Dialog(title, buttons, label, self.reboot_poweroff_confirm, method) def reboot_poweroff_confirm(self, dialog, response_id, method): self._gtk.remove_dialog(dialog) if response_id == Gtk.ResponseType.OK: if method == "reboot": os.system("systemctl reboot -i") else: os.system("systemctl poweroff -i") elif response_id == Gtk.ResponseType.APPLY: if method == "reboot": self._screen._ws.send_method("machine.reboot") else: self._screen._ws.send_method("machine.shutdown")