Use f-strings Avoid unnecessary casts to str()bool()int() Ensure file closure Merge nested ifs Simplify for-assigns-appends with comprehensions and internal functions Avoid shadowing internal function names Initialize variables Return value directly instead of assign then return Make some methods static
137 lines
5.0 KiB
Python
137 lines
5.0 KiB
Python
import gi
|
|
import logging
|
|
|
|
gi.require_version("Gtk", "3.0")
|
|
from gi.repository import Gtk, Pango
|
|
|
|
from ks_includes.screen_panel import ScreenPanel
|
|
|
|
|
|
def create_panel(*args):
|
|
return LimitsPanel(*args)
|
|
|
|
|
|
class LimitsPanel(ScreenPanel):
|
|
|
|
def __init__(self, screen, title, back=True, action_bar=True, printer_name=True):
|
|
super().__init__(screen, title, back, action_bar, printer_name)
|
|
self.limits = {}
|
|
self.grid = Gtk.Grid()
|
|
self.options = None
|
|
self.values = {}
|
|
|
|
def initialize(self, panel_name):
|
|
|
|
scroll = self._gtk.ScrolledWindow()
|
|
scroll.add(self.grid)
|
|
|
|
conf = self._printer.get_config_section("printer")
|
|
self.options = [
|
|
{"name": _("Max Acceleration"), "units": _("mm/s²"), "option": "max_accel",
|
|
"max": int(float(conf['max_accel']))},
|
|
{"name": _("Max Acceleration to Deceleration"), "units": _("mm/s²"), "option": "max_accel_to_decel",
|
|
"max": int(float(conf['max_accel_to_decel'])) if "max_accel_to_decel" in conf
|
|
else int(float(conf['max_accel']) / 2)},
|
|
{"name": _("Max Velocity"), "units": _("mm/s"), "option": "max_velocity",
|
|
"max": int(float(conf["max_velocity"]))},
|
|
{"name": _("Square Corner Velocity"), "units": _("mm/s"), "option": "square_corner_velocity",
|
|
"max": int(float(conf['square_corner_velocity'])) if "square_corner_velocity" in conf
|
|
else 5}
|
|
]
|
|
|
|
for opt in self.options:
|
|
self.add_option(opt['option'], opt['name'], opt['units'], opt['max'])
|
|
|
|
self.content.add(scroll)
|
|
self.content.show_all()
|
|
|
|
def process_update(self, action, data):
|
|
if action != "notify_status_update":
|
|
return
|
|
|
|
for opt in self.limits:
|
|
if "toolhead" in data and opt in data["toolhead"]:
|
|
self.update_option(opt, data["toolhead"][opt])
|
|
|
|
def update_option(self, option, value):
|
|
if option not in self.limits:
|
|
return
|
|
|
|
if self.limits[option]['scale'].has_grab():
|
|
return
|
|
|
|
self.values[option] = int(value)
|
|
self.limits[option]['scale'].disconnect_by_func(self.set_opt_value)
|
|
self.limits[option]['scale'].set_value(self.values[option])
|
|
for opt in self.options:
|
|
if opt["option"] == option:
|
|
if self.values[option] > opt["max"]:
|
|
self.limits[option]['scale'].get_style_context().add_class("option_slider_max")
|
|
else:
|
|
self.limits[option]['scale'].get_style_context().remove_class("option_slider_max")
|
|
self.limits[option]['scale'].connect("button-release-event", self.set_opt_value, option)
|
|
|
|
def add_option(self, option, optname, units, value):
|
|
logging.info(f"Adding option: {option}")
|
|
|
|
name = Gtk.Label()
|
|
name.set_markup(f"<big><b>{optname}</b></big> ({units})")
|
|
name.set_hexpand(True)
|
|
name.set_vexpand(True)
|
|
name.set_halign(Gtk.Align.START)
|
|
name.set_valign(Gtk.Align.CENTER)
|
|
name.set_line_wrap(True)
|
|
name.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
|
|
|
|
scale = Gtk.Scale.new_with_range(orientation=Gtk.Orientation.HORIZONTAL, min=0, max=value * 1.5, step=1)
|
|
scale.set_value(value)
|
|
scale.set_digits(0)
|
|
scale.set_hexpand(True)
|
|
scale.set_has_origin(True)
|
|
scale.get_style_context().add_class("option_slider")
|
|
scale.connect("button-release-event", self.set_opt_value, option)
|
|
self.values[option] = value
|
|
|
|
reset = self._gtk.ButtonImage("refresh", None, "color1")
|
|
reset.connect("clicked", self.reset_value, option)
|
|
reset.set_hexpand(False)
|
|
|
|
item = Gtk.Grid()
|
|
item.attach(name, 0, 0, 2, 1)
|
|
item.attach(scale, 0, 1, 1, 1)
|
|
item.attach(reset, 1, 1, 1, 1)
|
|
|
|
frame = Gtk.Frame()
|
|
frame.get_style_context().add_class("frame-item")
|
|
frame.add(item)
|
|
|
|
self.limits[option] = {
|
|
"row": frame,
|
|
"scale": scale,
|
|
}
|
|
|
|
limits = sorted(self.limits)
|
|
pos = limits.index(option)
|
|
|
|
self.grid.insert_row(pos)
|
|
self.grid.attach(self.limits[option]['row'], 0, pos, 1, 1)
|
|
self.grid.show_all()
|
|
|
|
def reset_value(self, widget, option):
|
|
for x in self.options:
|
|
if x["option"] == option:
|
|
self.update_option(option, x["max"])
|
|
self.set_opt_value(None, None, option)
|
|
|
|
def set_opt_value(self, widget, event, opt):
|
|
value = self.limits[opt]['scale'].get_value()
|
|
|
|
if opt == "max_accel":
|
|
self._screen._ws.klippy.gcode_script(f"SET_VELOCITY_LIMIT ACCEL={value}")
|
|
elif opt == "max_accel_to_decel":
|
|
self._screen._ws.klippy.gcode_script(f"SET_VELOCITY_LIMIT ACCEL_TO_DECEL={value}")
|
|
elif opt == "max_velocity":
|
|
self._screen._ws.klippy.gcode_script(f"SET_VELOCITY_LIMIT VELOCITY={value}")
|
|
elif opt == "square_corner_velocity":
|
|
self._screen._ws.klippy.gcode_script(f"SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={value}")
|