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 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)
class ParameterSliderTextInput(Group): ''' Custom Vanilla object consisting mainly of a Slider & and text input linked together (through a parameter object) ''' def __init__(self, parameter, posSize, title=None, callback=None): super(ParameterSliderTextInput, self).__init__(posSize) self.parameter = parameter self.callback = callback editTextPosSize = (-65, 0, 40, 22) if title is None: sliderPosSize = (5, 3, -80, 15) elif title is not None: title = title.capitalize() sliderPosSize = (70, 3, -80, 15) self.title = TextBox((0, 3, 65, 30), title, sizeStyle='small') if parameter.dissociable: editTextPosSize = (-65, 0, 40, 22) self.checkBox = CheckBox((-22, 5, 22, 25), u'∞', callback=self.setFree, value=True, sizeStyle='mini') self.slider = Slider(sliderPosSize, minValue=parameter.limits[0], maxValue=parameter.limits[1], value=parameter.value, callback=self.valueInput, sizeStyle='small') self.textInput = EditText(editTextPosSize, str(parameter.value), callback=self.valueInput, continuous=False, sizeStyle='small') self.parameter.bind(self) def get(self): return self.parameter.get() def enable(self, b): self.slider.enable(b) self.textInput.enable(b) if hasattr(self, checkBox): self.checkBox.enable(b) def valueInput(self, sender): value = sender.get() parameter = self.parameter if value == 'R': parameter.reset() parameter.update() if self.callback is not None: self.callback(self) return elif value != '*': parameter.setInput(value, sender=sender) parameter.update() if self.callback is not None: self.callback(self) def update(self, sender): value = self.parameter.get() self.textInput.set(str(value)) if (value != '*'): self.slider.set(value) if hasattr(self, 'checkBox'): free = self.parameter.hasMaster self.checkBox.set(free) def setFree(self, sender): value = not bool(sender.get()) self.parameter.setFree(value)
class ParameterSliderTextInput(Group): ''' Custom Vanilla object consisting mainly of a Slider & and text input linked together (through a parameter object) ''' def __init__(self, parameter, posSize, title=None, callback=None): super(ParameterSliderTextInput, self).__init__(posSize) self.parameter = parameter self.callback = callback editTextPosSize = (-45, 0, 45, 22) if title is None: sliderPosSize = (5, 3, -80, 15) elif title is not None: if len(title) > 15: title = '{0}.'.format(title[:16]) title = title.capitalize() sliderPosSize = (120, 3, -55, 15) self.title = TextBox((0, 3, 115, 30), title, sizeStyle='small') if parameter.dissociable: editTextPosSize = (-65, 0, 40, 22) self.checkBox = CheckBox((-22, 5, 22, 25), u'∞', callback=self.setFree, value=True, sizeStyle='mini') self.slider = Slider(sliderPosSize, minValue=parameter.limits[0], maxValue=parameter.limits[1], value=parameter.value, callback=self.valueInput, sizeStyle='small') self.textInput = EditText(editTextPosSize, str(parameter.value), callback=self.valueInput, continuous=False, sizeStyle='small') self.parameter.bind(self) def get(self): return self.parameter.get() def enable(self, b): self.slider.enable(b) self.textInput.enable(b) if hasattr(self, checkBox): self.checkBox.enable(b) def valueInput(self, sender): value = sender.get() parameter = self.parameter if value == 'R': parameter.reset() parameter.update() if self.callback is not None: self.callback(self) return elif value != '*': parameter.setInput(value, sender=sender) parameter.update() if self.callback is not None: self.callback(self) def update(self, sender): value = self.parameter.get() self.textInput.set(str(value)) if (value != '*'): self.slider.set(value) if hasattr(self, 'checkBox'): free = self.parameter.hasMaster self.checkBox.set(free) def setFree(self, sender): value = not bool(sender.get()) self.parameter.setFree(value)
class ParameterSliderTextInput(Group): """ Custom Vanilla object consisting mainly of a Slider & and text input linked together (through a parameter object) """ def __init__(self, parameter, posSize, title=None, callback=None): super(ParameterSliderTextInput, self).__init__(posSize) self.parameter = parameter self.callback = callback editTextPosSize = (-65, 0, 40, 22) if title is None: sliderPosSize = (5, 3, -80, 15) elif title is not None: title = title.capitalize() sliderPosSize = (70, 3, -80, 15) self.title = TextBox((0, 3, 65, 30), title, sizeStyle="small") if parameter.dissociable: editTextPosSize = (-65, 0, 40, 22) self.checkBox = CheckBox((-22, 5, 22, 25), u"∞", callback=self.setFree, value=True, sizeStyle="mini") self.slider = Slider( sliderPosSize, minValue=parameter.limits[0], maxValue=parameter.limits[1], value=parameter.value, callback=self.valueInput, sizeStyle="small", ) self.textInput = EditText( editTextPosSize, str(parameter.value), callback=self.valueInput, continuous=False, sizeStyle="small" ) self.parameter.bind(self) def get(self): return self.parameter.get() def enable(self, b): self.slider.enable(b) self.textInput.enable(b) if hasattr(self, checkBox): self.checkBox.enable(b) def valueInput(self, sender): value = sender.get() parameter = self.parameter if value == "R": parameter.reset() parameter.update() if self.callback is not None: self.callback(self) return elif value != "*": parameter.setInput(value, sender=sender) parameter.update() if self.callback is not None: self.callback(self) def update(self, sender): value = self.parameter.get() self.textInput.set(str(value)) if value != "*": self.slider.set(value) if hasattr(self, "checkBox"): free = self.parameter.hasMaster self.checkBox.set(free) def setFree(self, sender): value = not bool(sender.get()) self.parameter.setFree(value)