Dynamically load panels
This commit is contained in:
parent
3b62439939
commit
8204e3ab17
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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']
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
@ -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
|
||||||
|
@ -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']
|
||||||
|
@ -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
|
||||||
|
@ -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 = []
|
||||||
|
|
||||||
|
@ -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'] = {}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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"]
|
||||||
|
@ -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 = {}
|
||||||
|
77
screen.py
77
screen.py
@ -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',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user