diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index cf088226..e979108c 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -60,11 +60,11 @@ class ScreenPanel: return self._gtk.PixbufFromHttp(loc[1], width, height) return None - def menu_item_clicked(self, widget, panel_type, item): + def menu_item_clicked(self, widget, item): if 'extra' in item: - self._screen.show_panel(panel_type, item['panel'], item['name'], 1, False, extra=item['extra']) + self._screen.show_panel(item['panel'], item['name'], 1, False, extra=item['extra']) return - self._screen.show_panel(panel_type, item['panel'], item['name'], 1, False) + self._screen.show_panel(item['panel'], item['name'], 1, False) def load_menu(self, widget, name, title=None): logging.info(f"loading menu {name}") diff --git a/panels/base_panel.py b/panels/base_panel.py index d275b386..720c2724 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -38,7 +38,7 @@ class BasePanel(ScreenPanel): self.control['printer_select'].connect("clicked", self._screen.show_printer_select) self.control['macros_shortcut'] = self._gtk.Button('custom-script', scale=abscale) - self.control['macros_shortcut'].connect("clicked", self.menu_item_clicked, "gcode_macros", { + self.control['macros_shortcut'].connect("clicked", self.menu_item_clicked, { "name": "Macros", "panel": "gcode_macros" }) diff --git a/panels/bed_level.py b/panels/bed_level.py index 4a4ad6b7..f712015a 100644 --- a/panels/bed_level.py +++ b/panels/bed_level.py @@ -1,20 +1,14 @@ import logging import re import math - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return BedLevelPanel(*args) - - # Find the screw closest to the point, # but return None if the distance is above max_distance. # If remove is set to true, the screw is also removed @@ -38,7 +32,7 @@ def find_closest(screws, point, max_distance, remove=False): return closest -class BedLevelPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/bed_mesh.py b/panels/bed_mesh.py index e452a835..219adc3f 100644 --- a/panels/bed_mesh.py +++ b/panels/bed_mesh.py @@ -8,11 +8,7 @@ from ks_includes.screen_panel import ScreenPanel from ks_includes.widgets.bedmap import BedMap -def create_panel(*args): - return BedMeshPanel(*args) - - -class BedMeshPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) @@ -273,7 +269,7 @@ class BedMeshPanel(ScreenPanel): # Load zcalibrate to do a manual mesh if not self._printer.get_probe(): - self.menu_item_clicked(widget, "refresh", {"name": _("Mesh calibrate"), "panel": "zcalibrate"}) + self.menu_item_clicked(widget, {"name": _("Mesh calibrate"), "panel": "zcalibrate"}) def send_clear_mesh(self, widget): self._screen._ws.klippy.gcode_script("BED_MESH_CLEAR") diff --git a/panels/camera.py b/panels/camera.py index 259d020f..843b7f4a 100644 --- a/panels/camera.py +++ b/panels/camera.py @@ -8,11 +8,7 @@ from contextlib import suppress from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return CameraPanel(*args) - - -class CameraPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.mpv = None diff --git a/panels/console.py b/panels/console.py index 91ad53c5..3618a055 100644 --- a/panels/console.py +++ b/panels/console.py @@ -1,19 +1,13 @@ import time import re - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk - from datetime import datetime from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return ConsolePanel(*args) - - COLORS = { "command": "#bad8ff", "error": "#ff6975", @@ -23,7 +17,7 @@ COLORS = { } -class ConsolePanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.autoscroll = True diff --git a/panels/example.py b/panels/example.py index 486c2a7f..5a2bb98d 100644 --- a/panels/example.py +++ b/panels/example.py @@ -2,15 +2,10 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return ExamplePanel(*args) - - -class ExamplePanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/exclude.py b/panels/exclude.py index ac6e6eb8..5b6aa6fc 100644 --- a/panels/exclude.py +++ b/panels/exclude.py @@ -3,16 +3,11 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.screen_panel import ScreenPanel from ks_includes.widgets.objectmap import ObjectMap -def create_panel(*args): - return ExcludeObjectPanel(*args) - - -class ExcludeObjectPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self._screen = screen diff --git a/panels/extrude.py b/panels/extrude.py index 867658be..79a8bf5e 100644 --- a/panels/extrude.py +++ b/panels/extrude.py @@ -1,20 +1,14 @@ import logging import re - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return ExtrudePanel(*args) - - -class ExtrudePanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) @@ -50,7 +44,7 @@ class ExtrudePanel(ScreenPanel): self.buttons['load'].connect("clicked", self.load_unload, "+") self.buttons['unload'].connect("clicked", self.load_unload, "-") self.buttons['retract'].connect("clicked", self.extrude, "-") - self.buttons['temperature'].connect("clicked", self.menu_item_clicked, "temperature", { + self.buttons['temperature'].connect("clicked", self.menu_item_clicked, { "name": "Temperature", "panel": "temperature" }) diff --git a/panels/fan.py b/panels/fan.py index 7dc74a89..9768499f 100644 --- a/panels/fan.py +++ b/panels/fan.py @@ -1,22 +1,16 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return FanPanel(*args) - - CHANGEABLE_FANS = ["fan", "fan_generic"] -class FanPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.fan_speed = {} diff --git a/panels/fine_tune.py b/panels/fine_tune.py index 148d5576..0f9cd09f 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -4,16 +4,11 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return FineTunePanel(*args) - - -class FineTunePanel(ScreenPanel): +class Panel(ScreenPanel): z_deltas = ["0.01", "0.05"] z_delta = z_deltas[-1] speed_deltas = ['5', '25'] diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py index 17b79218..fb2f7846 100644 --- a/panels/gcode_macros.py +++ b/panels/gcode_macros.py @@ -4,15 +4,10 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return MacroPanel(*args) - - -class MacroPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.sort_reverse = False diff --git a/panels/input_shaper.py b/panels/input_shaper.py index 5046348a..5efb6b69 100644 --- a/panels/input_shaper.py +++ b/panels/input_shaper.py @@ -1,18 +1,12 @@ import re - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return InputShaperPanel(*args) - - # X and Y frequencies XY_FREQ = [ {'name': 'X', 'config': 'shaper_freq_x', 'min': 0, 'max': 133}, @@ -21,7 +15,7 @@ XY_FREQ = [ SHAPERS = ['zv', 'mzv', 'zvd', 'ei', '2hump_ei', '3hump_ei'] -class InputShaperPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.freq_xy_adj = {} diff --git a/panels/job_status.py b/panels/job_status.py index 1e97b160..941e87b5 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -12,11 +12,7 @@ from time import time from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return JobStatusPanel(*args) - - -class JobStatusPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.grid = self._gtk.HomogeneousGrid() @@ -152,7 +148,7 @@ class JobStatusPanel(ScreenPanel): } for button in buttons: buttons[button].set_halign(Gtk.Align.START) - buttons['fan'].connect("clicked", self.menu_item_clicked, "fan", {"panel": "fan", "name": _("Fan")}) + buttons['fan'].connect("clicked", self.menu_item_clicked, {"panel": "fan", "name": _("Fan")}) self.buttons.update(buttons) self.labels['temp_grid'] = Gtk.Grid() @@ -166,7 +162,7 @@ class JobStatusPanel(ScreenPanel): self.buttons['extruder'][extruder] = self._gtk.Button(f"extruder-{i}", "", None, self.bts, Gtk.PositionType.LEFT, 1) self.buttons['extruder'][extruder].set_label(self.labels[extruder].get_text()) - self.buttons['extruder'][extruder].connect("clicked", self.menu_item_clicked, "temperature", + self.buttons['extruder'][extruder].connect("clicked", self.menu_item_clicked, {"panel": "temperature", "name": _("Temperature"), 'extra': self.current_extruder}) self.buttons['extruder'][extruder].set_halign(Gtk.Align.START) @@ -179,7 +175,7 @@ class JobStatusPanel(ScreenPanel): self.buttons['heater']['heater_bed'] = self._gtk.Button("bed", "", None, self.bts, Gtk.PositionType.LEFT, 1) self.labels['heater_bed'] = Gtk.Label(label="-") self.buttons['heater']['heater_bed'].set_label(self.labels['heater_bed'].get_text()) - self.buttons['heater']['heater_bed'].connect("clicked", self.menu_item_clicked, "temperature", + self.buttons['heater']['heater_bed'].connect("clicked", self.menu_item_clicked, {"panel": "temperature", "name": _("Temperature"), 'extra': 'heater_bed'}) self.buttons['heater']['heater_bed'].set_halign(Gtk.Align.START) @@ -192,7 +188,7 @@ class JobStatusPanel(ScreenPanel): self.buttons['heater'][dev] = self._gtk.Button("heater", "", None, self.bts, Gtk.PositionType.LEFT, 1) self.labels[dev] = Gtk.Label(label="-") self.buttons['heater'][dev].set_label(self.labels[dev].get_text()) - self.buttons['heater'][dev].connect("clicked", self.menu_item_clicked, "temperature", + self.buttons['heater'][dev].connect("clicked", self.menu_item_clicked, {"panel": "temperature", "name": _("Temperature"), "extra": dev}) self.buttons['heater'][dev].set_halign(Gtk.Align.START) self.labels['temp_grid'].attach(self.buttons['heater'][dev], n, 0, 1, 1) @@ -217,7 +213,7 @@ class JobStatusPanel(ScreenPanel): Gtk.PositionType.LEFT, 1) self.labels[device] = Gtk.Label(label="-") self.buttons['heater'][device].set_label(self.labels[device].get_text()) - self.buttons['heater'][device].connect("clicked", self.menu_item_clicked, "temperature", + self.buttons['heater'][device].connect("clicked", self.menu_item_clicked, {"panel": "temperature", "name": _("Temperature")}) self.buttons['heater'][device].set_halign(Gtk.Align.START) @@ -375,7 +371,7 @@ class JobStatusPanel(ScreenPanel): } self.buttons['cancel'].connect("clicked", self.cancel) self.buttons['control'].connect("clicked", self._screen._go_to_submenu, "") - self.buttons['fine_tune'].connect("clicked", self.menu_item_clicked, "fine_tune", { + self.buttons['fine_tune'].connect("clicked", self.menu_item_clicked, { "panel": "fine_tune", "name": _("Fine Tuning")}) self.buttons['menu'].connect("clicked", self.close_panel) self.buttons['pause'].connect("clicked", self.pause) @@ -463,7 +459,7 @@ class JobStatusPanel(ScreenPanel): def cancel_confirm(self, dialog, response_id): self._gtk.remove_dialog(dialog) if response_id == Gtk.ResponseType.APPLY: - self.menu_item_clicked(None, "exclude", {"panel": "exclude", "name": _("Exclude Object")}) + self.menu_item_clicked(None, {"panel": "exclude", "name": _("Exclude Object")}) return if response_id == Gtk.ResponseType.CANCEL: self.enable_button("pause", "cancel") diff --git a/panels/limits.py b/panels/limits.py index 1d180c90..2c81c5b8 100644 --- a/panels/limits.py +++ b/panels/limits.py @@ -1,18 +1,12 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return LimitsPanel(*args) - - -class LimitsPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/main_menu.py b/panels/main_menu.py index c5298152..689b3263 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -1,20 +1,14 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib -from panels.menu import MenuPanel - +from panels.menu import Panel as MenuPanel from ks_includes.widgets.heatergraph import HeaterGraph from ks_includes.widgets.keypad import Keypad -def create_panel(*args, **kwargs): - return MainPanel(*args, **kwargs) - - -class MainPanel(MenuPanel): +class Panel(MenuPanel): def __init__(self, screen, title, items=None): super().__init__(screen, title, items) self.graph_retry_timeout = None diff --git a/panels/menu.py b/panels/menu.py index dfa7c0e1..9ff14f5c 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -1,21 +1,14 @@ import logging - -import gi - import json +import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from jinja2 import Template - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args, **kwargs): - return MenuPanel(*args, **kwargs) - - -class MenuPanel(ScreenPanel): +class Panel(ScreenPanel): j2_data = None def __init__(self, screen, title, items=None): @@ -86,7 +79,7 @@ class MenuPanel(ScreenPanel): if item['panel'] is not None: panel = self._screen.env.from_string(item['panel']).render(printer) - b.connect("clicked", self.menu_item_clicked, panel, item) + b.connect("clicked", self.menu_item_clicked, item) elif item['method'] is not None: params = {} diff --git a/panels/move.py b/panels/move.py index aa725df1..c24c9bdd 100644 --- a/panels/move.py +++ b/panels/move.py @@ -1,19 +1,13 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return MovePanel(*args) - - -class MovePanel(ScreenPanel): +class Panel(ScreenPanel): distances = ['.1', '.5', '1', '5', '10', '25', '50'] distance = distances[-2] @@ -261,4 +255,4 @@ class MovePanel(ScreenPanel): name = "homing" disname = self._screen._config.get_menu_name("move", name) menuitems = self._screen._config.get_menu_items("move", name) - self._screen.show_panel(name, "menu", disname, 1, False, items=menuitems) + self._screen.show_panel("menu", disname, 1, False, items=menuitems) diff --git a/panels/network.py b/panels/network.py index 45d7a343..109aa675 100644 --- a/panels/network.py +++ b/panels/network.py @@ -1,6 +1,5 @@ import logging import os - import gi import netifaces @@ -9,11 +8,7 @@ from gi.repository import Gtk, Gdk, GLib, Pango from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return NetworkPanel(*args) - - -class NetworkPanel(ScreenPanel): +class Panel(ScreenPanel): initialized = False def __init__(self, screen, title): diff --git a/panels/pins.py b/panels/pins.py index db12f0d5..35aa7cc6 100644 --- a/panels/pins.py +++ b/panels/pins.py @@ -1,18 +1,12 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return OutputPinPanel(*args) - - -class OutputPinPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/power.py b/panels/power.py index f817337b..feeb8b36 100644 --- a/panels/power.py +++ b/panels/power.py @@ -1,18 +1,12 @@ import logging - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return PowerPanel(*args) - - -class PowerPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.devices = {} diff --git a/panels/print.py b/panels/print.py index f752d65f..aa3d5814 100644 --- a/panels/print.py +++ b/panels/print.py @@ -1,21 +1,15 @@ # -*- coding: utf-8 -*- import logging import os - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango from datetime import datetime - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return PrintPanel(*args) - - -class PrintPanel(ScreenPanel): +class Panel(ScreenPanel): cur_directory = "gcodes" dir_panels = {} filelist = {'gcodes': {'directories': [], 'files': []}} diff --git a/panels/printer_select.py b/panels/printer_select.py index 866a976c..25647c34 100644 --- a/panels/printer_select.py +++ b/panels/printer_select.py @@ -5,11 +5,7 @@ from gi.repository import Gtk, GLib from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return PrinterSelect(*args) - - -class PrinterSelect(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) printers = self._config.get_printers() diff --git a/panels/retraction.py b/panels/retraction.py index 21084dd1..c0259102 100644 --- a/panels/retraction.py +++ b/panels/retraction.py @@ -1,19 +1,13 @@ import logging import re - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return FWRetractionPanel(*args) - - -class FWRetractionPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/settings.py b/panels/settings.py index 255a4ac8..c9f4107a 100644 --- a/panels/settings.py +++ b/panels/settings.py @@ -2,15 +2,10 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return SettingsPanel(*args) - - -class SettingsPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.printers = self.settings = self.langs = {} diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 2faa4a86..32016a24 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -1,19 +1,13 @@ 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 -def create_panel(*args): - return SplashScreenPanel(*args) - - -class SplashScreenPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) diff --git a/panels/system.py b/panels/system.py index fe23f03f..34904f0e 100644 --- a/panels/system.py +++ b/panels/system.py @@ -1,18 +1,12 @@ import logging import os - import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango, GLib - from ks_includes.screen_panel import ScreenPanel -def create_panel(*args): - return SystemPanel(*args) - - # Same as ALLOWED_SERVICES in moonraker # https://github.com/Arksine/moonraker/blob/master/moonraker/components/machine.py ALLOWED_SERVICES = ( @@ -27,7 +21,7 @@ ALLOWED_SERVICES = ( ) -class SystemPanel(ScreenPanel): +class Panel(ScreenPanel): def __init__(self, screen, title): super().__init__(screen, title) self.refresh = None diff --git a/panels/temperature.py b/panels/temperature.py index 506821a8..accef86a 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -9,11 +9,7 @@ from ks_includes.widgets.heatergraph import HeaterGraph from ks_includes.widgets.keypad import Keypad -def create_panel(*args, **kwargs): - return TemperaturePanel(*args, **kwargs) - - -class TemperaturePanel(ScreenPanel): +class Panel(ScreenPanel): graph_update = None active_heater = None diff --git a/panels/zcalibrate.py b/panels/zcalibrate.py index d5cf1f77..9adca227 100644 --- a/panels/zcalibrate.py +++ b/panels/zcalibrate.py @@ -1,19 +1,13 @@ +import logging import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk - from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel -import logging - -def create_panel(*args): - return ZCalibratePanel(*args) - - -class ZCalibratePanel(ScreenPanel): +class Panel(ScreenPanel): widgets = {} distances = ['.01', '.05', '.1', '.5', '1', '5'] distance = distances[-2] diff --git a/screen.py b/screen.py index 12451ed4..0174184f 100755 --- a/screen.py +++ b/screen.py @@ -80,7 +80,6 @@ class KlipperScreen(Gtk.Window): connected_printer = None files = None keyboard = None - load_panel = {} panels = {} popup_message = None screensaver = None @@ -105,7 +104,6 @@ class KlipperScreen(Gtk.Window): self.version = version self.dialogs = [] self.confirm = None - self.panels_reinit = [] configfile = os.path.normpath(os.path.expanduser(args.configfile)) @@ -258,52 +256,31 @@ class KlipperScreen(Gtk.Window): self._ws.klippy.object_subscription(requested_updates) - def _load_panel(self, panel, *args, **kwargs): - if panel not in self.load_panel: - logging.debug(f"Loading panel: {panel}") - panel_path = os.path.join(os.path.dirname(__file__), 'panels', f"{panel}.py") - logging.info(f"Panel path: {panel_path}") - if not os.path.exists(panel_path): - logging.error(f"Panel {panel} does not exist") - raise FileNotFoundError(os.strerror(2), "\n" + panel_path) + @staticmethod + def _load_panel(panel): + logging.debug(f"Loading panel: {panel}") + panel_path = os.path.join(os.path.dirname(__file__), 'panels', f"{panel}.py") + if not os.path.exists(panel_path): + logging.error(f"Panel {panel} does not exist") + raise FileNotFoundError(os.strerror(2), "\n" + panel_path) + return import_module(f"panels.{panel}") - module = import_module(f"panels.{panel}") - if not hasattr(module, "create_panel"): - raise ImportError(f"Cannot locate create_panel function for {panel}") - self.load_panel[panel] = getattr(module, "create_panel") - - try: - return self.load_panel[panel](*args, **kwargs) - except Exception as e: - logging.exception(e) - raise RuntimeError(f"Unable to create panel: {panel}\n{e}") from e - - def show_panel(self, panel_name, panel_type, title, remove=None, pop=True, **kwargs): + def show_panel(self, panel, title, remove=None, pop=True, **kwargs): try: if remove == 2: self._remove_all_panels() - self.panels_reinit = list(self.panels) elif remove == 1: self._remove_current_panel(pop) - if panel_name not in self.panels: + if panel not in self.panels: try: - self.panels[panel_name] = self._load_panel(panel_type, self, title, **kwargs) + self.panels[panel] = self._load_panel(panel).Panel(self, title, **kwargs) except Exception as e: - - if panel_name in self.panels: - del self.panels[panel_name] - self.show_error_modal(f"Unable to load panel {panel_type}", f"{e}") + self.show_error_modal(f"Unable to load panel {panel}", f"{e}") return - elif 'extra' in kwargs: - logging.info(f"extra: {kwargs['extra']}") - self.panels[panel_name].__init__(self, title, **kwargs) - - self._cur_panels.append(panel_name) - if panel_name in self.panels_reinit: - logging.info("Reinitializing panel") - self.panels[panel_name].__init__(self, title, **kwargs) - self.panels_reinit.remove(panel_name) - self.attach_panel(panel_name) + else: + self.panels[panel].__init__(self, title, **kwargs) + self._cur_panels.append(panel) + self.attach_panel(panel) except Exception as e: logging.exception(f"Error attaching panel:\n{e}") @@ -471,7 +448,7 @@ class KlipperScreen(Gtk.Window): def _go_to_submenu(self, widget, name): logging.info(f"#### Go to submenu {name}") # Find current menu item - if "main_panel" in self._cur_panels: + if "main_menu" in self._cur_panels: menu = "__main" elif "splash_screen" in self._cur_panels: menu = "__splashscreen" @@ -482,7 +459,7 @@ class KlipperScreen(Gtk.Window): disname = self._config.get_menu_name(menu, name) menuitems = self._config.get_menu_items(menu, name) if len(menuitems) != 0: - self.show_panel(name, "menu", disname, 1, False, items=menuitems) + self.show_panel("menu", disname, 1, False, items=menuitems) else: logging.info("No items in menu") @@ -632,7 +609,7 @@ class KlipperScreen(Gtk.Window): def show_printer_select(self, widget=None): self.base_panel.show_heaters(False) - self.show_panel("printer_select", "printer_select", _("Printer Select"), 2) + self.show_panel("printer_select", _("Printer Select"), 2) def process_busy_state(self, busy): self.process_update("notify_busy", busy) @@ -670,13 +647,13 @@ class KlipperScreen(Gtk.Window): self.base_panel_show_all() for dialog in self.dialogs: self.gtk.remove_dialog(dialog) - self.show_panel('job_status', "job_status", _("Printing"), 2) + self.show_panel("job_status", _("Printing"), 2) def state_ready(self, wait=True): # Do not return to main menu if completing a job, timeouts/user input will return if "job_status" in self._cur_panels and wait: return - self.show_panel('main_panel', "main_menu", None, 2, items=self._config.get_menu_items("__main")) + self.show_panel("main_menu", None, 2, items=self._config.get_menu_items("__main")) self.base_panel_show_all() def state_startup(self): @@ -720,8 +697,8 @@ class KlipperScreen(Gtk.Window): self.printer.process_update({'webhooks': {'state': "ready"}}) elif action == "notify_status_update" and self.printer.state != "shutdown": self.printer.process_update(data) - if 'manual_probe' in data and data['manual_probe']['is_active'] and 'zoffset' not in self._cur_panels: - self.show_panel('zoffset', "zcalibrate", None, 1, False) + if 'manual_probe' in data and data['manual_probe']['is_active'] and 'zcalibrate' not in self._cur_panels: + self.show_panel("zcalibrate", None, 1, False) elif action == "notify_filelist_changed": if self.files is not None: self.files.process_update(data) @@ -800,7 +777,7 @@ class KlipperScreen(Gtk.Window): def printer_initializing(self, msg, remove=False): if 'splash_screen' not in self.panels or remove: - self.show_panel('splash_screen', "splash_screen", None, 2) + self.show_panel("splash_screen", None, 2) self.panels['splash_screen'].update_text(msg) def search_power_devices(self, devices):