diff --git a/ks_includes/KlipperScreen.conf b/ks_includes/KlipperScreen.conf index 1f268aa4..57637ff0 100644 --- a/ks_includes/KlipperScreen.conf +++ b/ks_includes/KlipperScreen.conf @@ -124,7 +124,7 @@ panel: temperature [menu __print tuning] name: Fine Tuning icon: fan -panel: finetune +panel: fine_tune [menu __print network] name: Network diff --git a/panels/bed_level.py b/panels/bed_level.py index 2922afce..7a522e3b 100644 --- a/panels/bed_level.py +++ b/panels/bed_level.py @@ -111,3 +111,6 @@ class BedLevelPanel(ScreenPanel): self._screen._ws.klippy.gcode_script( "M18" # Disable motors ) + +def create_panel(*args): + return BedLevelPanel(*args) diff --git a/panels/example.py b/panels/example.py index 084575c1..afe4a290 100644 --- a/panels/example.py +++ b/panels/example.py @@ -7,6 +7,9 @@ from ks_includes.KlippyGtk import KlippyGtk from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel +def create_panel(*args): + return ExamplePanel(*args) + class ExamplePanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext diff --git a/panels/extrude.py b/panels/extrude.py index b6a6ebec..e1ba3cdc 100644 --- a/panels/extrude.py +++ b/panels/extrude.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.ExtrudePanel") +def create_panel(*args): + return ExtrudePanel(*args) + class ExtrudePanel(ScreenPanel): distance = 1 distances = ['1','5','10','25'] diff --git a/panels/fan.py b/panels/fan.py index 3d2f7ebd..59f11807 100644 --- a/panels/fan.py +++ b/panels/fan.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.FanPanel") +def create_panel(*args): + return FanPanel(*args) + class FanPanel(ScreenPanel): user_selecting = False diff --git a/panels/fine_tune.py b/panels/fine_tune.py index 954d9f8e..a4aaee58 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -10,7 +10,10 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.FineTunePanel") -class FineTune(ScreenPanel): +def create_panel(*args): + return FineTunePanel(*args) + +class FineTunePanel(ScreenPanel): user_selecting = False bs = 0 diff --git a/panels/job_status.py b/panels/job_status.py index 86937740..2069bd02 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.JobStatusPanel") +def create_panel(*args): + return JobStatusPanel(*args) + class JobStatusPanel(ScreenPanel): is_paused = False filename = None diff --git a/panels/main_menu.py b/panels/main_menu.py index 8065a7ca..3386a2eb 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -9,6 +9,9 @@ from panels.menu import MenuPanel logger = logging.getLogger("KlipperScreen.MainMenu") +def create_panel(*args): + return MainPanel(*args) + class MainPanel(MenuPanel): def initialize(self, panel_name, items, extrudercount): diff --git a/panels/menu.py b/panels/menu.py index f6c7a068..cf625199 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.MenuPanel") +def create_panel(*args): + return MenuPanel(*args) + class MenuPanel(ScreenPanel): def initialize(self, panel_name, items): _ = self.lang.gettext diff --git a/panels/move.py b/panels/move.py index 02ef61e1..d8bb9b58 100644 --- a/panels/move.py +++ b/panels/move.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.MovePanel") +def create_panel(*args): + return MovePanel(*args) + class MovePanel(ScreenPanel): distance = 1 distances = ['.1','.5','1','5','10','25'] diff --git a/panels/network.py b/panels/network.py index eec0e3e7..5971d307 100644 --- a/panels/network.py +++ b/panels/network.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.NetworkPanel") +def create_panel(*args): + return NetworkPanel(*args) + class NetworkPanel(ScreenPanel): def initialize(self, menu): _ = self.lang.gettext diff --git a/panels/preheat.py b/panels/preheat.py index 4badf4fc..89772455 100644 --- a/panels/preheat.py +++ b/panels/preheat.py @@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.PreheatPanel") +def create_panel(*args): + return PreheatPanel(*args) + class PreheatPanel(ScreenPanel): active_heaters = [] diff --git a/panels/print.py b/panels/print.py index d0e3dba8..cce5d0a3 100644 --- a/panels/print.py +++ b/panels/print.py @@ -12,6 +12,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.PrintPanel") +def create_panel(*args): + return PrintPanel(*args) + class PrintPanel(ScreenPanel): def initialize(self, panel_name): self.labels['files'] = {} diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 87121e0d..cd8116f1 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.SplashScreenPanel") +def create_panel(*args): + return SplashScreenPanel(*args) + class SplashScreenPanel(ScreenPanel): box = None diff --git a/panels/system.py b/panels/system.py index 583dd4d2..5ca16a1a 100644 --- a/panels/system.py +++ b/panels/system.py @@ -11,6 +11,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.SystemPanel") +def create_panel(*args): + return SystemPanel(*args) + class SystemPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext diff --git a/panels/temperature.py b/panels/temperature.py index 7b67f2a5..ddb6dd1a 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel logger = logging.getLogger("KlipperScreen.TemperaturePanel") +def create_panel(*args): + return TemperaturePanel(*args) + class TemperaturePanel(ScreenPanel): active_heater = "extruder" tempdeltas = ["1","5","10","25"] diff --git a/panels/zcalibrate.py b/panels/zcalibrate.py index f263146e..dd50ce43 100644 --- a/panels/zcalibrate.py +++ b/panels/zcalibrate.py @@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel import logging logger = logging.getLogger("KlipperScreen.ZCalibratePanel") +def create_panel(*args): + return ZCalibratePanel(*args) + class ZCalibratePanel(ScreenPanel): _screen = None labels = {} diff --git a/screen.py b/screen.py index a4185ca9..31face5a 100644 --- a/screen.py +++ b/screen.py @@ -8,6 +8,7 @@ import threading import json import requests import websocket +import importlib import logging import os import re @@ -27,7 +28,6 @@ from ks_includes.config import KlipperScreenConfig # Do this better in the future #from ks_includes.screen_panel import * -from panels.bed_level import * from panels.extrude import * from panels.fan import * from panels.fine_tune import * @@ -42,6 +42,7 @@ from panels.splash_screen import * from panels.system import * from panels.temperature import * from panels.zcalibrate import * +CORE_PANELS = ["main_menu","menu","job_status"] # Create logging logger = logging.getLogger('KlipperScreen') @@ -70,6 +71,7 @@ class KlipperScreen(Gtk.Window): number_tools = 1 panels = {} + load_panel = {} _cur_panels = [] files = None filename = "" @@ -106,6 +108,8 @@ class KlipperScreen(Gtk.Window): logger.info("KlipperScreen version: %s" % self.version) logger.info("Screen resolution: %sx%s" % (self.width, self.height)) + #self._load_panels() + self.printer_initializing(_("Initializing")) self._ws = KlippyWebsocket(self, { @@ -139,45 +143,34 @@ class KlipperScreen(Gtk.Window): } self._ws.klippy.object_subscription(requested_updates) + def _load_panel(self, panel, *args): + if not panel in self.load_panel: + logger.debug("Loading panel: %s" % panel) + panel_path = os.path.join(os.path.dirname(__file__), 'panels', "%s.py" % panel) + logger.info("Panel path: %s" % panel_path) + if not os.path.exists(panel_path): + msg = f"Panel {panel} does not exist" + logger.info(msg) + raise Exception(msg) + + module = importlib.import_module("panels.%s" % panel) + if not hasattr(module, "create_panel"): + msg = f"Cannot locate create_panel function for {panel}" + logger.info(msg) + raise Exception(msg) + self.load_panel[panel] = getattr(module, "create_panel") + + try: + return self.load_panel[panel](*args) + except Exception: + msg = f"Unable to create panel {panel}" + logger.exception(msg) + raise Exception(msg) + + def show_panel(self, panel_name, type, remove=None, pop=True, **kwargs): if panel_name not in self.panels: - try: - if type == "SplashScreenPanel": - self.panels[panel_name] = SplashScreenPanel(self) - elif type == "MainPanel": - self.panels[panel_name] = MainPanel(self) - elif type == "menu": - self.panels[panel_name] = MenuPanel(self) - elif type == "bed_level": - self.panels[panel_name] = BedLevelPanel(self) - elif type == "extrude": - self.panels[panel_name] = ExtrudePanel(self) - elif type == "finetune": - self.panels[panel_name] = FineTune(self) - elif type == "JobStatusPanel": - self.panels[panel_name] = JobStatusPanel(self) - elif type == "move": - self.panels[panel_name] = MovePanel(self) - elif type == "network": - self.panels[panel_name] = NetworkPanel(self) - elif type == "preheat": - self.panels[panel_name] = PreheatPanel(self) - elif type == "print": - self.panels[panel_name] = PrintPanel(self) - elif type == "temperature": - self.panels[panel_name] = TemperaturePanel(self) - elif type == "fan": - self.panels[panel_name] = FanPanel(self) - elif type == "system": - self.panels[panel_name] = SystemPanel(self) - elif type == "zcalibrate": - self.panels[panel_name] = ZCalibratePanel(self) - #Temporary for development - else: - self.panels[panel_name] = MovePanel(self) - except: - self.show_error_modal("Unable to load panel %s" % panel_name) - return + self.panels[panel_name] = self._load_panel(type, self) try: if kwargs != {}: @@ -186,7 +179,7 @@ class KlipperScreen(Gtk.Window): self.panels[panel_name].initialize(panel_name) except: del self.panels[panel_name] - self.show_error_modal("Unable to load panel %s" % panel_name) + self.show_error_modal("Unable to load panel %s" % type) return if hasattr(self.panels[panel_name],"process_update"): @@ -386,7 +379,7 @@ class KlipperScreen(Gtk.Window): def printer_initializing(self, text=None): self.shutdown = True - self.show_panel('splash_screen',"SplashScreenPanel", 2) + self.show_panel('splash_screen',"splash_screen", 2) if text != None: self.panels['splash_screen'].update_text(text) self.panels['splash_screen'].show_restart_buttons() @@ -442,12 +435,12 @@ class KlipperScreen(Gtk.Window): return self.files.add_timeout() - self.show_panel('main_panel', "MainPanel", 2, items=self._config.get_menu_items("__main"), extrudercount=self.printer.get_extruder_count()) + self.show_panel('main_panel', "main_menu", 2, items=self._config.get_menu_items("__main"), extrudercount=self.printer.get_extruder_count()) def printer_printing(self): self.ws_subscribe() self.files.remove_timeout() - self.show_panel('job_status',"JobStatusPanel", 2) + self.show_panel('job_status',"job_status", 2) def get_software_version(): prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always',