diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index a5bc75cd..c47dd258 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -333,7 +333,7 @@ class TTkCanvas: self, pos, size, labels, labelsPos, selected, offset, leftScroller, rightScroller, slim=False, menu=False, - color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST): + color=TTkColor.RST, borderColor=TTkColor.RST, selectColor=TTkColor.RST, offsetColor=TTkColor.RST): x,y = pos w,h = size tt = TTkCfg.theme.tab @@ -344,7 +344,7 @@ class TTkCanvas: else: bottomBar = tt[11]+tt[12]*(w-2)+tt[15] bottomPos = y+2 - self.drawText(pos=(x,bottomPos),text=bottomBar) + self.drawText(pos=(x,bottomPos),text=bottomBar, color=borderColor) # phase 1 - Draw From left to 'Selected' # phase 2 - Draw From right to 'Selected' def _drawTabSlim(x,y,a,b,c,d,e,txt,txtColor,borderColor): @@ -380,7 +380,7 @@ class TTkCanvas: i = offset text = labels[i] posx = labelsPos[i] - _drawTab(x+posx,y,tt[0],tt[1],tt[3],tt[9],tt[9],tt[13],tt[12],tt[13],tt[9],tt[9],tt[18],tt[19],tt[20], text, color, borderColor, slim) + _drawTab(x+posx,y,tt[0],tt[1],tt[3],tt[9],tt[9],tt[13],tt[12],tt[13],tt[9],tt[9],tt[18],tt[19],tt[20], text, offsetColor, borderColor, slim) # phase 4 - Draw left right tilt if leftScroller: top = tt[7]+tt[1] diff --git a/TermTk/TTkCore/ttk.py b/TermTk/TTkCore/ttk.py index 7fa3984b..97a470b6 100644 --- a/TermTk/TTkCore/ttk.py +++ b/TermTk/TTkCore/ttk.py @@ -119,38 +119,30 @@ class TTk(TTkWidget): x,y = TTkHelper.absPos(focusWidget) nmevt = mevt.clone(pos=(mevt.x-x, mevt.y-y)) focusWidget.mouseEvent(nmevt) - elif overlayWidget is not None: - x,y,w,h=overlayWidget.geometry() - if x <= mevt.x < x+w and y <= mevt.y < y+h: - px,py = TTkHelper.absPos(overlayWidget) - nmevt = mevt.clone(pos=(mevt.x-px, mevt.y-py)) - overlayWidget.mouseEvent(nmevt) - else: - self.mouseEvent(mevt) else: self.mouseEvent(mevt) elif evt is TTkK.KEY_EVENT: + keyHandled = False kevt = self.key_events.get() TTkLog.debug(f"Key: {kevt}") focusWidget = TTkHelper.getFocus() overlayWidget = TTkHelper.getOverlay() TTkLog.debug(f"{focusWidget}") - if kevt.key == TTkK.Key_Tab: - # TODO: Handle here if the widget accept the Tab input - if kevt.mod == TTkK.NoModifier: - TTkHelper.nextFocus(focusWidget if focusWidget else self) - if kevt.mod == TTkK.ShiftModifier: - TTkHelper.prevFocus(focusWidget if focusWidget else self) - continue if focusWidget is not None: TTkHelper.execShortcut(kevt.key,focusWidget) - focusWidget.keyEvent(kevt) - elif overlayWidget is not None: - TTkHelper.execShortcut(kevt.key,overlayWidget) - overlayWidget.keyEvent(kevt) + keyHandled = focusWidget.keyEvent(kevt) else: TTkHelper.execShortcut(kevt.key) - pass + # Handle Next Focus Key Binding + if not keyHandled and \ + ((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.NoModifier) or + ( kevt.key == TTkK.Key_Right )): + TTkHelper.nextFocus(focusWidget if focusWidget else self) + # Handle Prev Focus Key Binding + if not keyHandled and \ + ((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.ShiftModifier) or + ( kevt.key == TTkK.Key_Left )): + TTkHelper.prevFocus(focusWidget if focusWidget else self) elif evt is TTkK.TIME_EVENT: size = os.get_terminal_size() self.setGeometry(0,0,size.columns,size.lines) diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index 73f34690..75adbfae 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -222,7 +222,7 @@ class TTkTheme(): comboboxContentColor = TTkColor.fg("#dddd88")+TTkColor.bg("#111111") comboboxBorderColor = buttonBorderColor - comboboxContentColorFocus = TTkColor.fg("#dddd88")+TTkColor.bg("#111111") + comboboxContentColorFocus = TTkColor.fg("#ffff88")+TTkColor.bg("#111111") comboboxBorderColorFocus = buttonBorderColorFocus checkboxContentColor = buttonTextColor @@ -235,6 +235,11 @@ class TTkTheme(): radioButtonContentColorFocus = buttonTextColorFocus radioButtonBorderColorFocus = buttonBorderColorFocus - tabColor = TTkColor.fg("#aaaaaa") + tabColor = TTkColor.fg("#aaaaaa") + tabOffsetColor = TTkColor.RST tabBorderColor = frameBorderColor - tabSelectColor = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD \ No newline at end of file + tabSelectColor = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD + tabColorFocus = TTkColor.fg("#aaaaaa") + tabOffsetColorFocus = tabOffsetColor + tabBorderColorFocus = TTkColor.fg("#ffff88") + tabSelectColorFocus = TTkColor.fg("#ffff88")+TTkColor.bg("#000066")+TTkColor.BOLD diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index 39ff962b..b5a5d1a0 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -64,6 +64,7 @@ class TTkLineEdit(TTkWidget): if text != self._text: self.textChanged.emit(text) self._text = text + self._cursorPos = min(len(text)-1,self._cursorPos) self.update() def text(self): @@ -103,6 +104,9 @@ class TTkLineEdit(TTkWidget): def keyEvent(self, evt): w = self.width() if evt.type == TTkK.SpecialKey: + # Don't Handle the special tab key + if evt.key == TTkK.Key_Tab: + return False if evt.key == TTkK.Key_Up: pass elif evt.key == TTkK.Key_Down: pass elif evt.key == TTkK.Key_Left: @@ -153,6 +157,7 @@ class TTkLineEdit(TTkWidget): self._offset += 1 self._pushCursor() self.textEdited.emit(self._text) + return True def focusInEvent(self): self._pushCursor() diff --git a/TermTk/TTkWidgets/spinbox.py b/TermTk/TTkWidgets/spinbox.py index a1fd5882..cb3a399d 100644 --- a/TermTk/TTkWidgets/spinbox.py +++ b/TermTk/TTkWidgets/spinbox.py @@ -32,6 +32,7 @@ from TermTk.TTkLayouts import TTkGridLayout from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.lineedit import TTkLineEdit + class TTkSpinBox(TTkWidget): __slots__= ( '_lineEdit', '_value', '_maximum', '_minimum', @@ -53,7 +54,8 @@ class TTkSpinBox(TTkWidget): self._valueDelta = 0 self._draggable = False self._lineEdit = TTkLineEdit(parent=self, text=str(self._value), inputType=TTkK.Input_Number) - self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) + self._lineEdit.keyEvent = self.keyEvent + self.setFocusPolicy(TTkK.ClickFocus) self._lineEdit.textEdited.connect(self._textEdited) def value(self): @@ -71,6 +73,17 @@ class TTkSpinBox(TTkWidget): @pyTTkSlot(str) def _textEdited(self, text): self.setValue(int(text)) + self._lineEdit.setText(str(self._value)) + + def keyEvent(self, evt): + if evt.type == TTkK.SpecialKey: + if evt.key == TTkK.Key_Up: + self.setValue(self._value+1) + return True + elif evt.key == TTkK.Key_Down: + self.setValue(self._value-1) + return True + return TTkLineEdit.keyEvent(self._lineEdit, evt) def mousePressEvent(self, evt): x,y = evt.x, evt.y diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 1e4d9b98..772ba9c7 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -43,7 +43,8 @@ _labels= │◀│La│Label1║Label2║Label3│Label4│▶│ class TTkTabWidget(TTkFrame): __slots__ = ( '_viewport', - '_tabColor', '_tabBorderColor', '_tabSelectColor', + '_tabColor', '_tabBorderColor', '_tabSelectColor', '_tabOffsetColor', + '_tabColorFocus', '_tabBorderColorFocus', '_tabSelectColorFocus', '_tabOffsetColorFocus', '_tabWidgets', '_labels', '_labelsPos', '_offset', '_currentIndex', '_leftScroller', '_rightScroller', @@ -59,9 +60,14 @@ class TTkTabWidget(TTkFrame): self._tabClosable = False self._leftScroller = False self._rightScroller = False - self._tabColor = TTkCfg.theme.tabColor + self._tabColor = TTkCfg.theme.tabColor self._tabBorderColor = TTkCfg.theme.tabBorderColor self._tabSelectColor = TTkCfg.theme.tabSelectColor + self._tabOffsetColor = TTkCfg.theme.tabOffsetColor + self._tabColorFocus = TTkCfg.theme.tabColorFocus + self._tabBorderColorFocus = TTkCfg.theme.tabBorderColorFocus + self._tabSelectColorFocus = TTkCfg.theme.tabSelectColorFocus + self._tabOffsetColorFocus = TTkCfg.theme.tabOffsetColorFocus TTkFrame.__init__(self, *args, **kwargs) self._name = kwargs.get('name' , 'TTkTabWidget') self.setLayout(TTkGridLayout()) @@ -69,13 +75,11 @@ class TTkTabWidget(TTkFrame): self.layout().addWidget(self._viewport,0,0) #self.layout().addWidget(TTkSpacer(),0,1) #self.layout().addWidget(TTkSpacer(),1,0) - - if self.border(): self.setPadding(3,1,1,1) else: self.setPadding(2,0,0,0) - self.setFocusPolicy(TTkK.ClickFocus) + self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) def addTab(self, widget, label): @@ -165,13 +169,39 @@ class TTkTabWidget(TTkFrame): self._updateTabs() return True + def keyEvent(self, evt): + if evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Right: + self._offset = min(self._offset+1,len(self._labels)-1) + self._updateTabs() + return True + if evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Left: + self._offset = max(self._offset-1,0) + self._updateTabs() + return True + if ( evt.type == TTkK.Character and evt.key==" " ) or \ + ( evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Enter ): + self._currentIndex = self._offset + self._updateTabs() + return True + return False + def paintEvent(self): + if self.hasFocus(): + tabColor = self._tabColorFocus + tabBorderColor = self._tabBorderColorFocus + tabSelectColor = self._tabSelectColorFocus + tabOffsetColor = self._tabOffsetColorFocus + else: + tabColor = self._tabColor + tabBorderColor = self._tabBorderColor + tabSelectColor = self._tabSelectColor + tabOffsetColor = self._tabOffsetColor if self.border(): - self._canvas.drawBox(pos=(0,2),size=(self._width,self._height-2), color=self._borderColor, grid=9) + self._canvas.drawBox(pos=(0,2),size=(self._width,self._height-2), color=tabBorderColor, grid=9) self._canvas.drawTab( pos=(0,0), size=self.size(), slim=not self.border(), labels=self._labels, labelsPos=self._labelsPos, selected=self._currentIndex, offset=self._offset, leftScroller=self._leftScroller, rightScroller=self._rightScroller, - color=self._tabColor, borderColor=self._tabBorderColor, selectColor=self._tabSelectColor) + color=tabColor, borderColor=tabBorderColor, selectColor=tabSelectColor, offsetColor=tabOffsetColor)