Dynamically load panels

This commit is contained in:
Jordan Ruthe 2020-11-23 21:00:04 -05:00
parent 3b62439939
commit 8204e3ab17
18 changed files with 85 additions and 44 deletions

View File

@ -124,7 +124,7 @@ panel: temperature
[menu __print tuning] [menu __print tuning]
name: Fine Tuning name: Fine Tuning
icon: fan icon: fan
panel: finetune panel: fine_tune
[menu __print network] [menu __print network]
name: Network name: Network

View File

@ -111,3 +111,6 @@ class BedLevelPanel(ScreenPanel):
self._screen._ws.klippy.gcode_script( self._screen._ws.klippy.gcode_script(
"M18" # Disable motors "M18" # Disable motors
) )
def create_panel(*args):
return BedLevelPanel(*args)

View File

@ -7,6 +7,9 @@ from ks_includes.KlippyGtk import KlippyGtk
from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.KlippyGcodes import KlippyGcodes
from ks_includes.screen_panel import ScreenPanel from ks_includes.screen_panel import ScreenPanel
def create_panel(*args):
return ExamplePanel(*args)
class ExamplePanel(ScreenPanel): class ExamplePanel(ScreenPanel):
def initialize(self, panel_name): def initialize(self, panel_name):
_ = self.lang.gettext _ = self.lang.gettext

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.ExtrudePanel") logger = logging.getLogger("KlipperScreen.ExtrudePanel")
def create_panel(*args):
return ExtrudePanel(*args)
class ExtrudePanel(ScreenPanel): class ExtrudePanel(ScreenPanel):
distance = 1 distance = 1
distances = ['1','5','10','25'] distances = ['1','5','10','25']

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.FanPanel") logger = logging.getLogger("KlipperScreen.FanPanel")
def create_panel(*args):
return FanPanel(*args)
class FanPanel(ScreenPanel): class FanPanel(ScreenPanel):
user_selecting = False user_selecting = False

View File

@ -10,7 +10,10 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.FineTunePanel") logger = logging.getLogger("KlipperScreen.FineTunePanel")
class FineTune(ScreenPanel): def create_panel(*args):
return FineTunePanel(*args)
class FineTunePanel(ScreenPanel):
user_selecting = False user_selecting = False
bs = 0 bs = 0

View File

@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.JobStatusPanel") logger = logging.getLogger("KlipperScreen.JobStatusPanel")
def create_panel(*args):
return JobStatusPanel(*args)
class JobStatusPanel(ScreenPanel): class JobStatusPanel(ScreenPanel):
is_paused = False is_paused = False
filename = None filename = None

View File

@ -9,6 +9,9 @@ from panels.menu import MenuPanel
logger = logging.getLogger("KlipperScreen.MainMenu") logger = logging.getLogger("KlipperScreen.MainMenu")
def create_panel(*args):
return MainPanel(*args)
class MainPanel(MenuPanel): class MainPanel(MenuPanel):
def initialize(self, panel_name, items, extrudercount): def initialize(self, panel_name, items, extrudercount):

View File

@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MenuPanel") logger = logging.getLogger("KlipperScreen.MenuPanel")
def create_panel(*args):
return MenuPanel(*args)
class MenuPanel(ScreenPanel): class MenuPanel(ScreenPanel):
def initialize(self, panel_name, items): def initialize(self, panel_name, items):
_ = self.lang.gettext _ = self.lang.gettext

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.MovePanel") logger = logging.getLogger("KlipperScreen.MovePanel")
def create_panel(*args):
return MovePanel(*args)
class MovePanel(ScreenPanel): class MovePanel(ScreenPanel):
distance = 1 distance = 1
distances = ['.1','.5','1','5','10','25'] distances = ['.1','.5','1','5','10','25']

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.NetworkPanel") logger = logging.getLogger("KlipperScreen.NetworkPanel")
def create_panel(*args):
return NetworkPanel(*args)
class NetworkPanel(ScreenPanel): class NetworkPanel(ScreenPanel):
def initialize(self, menu): def initialize(self, menu):
_ = self.lang.gettext _ = self.lang.gettext

View File

@ -9,6 +9,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.PreheatPanel") logger = logging.getLogger("KlipperScreen.PreheatPanel")
def create_panel(*args):
return PreheatPanel(*args)
class PreheatPanel(ScreenPanel): class PreheatPanel(ScreenPanel):
active_heaters = [] active_heaters = []

View File

@ -12,6 +12,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.PrintPanel") logger = logging.getLogger("KlipperScreen.PrintPanel")
def create_panel(*args):
return PrintPanel(*args)
class PrintPanel(ScreenPanel): class PrintPanel(ScreenPanel):
def initialize(self, panel_name): def initialize(self, panel_name):
self.labels['files'] = {} self.labels['files'] = {}

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.SplashScreenPanel") logger = logging.getLogger("KlipperScreen.SplashScreenPanel")
def create_panel(*args):
return SplashScreenPanel(*args)
class SplashScreenPanel(ScreenPanel): class SplashScreenPanel(ScreenPanel):
box = None box = None

View File

@ -11,6 +11,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.SystemPanel") logger = logging.getLogger("KlipperScreen.SystemPanel")
def create_panel(*args):
return SystemPanel(*args)
class SystemPanel(ScreenPanel): class SystemPanel(ScreenPanel):
def initialize(self, panel_name): def initialize(self, panel_name):
_ = self.lang.gettext _ = self.lang.gettext

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.TemperaturePanel") logger = logging.getLogger("KlipperScreen.TemperaturePanel")
def create_panel(*args):
return TemperaturePanel(*args)
class TemperaturePanel(ScreenPanel): class TemperaturePanel(ScreenPanel):
active_heater = "extruder" active_heater = "extruder"
tempdeltas = ["1","5","10","25"] tempdeltas = ["1","5","10","25"]

View File

@ -10,6 +10,9 @@ from ks_includes.screen_panel import ScreenPanel
import logging import logging
logger = logging.getLogger("KlipperScreen.ZCalibratePanel") logger = logging.getLogger("KlipperScreen.ZCalibratePanel")
def create_panel(*args):
return ZCalibratePanel(*args)
class ZCalibratePanel(ScreenPanel): class ZCalibratePanel(ScreenPanel):
_screen = None _screen = None
labels = {} labels = {}

View File

@ -8,6 +8,7 @@ import threading
import json import json
import requests import requests
import websocket import websocket
import importlib
import logging import logging
import os import os
import re import re
@ -27,7 +28,6 @@ from ks_includes.config import KlipperScreenConfig
# Do this better in the future # Do this better in the future
#from ks_includes.screen_panel import * #from ks_includes.screen_panel import *
from panels.bed_level import *
from panels.extrude import * from panels.extrude import *
from panels.fan import * from panels.fan import *
from panels.fine_tune import * from panels.fine_tune import *
@ -42,6 +42,7 @@ from panels.splash_screen import *
from panels.system import * from panels.system import *
from panels.temperature import * from panels.temperature import *
from panels.zcalibrate import * from panels.zcalibrate import *
CORE_PANELS = ["main_menu","menu","job_status"]
# Create logging # Create logging
logger = logging.getLogger('KlipperScreen') logger = logging.getLogger('KlipperScreen')
@ -70,6 +71,7 @@ class KlipperScreen(Gtk.Window):
number_tools = 1 number_tools = 1
panels = {} panels = {}
load_panel = {}
_cur_panels = [] _cur_panels = []
files = None files = None
filename = "" filename = ""
@ -106,6 +108,8 @@ class KlipperScreen(Gtk.Window):
logger.info("KlipperScreen version: %s" % self.version) logger.info("KlipperScreen version: %s" % self.version)
logger.info("Screen resolution: %sx%s" % (self.width, self.height)) logger.info("Screen resolution: %sx%s" % (self.width, self.height))
#self._load_panels()
self.printer_initializing(_("Initializing")) self.printer_initializing(_("Initializing"))
self._ws = KlippyWebsocket(self, { self._ws = KlippyWebsocket(self, {
@ -139,45 +143,34 @@ class KlipperScreen(Gtk.Window):
} }
self._ws.klippy.object_subscription(requested_updates) 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): def show_panel(self, panel_name, type, remove=None, pop=True, **kwargs):
if panel_name not in self.panels: if panel_name not in self.panels:
try: self.panels[panel_name] = self._load_panel(type, self)
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
try: try:
if kwargs != {}: if kwargs != {}:
@ -186,7 +179,7 @@ class KlipperScreen(Gtk.Window):
self.panels[panel_name].initialize(panel_name) self.panels[panel_name].initialize(panel_name)
except: except:
del self.panels[panel_name] 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 return
if hasattr(self.panels[panel_name],"process_update"): if hasattr(self.panels[panel_name],"process_update"):
@ -386,7 +379,7 @@ class KlipperScreen(Gtk.Window):
def printer_initializing(self, text=None): def printer_initializing(self, text=None):
self.shutdown = True self.shutdown = True
self.show_panel('splash_screen',"SplashScreenPanel", 2) self.show_panel('splash_screen',"splash_screen", 2)
if text != None: if text != None:
self.panels['splash_screen'].update_text(text) self.panels['splash_screen'].update_text(text)
self.panels['splash_screen'].show_restart_buttons() self.panels['splash_screen'].show_restart_buttons()
@ -442,12 +435,12 @@ class KlipperScreen(Gtk.Window):
return return
self.files.add_timeout() 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): def printer_printing(self):
self.ws_subscribe() self.ws_subscribe()
self.files.remove_timeout() self.files.remove_timeout()
self.show_panel('job_status',"JobStatusPanel", 2) self.show_panel('job_status',"job_status", 2)
def get_software_version(): def get_software_version():
prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always', prog = ('git', '-C', os.path.dirname(__file__), 'describe', '--always',