diff --git a/TermTk/TTkWidgets/button.py b/TermTk/TTkWidgets/button.py index 99071c19..f8f66cf8 100644 --- a/TermTk/TTkWidgets/button.py +++ b/TermTk/TTkWidgets/button.py @@ -113,7 +113,7 @@ class TTkButton(TTkWidget): } __slots__ = ( - '_text', '_border', '_pressed', '_keyPressed', + '_text', '_border', '_checkable', '_checked', # Signals 'clicked', 'toggled' @@ -127,7 +127,7 @@ class TTkButton(TTkWidget): else: self.setDefaultSize(kwargs, textWidth+2, len(self._text)) - TTkWidget.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) # Define Signals self.clicked = pyTTkSignal() self.toggled = pyTTkSignal(bool) @@ -135,8 +135,6 @@ class TTkButton(TTkWidget): self._checked = kwargs.get('checked', False ) self._checkable = kwargs.get('checkable', False ) - self._pressed = False - self._keyPressed = False if self._border: if 'minSize' not in kwargs: if 'minWidth' not in kwargs: @@ -218,13 +216,11 @@ class TTkButton(TTkWidget): def mousePressEvent(self, evt): # TTkLog.debug(f"{self._text} Test Mouse {evt}") - self._pressed = True self.update() return True def mouseReleaseEvent(self, evt): # TTkLog.debug(f"{self._text} Test Mouse {evt}") - self._pressed = False if self._checkable: self._checked = not self._checked self.toggled.emit(self._checked) @@ -235,17 +231,11 @@ class TTkButton(TTkWidget): def keyEvent(self, evt): if ( evt.type == TTkK.Character and evt.key==" " ) or \ ( evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Enter ): - self._keyPressed = True - self._pressed = True self.update() self.clicked.emit() return True return False - def mouseMoveEvent(self, evt) -> bool: - self.update() - return super().mouseMoveEvent(evt) - def paintEvent(self, canvas): if self.isEnabled() and self._checkable: if self._checked: diff --git a/TermTk/TTkWidgets/combobox.py b/TermTk/TTkWidgets/combobox.py index 54748f31..e1ad72ad 100644 --- a/TermTk/TTkWidgets/combobox.py +++ b/TermTk/TTkWidgets/combobox.py @@ -28,6 +28,7 @@ from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.string import TTkString +from TermTk.TTkCore.color import TTkColor from TermTk.TTkLayouts.gridlayout import TTkGridLayout from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.container import TTkContainer @@ -60,6 +61,16 @@ class TTkComboBox(TTkContainer): :param editable: This property holds whether the combo box can be edited by the user, defaults to False :type editable: bool, optional ''' + + classStyle = { + 'default': {'color': TTkColor.fg("#dddd88")+TTkColor.bg("#222222"), + 'borderColor':TTkColor.RST}, + 'disabled': {'color': TTkColor.fg('#888888'), + 'borderColor':TTkColor.fg('#888888')}, + 'focus': {'color': TTkColor.fg("#ffff88")+TTkColor.bg("#222222"), + 'borderColor': TTkColor.fg("#ffff00") + TTkColor.BOLD}, + } + __slots__ = ('_list', '_id', '_lineEdit', '_listw', '_editable', '_insertPolicy', '_textAlign', '_popupFrame', #signals 'currentIndexChanged', 'currentTextChanged', 'editTextChanged') @@ -154,15 +165,11 @@ class TTkComboBox(TTkContainer): self._lineEdit.setGeometry(1,0,w-4,h) def paintEvent(self, canvas): - if not self.isEnabled(): - borderColor = TTkCfg.theme.comboboxBorderColorDisabled - color = TTkCfg.theme.comboboxContentColorDisabled - elif self.hasFocus(): - borderColor = TTkCfg.theme.comboboxBorderColorFocus - color = TTkCfg.theme.comboboxContentColorFocus - else: - borderColor = TTkCfg.theme.comboboxBorderColor - color = TTkCfg.theme.comboboxContentColor + style = self.currentStyle() + + color = style['color'] + borderColor = style['borderColor'] + if self._id == -1: text = "- select -" else: diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index aea33696..961b3dad 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -38,20 +38,20 @@ from TermTk.TTkLayouts.layout import TTkLayout, TTkWidgetItem from TermTk.TTkCore.TTkTerm.inputmouse import TTkMouseEvent class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): - ''' Widget Layout sizes: + ''' Widget sizes: :: - Terminal area (i.e. XTerm) + Terminal area (i.e. XTerm) = TTk ┌─────────────────────────────────────────┐ │ │ │ TTkWidget width │ │ (x,y)┌─────────────────────────┐ │ - │ │ padt (Top Padding) │ │ - │ │ ┌───────────────┐ │ height │ - │ │padl│ Layout/child │padr│ │ - │ │ └───────────────┘ │ │ - │ │ padb (Bottom Pad.) │ │ + │ │ │ │ + │ │ │ height │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ └─────────────────────────┘ │ └─────────────────────────────────────────┘ @@ -70,11 +70,6 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): :param int height: the height of the widget, defaults to 0 :param [int,int] size: the size [width, height] of the widget (override the previously defined sizes), optional, default=[0,0] - :param int padding: the padding (top, bottom, left, right) of the widget, defaults to 0 - :param int paddingTop: the Top padding, override Top padding if already defined, optional, default=padding - :param int paddingBottom: the Bottom padding, override Bottom padding if already defined, optional, default=padding - :param int paddingLeft: the Left padding, override Left padding if already defined, optional, default=padding - :param int paddingRight: the Right padding, override Right padding if already defined, optional, default=padding :param int maxWidth: the maxWidth of the widget, optional, defaults to 0x10000 :param int maxHeight: the maxHeight of the widget, optional, defaults to 0x10000 :param [int,int] maxSize: the max [width,height] of the widget, optional @@ -90,8 +85,6 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): :param bool,optional visible: the visibility, optional, defaults to True :param bool,optional enabled: the ability to handle input events, optional, defaults to True - :param layout: the layout of this widget, optional, defaults to :class:`~TermTk.TTkLayouts.layout.TTkLayout` - :type layout: :mod:`TermTk.TTkLayouts` ''' classStyle = { @@ -116,12 +109,13 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): '_toolTip', '_widgetCursor', '_widgetCursorEnabled', '_widgetCursorType', #Signals - 'focusChanged', 'sizeChanged') + 'focusChanged', 'sizeChanged', 'currentStyleChanged') def __init__(self, *args, **kwargs): #Signals self.focusChanged = pyTTkSignal(bool) self.sizeChanged = pyTTkSignal(int,int) + self.currentStyleChanged = pyTTkSignal(dict) # self.sizeChanged.connect(self.resizeEvent) self._widgetCursor = (0,0) @@ -161,6 +155,7 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): self._widgetItem = TTkWidgetItem(widget=self) + self._currentStyle = TTkWidget.classStyle['default'] self.setStyle(self.classStyle) self._processStyleEvent(TTkWidget._S_DEFAULT) @@ -362,10 +357,10 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): w = self while w._parent and (w.focusPolicy() & TTkK.ParentFocus) == TTkK.ParentFocus: w = w._parent + self._processStyleEvent(TTkWidget._S_PRESSED) if w.focusPolicy() & TTkK.ClickFocus == TTkK.ClickFocus: w.setFocus() w.raiseWidget() - self._processStyleEvent(TTkWidget._S_PRESSED) if evt.tap == 2 and self.mouseDoubleClickEvent(evt): #self._pendingMouseRelease = True return True @@ -608,6 +603,12 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): def currentStyle(self): return self._currentStyle + def setCurrentStyle(self, style): + if style == self._currentStyle: return + self._currentStyle = style + self.currentStyleChanged.emit(style) + self.update() + def setStyle(self, style): if 'default' not in style: # find the closest subclass/parent holding the style @@ -624,40 +625,42 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): self._style = mergeStyle self._processStyleEvent(TTkWidget._S_DEFAULT) + def mergeStyle(self, style): + cs = None + for t in self._style: + if self._style[t] == self._currentStyle: + cs = t + if t in style: + self._style[t] = self._style[t] | style[t] + if cs: + self.setCurrentStyle(self._style[cs]) + def _processStyleEvent(self, evt=_S_DEFAULT): if not self._style: return False if not self._enabled and 'disabled' in self._style: - self._currentStyle = self._style['disabled'] - self.update() + self.setCurrentStyle(self._style['disabled']) return True - self._currentStyle = self._style['default'] if evt in (TTkWidget._S_DEFAULT, TTkWidget._S_NONE, TTkWidget._S_ACTIVE): if self.hasFocus() and 'focus' in self._style: - self._currentStyle = self._style['focus'] - self.update() + self.setCurrentStyle(self._style['focus']) return True elif 'default' in self._style: - self._currentStyle = self._style['default'] - self.update() + self.setCurrentStyle(self._style['default']) return True elif evt & TTkWidget._S_HOVER and 'hover' in self._style: - self._currentStyle = self._style['hover'] - self.update() + self.setCurrentStyle(self._style['hover']) return True elif evt & TTkWidget._S_PRESSED and 'clicked' in self._style: - self._currentStyle = self._style['clicked'] - self.update() + self.setCurrentStyle(self._style['clicked']) return True elif evt & TTkWidget._S_DISABLED and 'disabled' in self._style: - self._currentStyle = self._style['disabled'] - self.update() + self.setCurrentStyle(self._style['disabled']) return True if self.hasFocus() and 'focus' in self._style: - self._currentStyle = self._style['focus'] - self.update() + self.setCurrentStyle(self._style['focus']) return True return False diff --git a/demo/showcase/tab.py b/demo/showcase/tab.py index a3c53424..f042671b 100755 --- a/demo/showcase/tab.py +++ b/demo/showcase/tab.py @@ -57,17 +57,21 @@ def demoTab(root=None, border=True): def main(): parser = argparse.ArgumentParser() - parser.add_argument('-f', help='Full Screen', action='store_true') + parser.add_argument('-f', help='Full Screen (default)', action='store_true') + parser.add_argument('-w', help='Windowed', action='store_true') + parser.add_argument('-t', help='Track Mouse', action='store_true') args = parser.parse_args() + windowed = args.w + mouseTrack = args.t - root = ttk.TTk() - if args.f: + root = ttk.TTk(title="pyTermTk Tab Demo", mouseTrack=mouseTrack) + if windowed: + rootTab = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout()) + border=True + else: rootTab = root root.setLayout(ttk.TTkGridLayout()) border=False - else: - rootTab = ttk.TTkWindow(parent=root,pos=(1,1), size=(100,40), title="Test Tab", border=True, layout=ttk.TTkGridLayout()) - border=True demoTab(rootTab, border) root.mainloop()