def __init__(self, layout: QtWidgets.QLayout, simulation: springModule, signal: QtCore.Signal): super().__init__(layout, signal) self.properties = { "end_time": QInputNumber(self.layout(), "Time", value=10), "h": QInputNumber(self.layout(), "Delta T", value=0.1), "plot_point": QInputChoice(self.layout(), "Plot Node", 0, [0], ["0"]), } self.initSignals() self.setTarget(simulation) signal.connect(self.setTarget)
def link(self, property_name: str, signal: QtCore.Signal = None, condition: callable = None, direct: bool = False): self.element = None self.direct = direct if direct: parts = property_name.split(".") s = self def get(): target = s.element for part in parts: target = getattr(target, part) return target def set(v): get() target = s.element for part in parts[:-1]: target = getattr(target, part) setattr(target, parts[-1], v) return [s.element] self.setLinkedProperty = set self.getLinkedProperty = get self.serializeLinkedProperty = lambda x: "." + property_name + " = %s" % x else: def set(v): elements = [] getattr(self.element, "set_" + property_name)(v) elements.append(self.element) for elm in self.element.figure.selection.targets: elm = elm.target if elm != self.element: try: getattr(elm, "set_" + property_name, None)(v) except TypeError as err: pass else: elements.append(elm) return elements self.setLinkedProperty = set # lambda text: getattr(self.element, "set_"+property_name)(text) self.getLinkedProperty = lambda: getattr(self.element, "get_" + property_name)() self.serializeLinkedProperty = lambda x: ".set_" + property_name + "(%s)" % x if condition is None: self.condition = lambda x: True else: self.condition = condition self.editingFinished.connect(self.updateLink) signal.connect(self.setTarget)
def link(self, property_name: str, signal: QtCore.Signal = None, condition: callable = None, direct: bool = False): self.element = None self.direct = direct if direct: parts = property_name.split(".") s = self def get(): target = s.element for part in parts: target = getattr(target, part) return target def set(v): get() target = s.element for part in parts[:-1]: target = getattr(target, part) setattr(target, parts[-1], v) return [s.element] self.setLinkedProperty = set self.getLinkedProperty = get self.serializeLinkedProperty = lambda x: "." + property_name + " = %s" % x else: def set(v): # special treatment for the xylabels, as they are not directly the target objects label_object = None if isinstance(self.element, Text) and isinstance(self.element.figure.selection.targets[0].target, Axes): for elm in self.element.figure.selection.targets: elm = elm.target if self.element == getattr(getattr(elm, f"get_xaxis")(), "get_label")(): label_object = "x" break if self.element == getattr(getattr(elm, f"get_yaxis")(), "get_label")(): label_object = "y" break elements = [] getattr(self.element, "set_" + property_name)(v) elements.append(self.element) for elm in self.element.figure.selection.targets: elm = elm.target # special treatment for the xylabels, as they are not directly the target objects if label_object is not None: elm = getattr(getattr(elm, f"get_{label_object}axis")(), "get_label")() if elm != self.element: try: getattr(elm, "set_" + property_name, None)(v) except TypeError as err: pass else: elements.append(elm) return elements self.setLinkedProperty = set # lambda text: getattr(self.element, "set_"+property_name)(text) self.getLinkedProperty = lambda: getattr(self.element, "get_" + property_name)() self.serializeLinkedProperty = lambda x: ".set_" + property_name + "(%s)" % x if condition is None: self.condition = lambda x: True else: self.condition = condition self.editingFinished.connect(self.updateLink) signal.connect(self.setTarget)