From 3c3db7fa21f950c448deceee261cfc2b980a270a Mon Sep 17 00:00:00 2001 From: alfrix Date: Sat, 5 Mar 2022 11:50:26 -0300 Subject: [PATCH] base_panel: allow titlebar items to be configured --- docs/Configuration.md | 9 +++ panels/base_panel.py | 124 ++++++++++++++++++++++++++++-------------- 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index c13b0368..440cfb1d 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -61,6 +61,15 @@ move_speed_z: 300 # Define one or more moonraker power devices that turn on this printer (CSV list) # Default is the printer name power_devices: example1, example2 + +# Define what items should be shown in titlebar besides the extruder and bed +# the name must be the same as defined in the klipper config +# valid options are temperature_sensors or temperature_fans, or heater_generic +titlebar_items: chamber, MCU, Pi + +# The style of the user defined items in the titlebar +# Can be 'full' indicating that the full name is shown, 'short' for the first letter, or None (default) for no name +titlebar_name_type: None ``` ## Z probe calibrate Option diff --git a/panels/base_panel.py b/panels/base_panel.py index 1540e247..77b22c13 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -4,7 +4,7 @@ import gi import logging gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk, GLib +from gi.repository import Gtk, Gdk, GLib, Pango from jinja2 import Environment, Template from ks_includes.KlippyGtk import KlippyGtk @@ -19,6 +19,7 @@ class BasePanel(ScreenPanel): self.time_format = self._config.get_main_config_option("24htime") self.title_spacing = self._gtk.font_size * 2 self.time_update = None + self.titlebar_name_type = None self.buttons_showing = { 'back': False if back else True, 'macros_shortcut': False, @@ -89,7 +90,10 @@ class BasePanel(ScreenPanel): self.titlelbl = Gtk.Label() self.titlelbl.set_hexpand(True) + self.titlelbl.set_vexpand(True) self.titlelbl.set_halign(Gtk.Align.CENTER) + self.titlelbl.set_ellipsize(True) + self.titlelbl.set_ellipsize(Pango.EllipsizeMode.END) self.set_title(title) self.hmargin = 5 @@ -110,23 +114,23 @@ class BasePanel(ScreenPanel): self.control['time_box'] = Gtk.Box() self.control['time_box'].set_halign(Gtk.Align.END) self.control['time'] = Gtk.Label("00:00 AM") - self.control['time_box'].pack_end(self.control['time'], True, True, 0) + self.control['time_box'].pack_end(self.control['time'], True, True, self.hmargin) self.control['temp_box'] = Gtk.Box() self.titlebar = Gtk.Grid() - self.titlelbl.set_vexpand(True) self.titlebar.set_valign(Gtk.Align.CENTER) + self.titlebar.set_property("column-spacing", 5) if self._screen.vertical_mode: - self.titlebar.set_size_request(self._screen.width - self.hmargin, self.title_spacing) + self.titlebar.set_size_request(self._screen.width, self.title_spacing) else: - self.titlebar.set_size_request(self._screen.width - action_bar_width - self.hmargin, self.title_spacing) + self.titlebar.set_size_request(self._screen.width - action_bar_width, self.title_spacing) self.titlebar.attach(self.control['temp_box'], 0, 0, 1, 1) self.titlebar.attach(self.titlelbl, 1, 0, 1, 1) self.titlebar.attach(self.control['time_box'], 2, 0, 1, 1) if self._screen.vertical_mode: - self.layout.put(self.titlebar, self.hmargin, 0) + self.layout.put(self.titlebar, 0, 0) self.layout.put(self.content, self.hmargin, self.title_spacing) else: self.layout.put(self.titlebar, action_bar_width, 0) @@ -144,43 +148,77 @@ class BasePanel(ScreenPanel): if show is False: return - h = 0 + for device in self._printer.get_temp_store_devices(): + self.labels[device + '_box'] = Gtk.Box(spacing=0) + self.labels[device] = Gtk.Label(label="100º") + self.labels[device].set_ellipsize(True) + self.labels[device].set_ellipsize(Pango.EllipsizeMode.START) + if device.startswith("extruder"): + if device == "extruder": + ext_img = self._gtk.Image("extruder-0.svg", None, .5, .5) + else: + ext_img = self._gtk.Image("extruder-%s.svg" % device[8:], None, .5, .5) + self.labels[device + '_box'].pack_start(ext_img, True, True, 3) + elif device.startswith("heater_bed"): + bed_img = self._gtk.Image("bed.svg", None, .5, .5) + self.labels[device + '_box'].pack_start(bed_img, True, True, 3) + elif device.startswith("temperature_fan"): + fan_img = self._gtk.Image("fan.svg", None, .5, .5) + self.labels[device + '_box'].pack_start(fan_img, True, True, 3) + else: + temp_img = self._gtk.Image("heat-up.svg", None, .5, .5) + self.labels[device + '_box'].pack_start(temp_img, True, True, 3) + self.labels[device + '_box'].pack_start(self.labels[device], True, True, 0) + + if self._screen.width <= 480: + nlimit = 3 + elif self._screen.width <= 800: + nlimit = 4 + else: + nlimit = 5 + + n = 0 if self._printer.get_tools(): - for i, extruder in enumerate(self._printer.get_tools()): - self.labels[extruder + '_box'] = Gtk.Box(spacing=0) - self.labels[extruder] = Gtk.Label(label="200º") - if i <= 4: - ext_img = self._gtk.Image("extruder-%s.svg" % i, None, .4, .4) - self.labels[extruder + '_box'].pack_start(ext_img, True, True, 3) - self.labels[extruder + '_box'].pack_start(self.labels[extruder], True, True, 0) self.current_extruder = self._printer.get_stat("toolhead", "extruder") self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, True, 3) - h += 1 + n += 1 if self._printer.has_heated_bed(): - heater_bed = self._gtk.Image("bed.svg", None, .4, .4) - self.labels['heater_bed'] = Gtk.Label(label="100º") - heater_bed_box = Gtk.Box(spacing=0) - heater_bed_box.pack_start(heater_bed, True, True, 5) - heater_bed_box.pack_start(self.labels['heater_bed'], True, True, 0) - self.control['temp_box'].pack_end(heater_bed_box, True, True, 3) - h += 1 + self.control['temp_box'].pack_start(self.labels['heater_bed_box'], True, True, 3) + n += 1 - heater_gen_img = self._gtk.Image("heat-up.svg", None, .4, .4) - for heater in self._printer.get_heaters(): - if h > 3 and self._screen.width <= 480: + # Options in the config have priority + printer_cfg = self._config.get_printer_config(self._screen.connected_printer) + logging.info("printer_cfg: %s", printer_cfg) + if printer_cfg is not None: + titlebar_items = printer_cfg.get("titlebar_items", "") + titlebar_items = [str(i.strip()) for i in titlebar_items.split(',')] + logging.info("Titlebar items: %s", titlebar_items) + self.titlebar_name_type = printer_cfg.get("titlebar_name_type", None) + logging.info("Titlebar name type: %s", self.titlebar_name_type) + else: + titlebar_items = None + for device in self._printer.get_temp_store_devices(): + # Users can fill the bar if they want + if n >= nlimit + 1: break - elif h > 4 and self._screen.width <= 800: + if not (device.startswith("extruder") or device.startswith("heater_bed")): + name = device.split(" ")[1:][0] + else: + name = device + for item in titlebar_items: + if name == item: + self.control['temp_box'].pack_start(self.labels["%s_box" % device], True, True, 3) + n += 1 + break + + # If there is enough space fill with heater_generic + for device in self._printer.get_temp_store_devices(): + if n >= nlimit: break - elif h > 5: - break - elif heater.startswith("heater_generic"): - self.labels[heater + '_box'] = Gtk.Box(spacing=0) - self.labels[heater] = Gtk.Label(label="100º") - self.labels[heater + '_box'].pack_start(heater_gen_img, True, True, 3) - self.labels[heater + '_box'].pack_start(self.labels[heater], True, True, 0) - self.control['temp_box'].pack_start(self.labels["%s_box" % heater], True, True, 3) - h += 1 + if device.startswith("heater_generic"): + self.control['temp_box'].pack_start(self.labels["%s_box" % device], True, True, 3) + n += 1 def activate(self): if self.time_update is None: @@ -211,17 +249,21 @@ class BasePanel(ScreenPanel): if action != "notify_status_update" or self._printer is None: return - for x in self._printer.get_tools(): - self.labels[x].set_label("%d°" % round(self._printer.get_dev_stat(x, "temperature"))) - for heater in self._printer.get_heaters(): - if heater == "heater_bed" or heater.startswith("heater_generic"): - self.labels[heater].set_label("%d°" % round(self._printer.get_dev_stat(heater, "temperature"))) + for device in self._printer.get_temp_store_devices(): + name = "" + if not (device.startswith("extruder") or device.startswith("heater_bed")): + if self.titlebar_name_type == "full": + name = device.split(" ")[1:][0].capitalize().replace("_", " ") + ": " + elif self.titlebar_name_type == "short": + name = device.split(" ")[1:][0][:1].upper() + ": " + self.labels[device].set_label("%s%d°" % (name, round(self._printer.get_dev_stat(device, "temperature")))) if "toolhead" in data and "extruder" in data["toolhead"]: if data["toolhead"]["extruder"] != self.current_extruder: self.control['temp_box'].remove(self.labels["%s_box" % self.current_extruder]) self.current_extruder = data["toolhead"]["extruder"] self.control['temp_box'].pack_start(self.labels["%s_box" % self.current_extruder], True, True, 3) + self.control['temp_box'].reorder_child(self.labels["%s_box" % self.current_extruder], 0) self.control['temp_box'].show_all() @@ -335,7 +377,7 @@ class BasePanel(ScreenPanel): except Exception: logging.debug("Error parsing jinja for title: %s" % title) - self.titlelbl.set_label("%s | %s" % (self._screen.connected_printer, title)) + self.titlelbl.set_label("%s | %s" % (self._screen.connecting_to_printer, title)) def show_back_buttons(self): self.control_grid.attach(self.control['back'], 0, 0, 1, 1)