From a0d3bd6a0c549868f405260223b311158dd2b5b5 Mon Sep 17 00:00:00 2001 From: Jordan Date: Mon, 17 May 2021 21:55:58 -0400 Subject: [PATCH] base_panel: Initial commit --- ks_includes/screen_panel.py | 70 +++------------------ panels/base_panel.py | 121 ++++++++++++++++++++++++++++++++++++ panels/splash_screen.py | 10 +-- screen.py | 18 ++++-- 4 files changed, 148 insertions(+), 71 deletions(-) create mode 100644 panels/base_panel.py diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index 29b273b3..7200c55d 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -10,7 +10,6 @@ from ks_includes.KlippyGcodes import KlippyGcodes class ScreenPanel: title_spacing = 50 - control = {} def __init__(self, screen, title, back=True, action_bar=True, printer_name=True): self._screen = screen @@ -20,72 +19,16 @@ class ScreenPanel: self._printer = screen.printer self.labels = {} self._gtk = screen.gtk + self.control = {} + self.title = title self.layout = Gtk.Layout() self.layout.set_size(self._screen.width, self._screen.height) action_bar_width = self._gtk.get_action_bar_width() if action_bar == True else 0 - - if action_bar == True: - self.control_grid = self._gtk.HomogeneousGrid() - self.control_grid.set_size_request(action_bar_width - 2, self._screen.height) - self.control_grid.get_style_context().add_class('action_bar') - - button_scale = self._gtk.get_header_image_scale() - logging.debug("Button scale: %s" % button_scale) - - if back == True: - self.control['back'] = self._gtk.ButtonImage('back', None, None, button_scale[0], button_scale[1]) - self.control['back'].connect("clicked", self._screen._menu_go_back) - self.control_grid.attach(self.control['back'], 0, 0, 1, 1) - - self.control['home'] = self._gtk.ButtonImage('main', None, None, button_scale[0], button_scale[1]) - self.control['home'].connect("clicked", self.menu_return, True) - self.control_grid.attach(self.control['home'], 0, 1, 1, 1) - else: - for i in range(2): - self.control['space%s' % i] = Gtk.Label("") - self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) - - if len(self._config.get_printers()) > 1: - self.control['printer_select'] = self._gtk.ButtonImage( - 'shuffle', None, None, button_scale[0], button_scale[1]) - self.control['printer_select'].connect("clicked", self._screen.show_printer_select) - else: - self.control['printer_select'] = Gtk.Label("") - self.control_grid.attach(self.control['printer_select'], 0, 2, 1, 1) - - self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, button_scale[0], button_scale[1]) - self.control['estop'].connect("clicked", self.emergency_stop) - self.control_grid.attach(self.control['estop'], 0, 3, 1, 1) - #self.layout.put(self.control['estop'], int(self._screen.width/4*3 - button_scale[0]/2), 0) - - try: - env = Environment(extensions=["jinja2.ext.i18n"]) - env.install_gettext_translations(self.lang) - j2_temp = env.from_string(title) - title = j2_temp.render() - except: - logging.debug("Error parsing jinja for title: %s" % title) - - self.title = Gtk.Label() - self.title.set_size_request(self._screen.width - action_bar_width, self.title_spacing) - self.title.set_hexpand(True) - self.title.set_halign(Gtk.Align.CENTER) - self.title.set_valign(Gtk.Align.CENTER) - if printer_name == True: - self.set_title("%s | %s" % (self._screen.connected_printer, title)) - else: - self.set_title(title) - self.content = Gtk.Box(spacing=0) self.content.set_size_request(self._screen.width - action_bar_width, self._screen.height - self.title_spacing) - if action_bar == True: - self.layout.put(self.control_grid, 0, 0) - self.layout.put(self.title, action_bar_width, 0) - self.layout.put(self.content, action_bar_width, self.title_spacing) - def initialize(self, panel_name): # Create gtk items here @@ -97,6 +40,9 @@ class ScreenPanel: def get(self): return self.layout + def get_content(self): + return self.content + def get_file_image(self, filename, width=1.6, height=1.6): if not self._files.has_thumbnail(filename): return None @@ -110,6 +56,9 @@ class ScreenPanel: return self._gtk.PixbufFromHttp(loc[1], None, width, height) return None + def get_title(self): + return self.title + def home(self, widget): self._screen._ws.klippy.gcode_script(KlippyGcodes.HOME) @@ -129,7 +78,8 @@ class ScreenPanel: self._screen._menu_go_home() def set_title(self, title): - self.title.set_label(title) + self.title = title + #self.title.set_label(title) def show_all(self): self._screen.show_all() diff --git a/panels/base_panel.py b/panels/base_panel.py new file mode 100644 index 00000000..664bea1c --- /dev/null +++ b/panels/base_panel.py @@ -0,0 +1,121 @@ +import gi +import logging + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Gdk, GLib +from jinja2 import Environment, Template + +from ks_includes.KlippyGtk import KlippyGtk +from ks_includes.KlippyGcodes import KlippyGcodes +from ks_includes.screen_panel import ScreenPanel + +class BasePanel(ScreenPanel): + def __init__(self, screen, title, back=True, action_bar=True, printer_name=True): + super().__init__(screen, title, back, action_bar, printer_name) + + self.buttons_showing = { + 'back': False if back else True + } + + self.layout = Gtk.Layout() + self.layout.set_size(self._screen.width, self._screen.height) + + action_bar_width = self._gtk.get_action_bar_width() if action_bar == True else 0 + + self.control_grid = self._gtk.HomogeneousGrid() + self.control_grid.set_size_request(action_bar_width - 2, self._screen.height) + self.control_grid.get_style_context().add_class('action_bar') + + button_scale = self._gtk.get_header_image_scale() + logging.debug("Button scale: %s" % button_scale) + + self.control['back'] = self._gtk.ButtonImage('back', None, None, button_scale[0], button_scale[1]) + self.control['back'].connect("clicked", self._screen._menu_go_back) + self.control['home'] = self._gtk.ButtonImage('main', None, None, button_scale[0], button_scale[1]) + self.control['home'].connect("clicked", self.menu_return, True) + + #if back == True: + # self.control_grid.attach(self.control['back'], 0, 0, 1, 1) + # self.control_grid.attach(self.control['home'], 0, 1, 1, 1) + #else: + for i in range(2): + self.control['space%s' % i] = Gtk.Label("") + self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) + + if len(self._config.get_printers()) > 1: + self.control['printer_select'] = self._gtk.ButtonImage( + 'shuffle', None, None, button_scale[0], button_scale[1]) + self.control['printer_select'].connect("clicked", self._screen.show_printer_select) + else: + self.control['printer_select'] = Gtk.Label("") + self.control_grid.attach(self.control['printer_select'], 0, 2, 1, 1) + + self.control['estop'] = self._gtk.ButtonImage('emergency', None, None, button_scale[0], button_scale[1]) + self.control['estop'].connect("clicked", self.emergency_stop) + self.control_grid.attach(self.control['estop'], 0, 3, 1, 1) + + try: + env = Environment(extensions=["jinja2.ext.i18n"]) + env.install_gettext_translations(self.lang) + j2_temp = env.from_string(title) + title = j2_temp.render() + except: + logging.debug("Error parsing jinja for title: %s" % title) + + self.titlelbl = Gtk.Label() + self.titlelbl.set_size_request(self._screen.width - action_bar_width, self.title_spacing) + self.titlelbl.set_hexpand(True) + self.titlelbl.set_halign(Gtk.Align.CENTER) + self.titlelbl.set_valign(Gtk.Align.CENTER) + self.set_title(title) + + self.content = Gtk.Box(spacing=0) + self.content.set_size_request(self._screen.width - action_bar_width, self._screen.height - self.title_spacing) + + if action_bar == True: + self.layout.put(self.control_grid, 0, 0) + self.layout.put(self.titlelbl, action_bar_width, 0) + self.layout.put(self.content, action_bar_width, self.title_spacing) + + def initialize(self, panel_name): + # Create gtk items here + return + + def add_content(self, panel): + self.set_title(panel.get_title()) + self.content.add(panel.get_content()) + + def get(self): + return self.layout + + def remove(self, widget): + self.content.remove(widget) + + def show_back(self, show=True): + if show == True and self.buttons_showing['back'] == False: + self.control_grid.remove(self.control_grid.get_child_at(0,0)) + self.control_grid.attach(self.control['back'], 0, 0, 1, 1) + self.control_grid.remove(self.control_grid.get_child_at(0,1)) + self.control_grid.attach(self.control['home'], 0, 1, 1, 1) + self.buttons_showing['back'] = True + elif show == False and self.buttons_showing['back'] == True: + for i in range(0,2): + self.control_grid.remove(self.control_grid.get_child_at(0,i)) + self.control_grid.attach(self.control['space%s' % i], 0, i, 1, 1) + self.buttons_showing['back'] = False + self.control_grid.show() + + def set_title(self, title): + try: + env = Environment(extensions=["jinja2.ext.i18n"]) + env.install_gettext_translations(self.lang) + j2_temp = env.from_string(title) + title = j2_temp.render() + except: + logging.debug("Error parsing jinja for title: %s" % title) + + self.titlelbl.set_label("%s | %s" % (self._screen.connected_printer, title)) + + def show_back_buttons(self): + self.control_grid.attach(self.control['back'], 0, 0, 1, 1) + self.control_grid.attach(self.control['home'], 0, 1, 1, 1) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index dd867df5..d8527d8c 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -22,7 +22,7 @@ class SplashScreenPanel(ScreenPanel): def initialize(self, panel_name): _ = self.lang.gettext - image = self._gtk.Image("klipper.svg", None, 4, 4) + image = self._gtk.Image("klipper.svg", None, 4, 3) self.labels['text'] = Gtk.Label(_("Initializing printer...")) self.labels['text'].set_line_wrap(True) @@ -42,12 +42,8 @@ class SplashScreenPanel(ScreenPanel): main.pack_end(self.labels['actions'], False, False, 10) main.pack_end(self.labels['text'], True, True, 10) - - box = Gtk.VBox() - box.add(main) - box.set_size_request(self._screen.width, self._screen.height) - - self.layout.put(box, 0, 0) + self.content.add(main) + #self.layout.put(box, 0, 0) def update_text(self, text): self.labels['text'].set_text(text) diff --git a/screen.py b/screen.py index 7f108f0d..8327373c 100644 --- a/screen.py +++ b/screen.py @@ -33,6 +33,7 @@ from ks_includes.printer import Printer from ks_includes.wifi import WifiManager from ks_includes.config import KlipperScreenConfig +from panels.base_panel import BasePanel logging.getLogger('matplotlib').setLevel(logging.WARNING) import numpy @@ -119,6 +120,9 @@ class KlipperScreen(Gtk.Window): self.gtk = KlippyGtk(self, self.width, self.height, self.theme) self.init_style() + self.base_panel = BasePanel(self, "Base Panel", False) + self.add(self.base_panel.get()) + self.printer_initializing(_("Initializing")) self.set_screenblanking_timeout(self._config.get_main_config_option('screen_blanking')) @@ -301,8 +305,13 @@ class KlipperScreen(Gtk.Window): self._remove_current_panel(pop) logging.debug("Attaching panel %s" % panel_name) + self.base_panel.add_content(self.panels[panel_name]) - self.add(self.panels[panel_name].get()) + logging.debug("Showing back. count: %s" % len(self._cur_panels)) + if len(self._cur_panels) == 0: + self.base_panel.show_back(False) + else: + self.base_panel.show_back(True) self.show_all() if hasattr(self.panels[panel_name],"process_update"): @@ -424,7 +433,7 @@ class KlipperScreen(Gtk.Window): logging.info("No items in menu, returning.") return - self.show_panel(self._cur_panels[-1] + '_' + name, "menu", disname, 1, False, display_name=disname, + self.show_panel(self._cur_panels[-1] + '_menu', "menu", disname, 1, False, display_name=disname, items=menuitems) def _remove_all_panels(self): @@ -434,11 +443,12 @@ class KlipperScreen(Gtk.Window): def _remove_current_panel(self, pop=True, show=True): if len(self._cur_panels) > 0: - self.remove(self.panels[self._cur_panels[-1]].get()) + self.base_panel.remove(self.panels[self._cur_panels[-1]].get_content()) if pop == True: self._cur_panels.pop() if len(self._cur_panels) > 0: - self.add(self.panels[self._cur_panels[-1]].get()) + self.base_panel.add_content(self.panels[self._cur_panels[-1]]) + self.base_panel.show_back(False if len(self._cur_panels) == 1 else True) if hasattr(self.panels[self._cur_panels[-1]], "process_update"): self.panels[self._cur_panels[-1]].process_update("notify_status_update", self.printer.get_updates())