screen_panel: integrate add_option to deduplicate code

This commit is contained in:
alfrix 2024-04-15 14:43:13 -03:00
parent 198cdfcc11
commit 6117b6e10d
4 changed files with 76 additions and 145 deletions

View File

@ -3,7 +3,7 @@ import datetime
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from gi.repository import Gtk, Pango
class ScreenPanel:
@ -195,3 +195,77 @@ class ScreenPanel:
self.labels[dev].get_style_context().remove_class("heater-grid-temp-power")
elif dev in self.devices:
self.devices[dev]["temp"].get_child().set_label(new_label_text)
def add_option(self, boxname, opt_array, opt_name, option):
if option['type'] is None:
return
name = Gtk.Label(
hexpand=True, vexpand=True, halign=Gtk.Align.START, valign=Gtk.Align.CENTER,
wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
name.set_markup(f"<big><b>{option['name']}</b></big>")
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
labels.add(name)
dev = Gtk.Box(spacing=5,
valign=Gtk.Align.CENTER, hexpand=True, vexpand=False)
dev.get_style_context().add_class("frame-item")
dev.add(labels)
setting = {}
if option['type'] == "binary":
switch = Gtk.Switch(active=self._config.get_config().getboolean(option['section'], opt_name, fallback=True))
switch.connect("notify::active", self.switch_config_option, option['section'], opt_name,
option['callback'] if "callback" in option else None)
dev.add(switch)
setting = {opt_name: switch}
elif option['type'] == "dropdown":
dropdown = Gtk.ComboBoxText()
for i, opt in enumerate(option['options']):
dropdown.append(opt['value'], opt['name'])
if opt['value'] == self._config.get_config()[option['section']].get(opt_name, option['value']):
dropdown.set_active(i)
dropdown.connect("changed", self.on_dropdown_change, option['section'], opt_name,
option['callback'] if "callback" in option else None)
dropdown.set_entry_text_column(0)
dev.add(dropdown)
setting = {opt_name: dropdown}
elif option['type'] == "scale":
dev.set_orientation(Gtk.Orientation.VERTICAL)
scale = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL,
min=option['range'][0], max=option['range'][1], step=option['step'])
scale.set_hexpand(True)
scale.set_value(int(self._config.get_config().get(option['section'], opt_name, fallback=option['value'])))
scale.set_digits(0)
scale.connect("button-release-event", self.scale_moved, option['section'], opt_name)
dev.add(scale)
setting = {opt_name: scale}
elif option['type'] == "printer":
box = Gtk.Box(vexpand=False)
label = Gtk.Label(f"{option['moonraker_host']}:{option['moonraker_port']}")
box.add(label)
dev.add(box)
elif option['type'] == "menu":
open_menu = self._gtk.Button("settings", style="color3")
open_menu.connect("clicked", self.load_menu, option['menu'], option['name'])
open_menu.set_hexpand(False)
open_menu.set_halign(Gtk.Align.END)
dev.add(open_menu)
elif option['type'] == "lang":
select = self._gtk.Button("load", style="color3")
select.connect("clicked", self._screen.change_language, option['name'])
select.set_hexpand(False)
select.set_halign(Gtk.Align.END)
dev.add(select)
opt_array[opt_name] = {
"name": option['name'],
"row": dev
}
opts = sorted(list(opt_array), key=lambda x: opt_array[x]['name'].casefold())
pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos)
self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1)
self.labels[boxname].show_all()
return setting

View File

@ -128,6 +128,7 @@ class Panel(ScreenPanel):
self.options[macro] = {
"name": macro,
"section": f"displayed_macros {self._screen.connected_printer}",
"type": "binary"
}
show = self._config.get_config().getboolean(self.options[macro]["section"], macro.lower(), fallback=True)
if macro not in self.macros and show:
@ -142,36 +143,6 @@ class Panel(ScreenPanel):
self.labels['macros'].attach(self.macros[macro]['row'], 0, pos, 1, 1)
self.labels['macros'].show_all()
def add_option(self, boxname, opt_array, opt_name, option):
name = Gtk.Label(hexpand=True, vexpand=True, halign=Gtk.Align.START, valign=Gtk.Align.CENTER,
wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
name.set_markup(f"<big><b>{option['name']}</b></big>")
box = Gtk.Box(vexpand=False)
switch = Gtk.Switch(hexpand=False, vexpand=False,
width_request=round(self._gtk.font_size * 7),
height_request=round(self._gtk.font_size * 3.5),
active=self._config.get_config().getboolean(option['section'], opt_name, fallback=True))
switch.connect("notify::active", self.switch_config_option, option['section'], opt_name)
box.add(switch)
dev = Gtk.Box(hexpand=True, vexpand=False, valign=Gtk.Align.CENTER)
dev.get_style_context().add_class("frame-item")
dev.add(name)
dev.add(box)
opt_array[opt_name] = {
"name": option['name'],
"row": dev
}
opts = sorted(self.options, key=str.casefold)
pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos)
self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1)
self.labels[boxname].show_all()
def back(self):
if len(self.menu) > 1:
self.unload_menu()

View File

@ -177,50 +177,6 @@ class Panel(ScreenPanel):
if self._printer.get_stat("gcode_move", "absolute_coordinates"):
self._screen._ws.klippy.gcode_script("G90")
def add_option(self, boxname, opt_array, opt_name, option):
name = Gtk.Label(hexpand=True, vexpand=True, halign=Gtk.Align.START, valign=Gtk.Align.CENTER, wrap=True)
name.set_markup(f"<big><b>{option['name']}</b></big>")
name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
dev = Gtk.Box(spacing=5,
hexpand=True, vexpand=False, valign=Gtk.Align.CENTER)
dev.get_style_context().add_class("frame-item")
dev.add(name)
setting = {}
if option['type'] == "binary":
box = Gtk.Box(hexpand=False)
switch = Gtk.Switch(hexpand=False, vexpand=False,
width_request=round(self._gtk.font_size * 7),
height_request=round(self._gtk.font_size * 3.5),
active=self._config.get_config().getboolean(option['section'], opt_name))
switch.connect("notify::active", self.switch_config_option, option['section'], opt_name)
setting = {opt_name: switch}
box.add(switch)
dev.add(box)
elif option['type'] == "scale":
dev.set_orientation(Gtk.Orientation.VERTICAL)
scale = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL,
min=option['range'][0], max=option['range'][1], step=option['step'])
scale.set_hexpand(True)
scale.set_value(int(self._config.get_config().get(option['section'], opt_name, fallback=option['value'])))
scale.set_digits(0)
scale.connect("button-release-event", self.scale_moved, option['section'], opt_name)
setting = {opt_name: scale}
dev.add(scale)
opt_array[opt_name] = {
"name": option['name'],
"row": dev
}
opts = sorted(list(opt_array), key=lambda x: opt_array[x]['name'])
pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos)
self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1)
self.labels[boxname].show_all()
return setting
def back(self):
if len(self.menu) > 1:
self.unload_menu()

View File

@ -64,73 +64,3 @@ class Panel(ScreenPanel):
self.unload_menu()
return True
return False
def add_option(self, boxname, opt_array, opt_name, option):
if option['type'] is None:
return
name = Gtk.Label(
hexpand=True, vexpand=True, halign=Gtk.Align.START, valign=Gtk.Align.CENTER,
wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR)
name.set_markup(f"<big><b>{option['name']}</b></big>")
labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
labels.add(name)
dev = Gtk.Box(spacing=5,
valign=Gtk.Align.CENTER, hexpand=True, vexpand=False)
dev.get_style_context().add_class("frame-item")
dev.add(labels)
if option['type'] == "binary":
switch = Gtk.Switch(active=self._config.get_config().getboolean(option['section'], opt_name))
switch.connect("notify::active", self.switch_config_option, option['section'], opt_name,
option['callback'] if "callback" in option else None)
dev.add(switch)
elif option['type'] == "dropdown":
dropdown = Gtk.ComboBoxText()
for i, opt in enumerate(option['options']):
dropdown.append(opt['value'], opt['name'])
if opt['value'] == self._config.get_config()[option['section']].get(opt_name, option['value']):
dropdown.set_active(i)
dropdown.connect("changed", self.on_dropdown_change, option['section'], opt_name,
option['callback'] if "callback" in option else None)
dropdown.set_entry_text_column(0)
dev.add(dropdown)
elif option['type'] == "scale":
dev.set_orientation(Gtk.Orientation.VERTICAL)
scale = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL,
min=option['range'][0], max=option['range'][1], step=option['step'])
scale.set_hexpand(True)
scale.set_value(int(self._config.get_config().get(option['section'], opt_name, fallback=option['value'])))
scale.set_digits(0)
scale.connect("button-release-event", self.scale_moved, option['section'], opt_name)
dev.add(scale)
elif option['type'] == "printer":
box = Gtk.Box(vexpand=False)
label = Gtk.Label(f"{option['moonraker_host']}:{option['moonraker_port']}")
box.add(label)
dev.add(box)
elif option['type'] == "menu":
open_menu = self._gtk.Button("settings", style="color3")
open_menu.connect("clicked", self.load_menu, option['menu'], option['name'])
open_menu.set_hexpand(False)
open_menu.set_halign(Gtk.Align.END)
dev.add(open_menu)
elif option['type'] == "lang":
select = self._gtk.Button("load", style="color3")
select.connect("clicked", self._screen.change_language, option['name'])
select.set_hexpand(False)
select.set_halign(Gtk.Align.END)
dev.add(select)
opt_array[opt_name] = {
"name": option['name'],
"row": dev
}
opts = sorted(list(opt_array), key=lambda x: opt_array[x]['name'])
pos = opts.index(opt_name)
self.labels[boxname].insert_row(pos)
self.labels[boxname].attach(opt_array[opt_name]['row'], 0, pos, 1, 1)
self.labels[boxname].show_all()