class SliderGroup(Group): def __init__(self, posSize, minValue, maxValue, value, callback): Group.__init__(self, posSize) self.slider = Slider( (2, 3, -55, 17), minValue=minValue, maxValue=maxValue, value=value, sizeStyle="regular", callback=self.sliderChanged) self.edit = EditText( (-40, 0, -0, 22), text=str(value), placeholder=str(value), callback=self.editChanged) self.callback = callback def sliderChanged(self, sender): self.edit.set(str(int(self.slider.get()))) self.callback(sender) def editChanged(self, sender): try: value = int(float(self.edit.get())) except ValueError: value = int(self.edit.getPlaceholder()) self.edit.set(value) self.slider.set(value) self.callback(sender)
class TextField(Group): indent = 90 def __init__(self, position, label, placeholder=""): super(TextField, self).__init__((position[0], position[1], position[2], 22)) self.label = TextBox((0, 3, self.indent - 10, 22), "{0}:".format(label), alignment="right") self.text = EditText((self.indent, 0, 500 - 40 - self.indent, 22), placeholder=placeholder) def set(self, *args): return self.text.set(*args) def get(self): return self.text.get()
class TextField(Group): indent = 90 def __init__(self, position, label, placeholder=""): super(TextField, self).__init__( (position[0], position[1], position[2], 22)) self.label = TextBox((0, 3, self.indent - 10, 22), "{0}:".format(label), alignment="right") self.text = EditText((self.indent, 0, 500 - 40 - self.indent, 22), placeholder=placeholder) def set(self, *args): return self.text.set(*args) def get(self): return self.text.get()
class SliderGroup(Group): def __init__(self, posSize, text, minValue, maxValue, value, callback): Group.__init__(self, posSize) self.text = TextBox((0, 0, -0, 20), text) self.slider = Slider((2, 20, -60, 17), minValue=minValue, maxValue=maxValue, value=value, sizeStyle="small", callback=self.sliderChanged) self.edit = EditText((-40, 15, -0, 22), text=str(value), placeholder=str(value), callback=self.editChanged) self.callback = callback def sliderChanged(self, sender): self.edit.set(str(int(self.slider.get()))) self.callback(sender) def editChanged(self, sender): try: value = int(float(self.edit.get())) except ValueError: value = int(self.edit.getPlaceholder()) self.edit.set(value) self.slider.set(value) def enable(self): self.text.enable(True) self.slider.enable(True) self.edit.enable(True) def disable(self): self.text.enable(False) self.slider.enable(False) self.edit.enable(False)
class SliderPlus(Group): _callback = weakrefCallbackProperty() def __init__(self, posSize, label, minValue, value, maxValue, continuous=True, callback=None): super().__init__(posSize) self._callback = callback self.label = TextBox((0, 0, 0, 20), label) self.slider = Slider((0, 18, -60, 20), value=minValue, minValue=minValue, maxValue=maxValue, continuous=continuous, callback=self._sliderCallback) self.editField = EditText((-50, 16, 0, 24), "", continuous=False, callback=self._editFieldCallback) self.editField._nsObject.setAlignment_(AppKit.NSRightTextAlignment) self._setSliderFromValue(value) self._setEditFieldFromValue(value) def _breakCycles(self): self._callback = None super()._breakCycles() def _sliderCallback(self, sender): value = sender.get() self._setEditFieldFromValue(value) callCallback(self._callback, self) def _editFieldCallback(self, sender): value = sender.get() if not value: # self._setSliderFromValue(None) callCallback(self._callback, self) return value = value.replace(",", ".") try: f = float(value) except ValueError: pass else: self.slider.set(f) sliderValue = self.slider.get() if sliderValue != f: self._setEditFieldFromValue(sliderValue) callCallback(self._callback, self) def _setSliderFromValue(self, value): if isinstance(value, set): value = sum(value) / len(value) elif value is None: minValue = self.slider._nsObject.minValue() maxValue = self.slider._nsObject.maxValue() value = (minValue + maxValue) / 2 self.slider.set(value) def _setEditFieldFromValue(self, value): if isinstance(value, set): if len(value) == 1: value = next(iter(value)) else: value = None if value is None: s = "" else: if int(value) == value: s = str(int(value)) else: s = f"{value:.1f}" self.editField.set(s) def get(self): if not self.editField.get(): return None else: return self.slider.get() def set(self, value): self._setSliderFromValue(value) self._setEditFieldFromValue(value)