diff --git a/TermTk/TTkUiTools/properties/__init__.py b/TermTk/TTkUiTools/properties/__init__.py index 257d7529..afe9d1b9 100644 --- a/TermTk/TTkUiTools/properties/__init__.py +++ b/TermTk/TTkUiTools/properties/__init__.py @@ -16,7 +16,7 @@ from .resizableframe import TTkResizableFrameProperties # from .scrollarea import from .scrollbar import TTkScrollBarProperties # from .spacer import -# from .spinbox import +from .spinbox import TTkSpinBoxProperties from .splitter import TTkSplitterProperties # from .tabwidget import from .texedit import TTkTextEditProperties diff --git a/TermTk/TTkUiTools/properties/scrollbar.py b/TermTk/TTkUiTools/properties/scrollbar.py index 786440c6..43ae3fcc 100644 --- a/TermTk/TTkUiTools/properties/scrollbar.py +++ b/TermTk/TTkUiTools/properties/scrollbar.py @@ -37,5 +37,35 @@ TTkScrollBarProperties = { 'flags': { 'Horizontal' : TTkK.HORIZONTAL , 'Vertical' : TTkK.VERTICAL } } }, - },'signals' : {},'slots' : {} + 'Value' : { + 'init': {'name':'value', 'type':int } , + 'get': { 'cb':TTkScrollBar.value, 'type':int } , + 'set': { 'cb':TTkScrollBar.setValue, 'type':int } }, + 'Minimum' : { + 'init': {'name':'minimum', 'type':int } , + 'get': { 'cb':TTkScrollBar.minimum, 'type':int } , + 'set': { 'cb':TTkScrollBar.setMinimum, 'type':int } }, + 'Maximum' : { + 'init': {'name':'maximum', 'type':int } , + 'get': { 'cb':TTkScrollBar.maximum, 'type':int } , + 'set': { 'cb':TTkScrollBar.setMaximum, 'type':int } }, + 'Single Step' : { + 'init': {'name':'singleStep', 'type':int } , + 'get': { 'cb':TTkScrollBar.singleStep, 'type':int } , + 'set': { 'cb':TTkScrollBar.setSingleStep, 'type':int } }, + 'Page Step' : { + 'init': {'name':'pageStep', 'type':int } , + 'get': { 'cb':TTkScrollBar.pageStep, 'type':int } , + 'set': { 'cb':TTkScrollBar.setPageStep, 'type':int } }, + },'signals' : { + 'valueChanged(int)' : {'name' : 'valueChanged', 'type': int }, + 'rangeChanged(int,int)' : {'name' : 'rangeChanged', 'type':(int,int)}, + 'sliderMoved(int)' : {'name' : 'sliderMoved' , 'type': int }, + },'slots' : { + 'setValue(int)' : {'name' : 'setValue' , 'type': int }, + 'setSingleStep(int)' : {'name' : 'setSingleStep' , 'type': int }, + 'setPageStep(int)' : {'name' : 'setPageStep' , 'type': int }, + 'setRangeTo(int)' : {'name' : 'setRangeTo' , 'type': int }, + 'setRange(int,int)' : {'name' : 'setRange' , 'type':(int,int)}, + } } \ No newline at end of file diff --git a/TermTk/TTkUiTools/properties/spinbox.py b/TermTk/TTkUiTools/properties/spinbox.py index 4174956b..785fdb59 100644 --- a/TermTk/TTkUiTools/properties/spinbox.py +++ b/TermTk/TTkUiTools/properties/spinbox.py @@ -22,3 +22,27 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from TermTk.TTkWidgets.spinbox import TTkSpinBox + +TTkSpinBoxProperties = { + 'properties' : { + 'Value' : { + 'init': {'name':'value', 'type':int } , + 'get': { 'cb':TTkSpinBox.value, 'type':int } , + 'set': { 'cb':TTkSpinBox.setValue, 'type':int } }, + 'Minimum' : { + 'init': {'name':'minimum', 'type':int } , + 'get': { 'cb':TTkSpinBox.minimum, 'type':int } , + 'set': { 'cb':TTkSpinBox.setMinimum, 'type':int } }, + 'Maximum' : { + 'init': {'name':'maximum', 'type':int } , + 'get': { 'cb':TTkSpinBox.maximum, 'type':int } , + 'set': { 'cb':TTkSpinBox.setMaximum, 'type':int } }, + },'signals' : { + 'valueChanged(int)' : {'name' : 'valueChanged', 'type': int }, + },'slots' : { + 'setValue(int)' : {'name' : 'setValue' , 'type': int }, + 'setMinimum(int)' : {'name' : 'setMinimum' , 'type': int }, + 'setMaximum(int)' : {'name' : 'setMaximum' , 'type': int }, + } +} diff --git a/TermTk/TTkUiTools/uiproperties.py b/TermTk/TTkUiTools/uiproperties.py index 067e995a..74406453 100644 --- a/TermTk/TTkUiTools/uiproperties.py +++ b/TermTk/TTkUiTools/uiproperties.py @@ -36,6 +36,7 @@ TTkUiProperties = { TTkRadioButton.__name__: TTkRadioButtonProperties, TTkResizableFrame.__name__: TTkResizableFrameProperties, TTkScrollBar.__name__: TTkScrollBarProperties, + TTkSpinBox.__name__: TTkSpinBoxProperties, TTkSplitter.__name__: TTkSplitterProperties, TTkTextEdit.__name__: TTkTextEditProperties, TTkWidget.__name__: TTkWidgetProperties, diff --git a/TermTk/TTkWidgets/scrollbar.py b/TermTk/TTkWidgets/scrollbar.py index 82607ea7..63882376 100644 --- a/TermTk/TTkWidgets/scrollbar.py +++ b/TermTk/TTkWidgets/scrollbar.py @@ -35,7 +35,7 @@ class TTkScrollBar(TTkWidget): __slots__ = ( '_orientation', '_minimum', '_maximum', - '_singlestep', '_pagestep', + '_singleStep', '_pageStep', '_value', '_color', '_focusColor', '_draggable', '_mouseDelta', # Those Vars are required to handle the mouseclick @@ -64,8 +64,8 @@ class TTkScrollBar(TTkWidget): self.setMinimumSize(3,1) self._minimum = kwargs.get('minimum' , 0 ) self._maximum = kwargs.get('maximum' , 99 ) - self._singlestep = kwargs.get('singlestep' , 1 ) - self._pagestep = kwargs.get('pagestep' , 10 ) + self._singleStep = kwargs.get('singleStep' , 1 ) + self._pageStep = kwargs.get('pageStep' , 10 ) self._value = kwargs.get('value' , 0 ) self._color = kwargs.get('color', TTkColor.RST ) self._focusColor = kwargs.get('focusColor', TTkColor.fg('#cccc00') ) @@ -85,9 +85,9 @@ class TTkScrollBar(TTkWidget): |------------------| size = widt or height |----------------| size2 = widt or height - 2 (removed the ending arrows) |------------| workingSize = max - min - |----------------| drawingSize = max - min + pagestep - a---b slider = [a=value-min, b=a+pagestep] - |---| pagestep, asciiStep (step size in ascii) + |----------------| drawingSize = max - min + pageStep + a---b slider = [a=value-min, b=a+pageStep] + |---| pageStep, asciiStep (step size in ascii) ''' def paintEvent(self): @@ -97,16 +97,16 @@ class TTkScrollBar(TTkWidget): size=self._width if self.hasFocus(): - color = self.focusColor + color = self._focusColor else: - color = self.color + color = self._color if self._maximum == self._minimum: # Special case where no scroll is needed aa=0 bb=size-2 else: size2 = size-2 - asciiStep = size2 * self._pagestep // (self._maximum - self._minimum + self._pagestep) + asciiStep = size2 * self._pageStep // (self._maximum - self._minimum + self._pageStep) if asciiStep==0: asciiStep=1 # Force the slider to be at least one char wide asciiDrawingSize = size2 - asciiStep a = self._value - self._minimum @@ -122,10 +122,12 @@ class TTkScrollBar(TTkWidget): def wheelEvent(self, evt): if evt.evt == TTkK.WHEEL_Up: - self.value = self.value - self.pagestep + self._value -= self._pageStep else: - self.value = self.value + self.pagestep - self.sliderMoved.emit(self.value) + self._value += self._pageStep + self._value = max(self._minimum,min(self._maximum,self._value)) + self.sliderMoved.emit(self._value) + self.update() return True def mousePressEvent(self, evt): @@ -137,24 +139,21 @@ class TTkScrollBar(TTkWidget): mouse = evt.x if mouse == 0: # left/up arrow pressed - self.value = self.value - self.singlestep - self.update() + self._value = self._value - self._singleStep elif mouse == size-1: # right/down arrow pressed - self.value = self.value + self.singlestep - self.update() + self._value = self._value + self._singleStep elif self._screenPgDown[0] <= mouse < self._screenPgDown[1]: - self.value = self.value - self.pagestep - self.update() + self._value = self._value - self._pageStep elif self._screenPgUp[0] <= mouse < self._screenPgUp[1]: - self.value = self.value + self.pagestep - self.update() + self._value = self._value + self._pageStep elif self._screenScroller[0] <= mouse < self._screenScroller[1]: self._mouseDelta = mouse-self._screenScroller[0] self._draggable = True - self.update() else: return False - self.sliderMoved.emit(self.value) + self._value = max(self._minimum,min(self._maximum,self._value)) + self.sliderMoved.emit(self._value) + self.update() # TTkLog.debug(f"m={mouse}, md:{self._mouseDelta}, d:{self._screenPgDown},u:{self._screenPgUp},s:{self._screenScroller}") return True @@ -173,9 +172,11 @@ class TTkScrollBar(TTkWidget): asciiDrawingSize = size2 - asciiStep a = aa * (self._maximum - self._minimum) // asciiDrawingSize - self.value = a + self._minimum - self.sliderMoved.emit(self.value) + self._value = a + self._minimum + self._value = max(self._minimum,min(self._maximum,self._value)) + self.sliderMoved.emit(self._value) + self.update() # TTkLog.debug(f"m={mouse}, md:{self._mouseDelta}, aa:{aa}") return True @@ -186,10 +187,25 @@ class TTkScrollBar(TTkWidget): def focusOutEvent(self): self.update() + def singleStep(self): + '''singleStep''' + return self._singleStep + + @pyTTkSlot(int) + def setSingleStep(self, v): + '''setSingleStep''' + self._singleStep = v + self.update() + + def pageStep(self): + '''pageStep''' + return self._pageStep + @pyTTkSlot(int) def setPageStep(self, pageStep): '''setPageStep''' - self._pagestep = pageStep + self._pageStep = pageStep + self.update() @pyTTkSlot(int) def setRangeTo(self, max): @@ -202,19 +218,14 @@ class TTkScrollBar(TTkWidget): if self._minimum == min and \ self._maximum == max : return - self.minimum = min - self.maximum = max + self._minimum = min + self._maximum = max self.rangeChanged.emit(min, max) - @pyTTkSlot(int) - def setValue(self, v): - '''setValue''' - self.value = v + def minimum(self): + return self._minimum - @property - def minimum(self): return self._minimum - @minimum.setter - def minimum(self, v): + def setMinimum(self, v): if v == self._minimum: return if v > self._maximum: @@ -222,10 +233,10 @@ class TTkScrollBar(TTkWidget): self._minimum = v self.update() - @property - def maximum(self): return self._maximum - @maximum.setter - def maximum(self, v): + def maximum(self): + return self._maximum + + def setMaximum(self, v): if v == self._maximum: return if v < self._minimum: @@ -233,43 +244,29 @@ class TTkScrollBar(TTkWidget): self._maximum = v self.update() - @property - def singlestep(self): return self._singlestep - @singlestep.setter - def singlestep(self, v): self._singlestep = v; self.update() - - @property - def pagestep(self): return self._pagestep - @pagestep.setter - def pagestep(self, v): self._pagestep = v; self.update() - - @property - def value(self): return self._value - @value.setter - def value(self, v): - if self._value == v: - return - if v > self._maximum: v = self._maximum - if v < self._minimum: v = self._minimum + def value(self): + return self._value + + @pyTTkSlot(int) + def setValue(self, v): + v = max(self._minimum,min(self._maximum,v)) if self._value == v: return self._value = v self.valueChanged.emit(v) self.update() - @property def color(self): return self._color - @color.setter - def color(self, color): - if self.color != color: + + def setColor(self, color): + if self._color != color: self._color = color self.update() - @property def focusColor(self): return self._focusColor - @focusColor.setter - def focusColor(self, color): - if self.focusColor != color: + + def setFocusColor(self, color): + if self._focusColor != color: self._focusColor = color self.update() diff --git a/TermTk/TTkWidgets/spinbox.py b/TermTk/TTkWidgets/spinbox.py index 9d037e39..73a574d9 100644 --- a/TermTk/TTkWidgets/spinbox.py +++ b/TermTk/TTkWidgets/spinbox.py @@ -70,6 +70,30 @@ class TTkSpinBox(TTkWidget): self._lineEdit.setText(str(self._value)) self.valueChanged.emit(value) + def minimum(self): + '''minimum''' + return self._minimum + + @pyTTkSlot(int) + def setMinimum(self, minimum): + '''setMinimum''' + if self._minimum == minimum: + return + self._minimum = minimum + self.setValue(self._value) + + def maximum(self): + '''maximum''' + return self._maximum + + @pyTTkSlot(int) + def setMaximum(self, maximum): + '''setMaximum''' + if self._maximum == maximum: + return + self._maximum = maximum + self.setValue(self._value) + @pyTTkSlot(str) def _textEdited(self, text): self.setValue(int(str(text))) diff --git a/ttkDesigner/app/propertyeditor.py b/ttkDesigner/app/propertyeditor.py index 4d3ee888..0b6ce72d 100644 --- a/ttkDesigner/app/propertyeditor.py +++ b/ttkDesigner/app/propertyeditor.py @@ -165,7 +165,7 @@ class PropertyEditor(ttk.TTkGridLayout): # Integer Fields def _processInt(name, prop): getval = prop['get']['cb'](domw) - value = ttk.TTkSpinBox(value=getval, height=1) + value = ttk.TTkSpinBox(value=getval, height=1, maximum=0x10000, minimum=-0x10000) value.valueChanged.connect(_bound(prop['set']['cb'],domw,lambda v:v)) return ttk.TTkTreeWidgetItem([name,value]) # String Fields diff --git a/ttkDesigner/app/signalsloteditor.py b/ttkDesigner/app/signalsloteditor.py index 954f5ee9..a12d6b0e 100644 --- a/ttkDesigner/app/signalsloteditor.py +++ b/ttkDesigner/app/signalsloteditor.py @@ -119,7 +119,7 @@ class _SignalSlotItem(ttk.TTkTreeWidgetItem): curSlot = str(self._slot.currentText()) filter = None for c in self._slotData: - if not curSlot in self._slotData[c]: continue + if not str(curSlot) in self._slotData[c]: continue filter = self._slotData[c][curSlot]['type'] break @@ -151,7 +151,7 @@ class _SignalSlotItem(ttk.TTkTreeWidgetItem): curSlot = self._slot.currentText() filter = 'ALL' for c in self._signalData: - if not curSignal in self._signalData[c]: continue + if not str(curSignal) in self._signalData[c]: continue filter = self._signalData[c][curSignal]['type'] break