Skip to content

Commit 5c4e3d3

Browse files
chore(tabwidget): default highlighted to the selected tab (#563)
1 parent f861681 commit 5c4e3d3

2 files changed

Lines changed: 75 additions & 83 deletions

File tree

libs/pyTermTk/TermTk/TTkWidgets/tabwidget.py

Lines changed: 70 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@
2828
from dataclasses import dataclass
2929
from typing import List, Tuple, Optional, Any, Dict
3030

31-
from TermTk.TTkCore.constant import TTkK
31+
from TermTk.TTkCore.constant import TTkK
3232
from TermTk.TTkCore.helper import TTkHelper
3333
from TermTk.TTkCore.log import TTkLog
3434
from TermTk.TTkCore.cfg import TTkCfg
3535
from TermTk.TTkCore.color import TTkColor
3636
from TermTk.TTkCore.canvas import TTkCanvas
37-
from TermTk.TTkCore.string import TTkString
37+
from TermTk.TTkCore.string import TTkString, TTkStringType
3838
from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal
3939
from TermTk.TTkCore.TTkTerm.inputkey import TTkKeyEvent
4040
from TermTk.TTkCore.TTkTerm.inputmouse import TTkMouseEvent
@@ -68,11 +68,6 @@ def offY(self) -> int:
6868
TTkBarType.DEFAULT_2:0,
6969
TTkBarType.NERD_1:0}.get(self,1)
7070

71-
class _TTkScrollerStatus(Enum):
72-
ACTIVE = 0x01
73-
HIGHLIGHTED = 0x02
74-
INACTIVE = 0x03
75-
7671
class _TTkTabStatus():
7772
__slots__ = (
7873
"statusUpdated", "currentChanged",
@@ -83,7 +78,7 @@ class _TTkTabStatus():
8378
tabBar:TTkTabBar
8479
tabButtons:List[TTkTabButton]
8580
barType:TTkBarType
86-
highlighted:int
81+
highlighted:Optional[int]
8782
currentIndex:int
8883

8984
def __init__(
@@ -95,30 +90,44 @@ def __init__(
9590
self.statusUpdated = pyTTkSignal()
9691
self.currentChanged = pyTTkSignal(int)
9792
self.tabButtons = []
98-
self.highlighted = -1
93+
self.highlighted = None
9994
self.currentIndex = -1
10095

10196
@pyTTkSlot()
102-
def _moveToTheLeft(self):
97+
def _moveToTheLeft(self) -> None:
10398
self._setCurrentIndex(self.currentIndex-1)
10499

105100
@pyTTkSlot()
106-
def _andMoveToTheRight(self):
101+
def _andMoveToTheRight(self) -> None:
107102
self._setCurrentIndex(self.currentIndex+1)
108103

109-
# @pyTTkSlot(TTkTabButton)
110-
def _setCurrentButton(self, button:TTkTabButton) -> None:
111-
'''setCurrentButton'''
112-
index = self.tabButtons.index(button)
113-
self._setCurrentIndex(index)
104+
@pyTTkSlot()
105+
def _highlightToTheRight(self) -> None:
106+
if self.highlighted is None:
107+
self.highlighted = self.currentIndex
108+
self.highlighted = min(self.highlighted+1,len(self.tabButtons)-1)
109+
self.statusUpdated.emit()
110+
111+
@pyTTkSlot()
112+
def _andHighlightToTheLeft(self) -> None:
113+
if self.highlighted is None:
114+
self.highlighted = self.currentIndex
115+
self.highlighted = max(self.highlighted-1,0)
116+
self.statusUpdated.emit()
117+
118+
# # @pyTTkSlot(TTkTabButton)
119+
# def _setCurrentButton(self, button:TTkTabButton) -> None:
120+
# '''setCurrentButton'''
121+
# index = self.tabButtons.index(button)
122+
# self._setCurrentIndex(index)
114123

115124
@pyTTkSlot(int)
116125
def _setCurrentIndex(self, index) -> None:
117126
'''setCurrentIndex'''
118127
if ( ( 0 <= index < len(self.tabButtons) ) and
119128
( self.currentIndex != index or
120129
self.highlighted != -1 ) ):
121-
self.highlighted = -1
130+
self.highlighted = None
122131
if (self.currentIndex != index):
123132
self.currentIndex = index
124133
self.currentChanged.emit(index)
@@ -127,7 +136,7 @@ def _setCurrentIndex(self, index) -> None:
127136
@pyTTkSlot(int)
128137
def _resetHighlighted(self) -> None:
129138
if self.highlighted != -1:
130-
self.highlighted = -1
139+
self.highlighted = None
131140
self.statusUpdated.emit()
132141

133142
def _insertButton(self, index:int, button:TTkTabButton) -> None:
@@ -144,7 +153,7 @@ def _popButton(self, index:int) -> Optional[TTkTabButton]:
144153
if 0 <= index < len(self.tabButtons):
145154
button = self.tabButtons.pop(index)
146155
self.statusUpdated.disconnect(button.update)
147-
self.highlighted = -1
156+
self.highlighted = None
148157
if self.currentIndex >= index:
149158
self.currentIndex -= 1
150159
self.currentChanged.emit(self.currentIndex)
@@ -198,7 +207,7 @@ def _popButton(self, index:int) -> Optional[TTkTabButton]:
198207

199208
class _TTkTabWidgetDragData():
200209
__slots__ = ('_tabButton', '_tabWidget')
201-
def __init__(self, b:TTkTabButton, tw:TTkTabWidget):
210+
def __init__(self, b:TTkTabButton, tw:TTkTabWidget) -> None:
202211
self._tabButton = b
203212
self._tabWidget = tw
204213
def tabButton(self) -> TTkTabButton:
@@ -208,19 +217,23 @@ def tabWidget(self) -> TTkTabWidget:
208217

209218
class _TTkNewTabWidgetDragData():
210219
__slots__ = ('_label', '_widget', '_closable', '_data')
211-
def __init__(self, label, widget:TTkWidget, data=None, closable:bool=False):
220+
def __init__(self, label: TTkString, widget: TTkWidget, data: Any = None, closable: bool = False) -> None:
212221
self._data = data
213222
self._label = label
214223
self._widget = widget
215224
self._closable = closable
216-
def data(self): return self._data
217-
def label(self): return self._label
218-
def widget(self): return self._widget
219-
def closable(self): return self._closable
225+
def data(self) -> Any:
226+
return self._data
227+
def label(self) -> TTkString:
228+
return self._label
229+
def widget(self) -> TTkWidget:
230+
return self._widget
231+
def closable(self) -> bool:
232+
return self._closable
220233

221234
class _TTkTabBarDragData():
222235
__slots__ = ('_tabButton','_tabBar')
223-
def __init__(self, b, tb):
236+
def __init__(self, b: TTkTabButton, tb: TTkTabBar) -> None:
224237
self._tabButton:TTkTabButton = b
225238
self._tabBar:TTkTabBar = tb
226239
def tabButton(self) -> TTkTabButton:
@@ -277,7 +290,7 @@ class TTkTabButton(_TTkTabColorButton):
277290
'''TTkTabButton'''
278291
__slots__ = (
279292
'_data','_sideEnd', '_buttonStatus', '_closable',
280-
'closeClicked', '_closeButtonPressed','_data', '_text')
293+
'closeClicked', '_closeButtonPressed', '_text')
281294

282295
def __init__(self, *,
283296
text:TTkString='',
@@ -294,7 +307,7 @@ def __init__(self, *,
294307
self._closeButtonPressed = False
295308
self._resetSize()
296309

297-
def _resetSize(self):
310+
def _resetSize(self) -> None:
298311
style = self.currentStyle()
299312
size = self.text().termWidth() + 2
300313
if self._closable:
@@ -311,23 +324,20 @@ def setText(self, text:TTkString) -> None:
311324
self._resetSize()
312325
self.update()
313326

314-
def data(self):
327+
def data(self) -> Any:
315328
return self._data
316329

317-
def setData(self, data):
330+
def setData(self, data: Any) -> None:
318331
self._data=data
319332

320-
def sideEnd(self):
321-
return self._sideEnd
322-
323-
def setSideEnd(self, sideEnd):
333+
def setSideEnd(self, sideEnd: int) -> None:
324334
self._sideEnd = sideEnd
325335
self.update()
326336

327-
def buttonStatus(self):
337+
def buttonStatus(self) -> TTkK.CheckState:
328338
return self._buttonStatus
329339

330-
def setButtonStatus(self, status):
340+
def setButtonStatus(self, status: TTkK.CheckState) -> None:
331341
self._buttonStatus = status
332342
self.update()
333343

@@ -378,7 +388,7 @@ def mouseDragEvent(self, evt:TTkMouseEvent) -> bool:
378388
return True
379389
return super().mouseDragEvent(evt)
380390

381-
def paintEvent(self, canvas):
391+
def paintEvent(self, canvas: TTkCanvas) -> None:
382392
style = self.currentStyle()
383393

384394
borderColor:TTkColor = style['borderColor']
@@ -541,7 +551,7 @@ def paintEvent(self, canvas):
541551
canvas.drawText(pos=(w-closeOff-1,offY), text=closeGlyph, color=textColor)
542552

543553
class _TTkTabMenuButton(TTkMenuBarButton):
544-
def paintEvent(self, canvas):
554+
def paintEvent(self, canvas: TTkCanvas) -> None:
545555
style = self.currentStyle()
546556
borderColor = style['borderColor']
547557
textColor = style['color']
@@ -551,34 +561,22 @@ def paintEvent(self, canvas):
551561
class _TTkTabScrollerButton(_TTkTabColorButton):
552562
classStyle = _tabStyle
553563
__slots__ = ('_side', '_sideEnd', '_scrollerStatus')
554-
_scrollerStatus:_TTkScrollerStatus
555564
def __init__(self, *,
556565
side:int=TTkK.LEFT,
557566
**kwargs) -> None:
558-
self._scrollerStatus = _TTkScrollerStatus.ACTIVE
559567
self._side = side
560568
self._sideEnd = side
561569
super().__init__(**kwargs)
562570
self.resize(2, self._tabStatus.barType.vSize())
563571
self.setMinimumSize(2, self._tabStatus.barType.vSize())
564572
self.setMaximumSize(2, self._tabStatus.barType.vSize())
565573

566-
def side(self):
567-
return self._side
568-
569-
def setSide(self, side):
570-
self._side = side
571-
self.update()
572-
573574
def setScrollerStatus(self, status) -> None:
574575
if status != self._scrollerStatus:
575576
self._scrollerStatus = status
576577
self.update()
577578

578-
def sideEnd(self):
579-
return self._sideEnd
580-
581-
def setSideEnd(self, sideEnd):
579+
def setSideEnd(self, sideEnd: int) -> None:
582580
self._sideEnd = sideEnd
583581
self.update()
584582

@@ -599,13 +597,13 @@ def paintEvent(self, canvas:TTkCanvas) -> None:
599597
borderColor = style['borderColor']
600598

601599
arrowColor:TTkColor = scrollerColors['default']
602-
if self._tabStatus.highlighted == -1:
600+
if self._tabStatus.highlighted is None:
603601
pass
604602
elif ( self._side == TTkK.LEFT and
605-
self._tabStatus.highlighted == 0 ):
603+
self._tabStatus.highlighted == 0 ):
606604
arrowColor = scrollerColors['inactive']
607605
elif ( self._side == TTkK.RIGHT and
608-
self._tabStatus.highlighted >= len(self._tabStatus.tabButtons)-1 ):
606+
self._tabStatus.highlighted >= len(self._tabStatus.tabButtons)-1 ):
609607
arrowColor = scrollerColors['inactive']
610608
else:
611609
arrowColor = scrollerColors['highlight']
@@ -715,17 +713,17 @@ def __init__(self, *,
715713
self._tabStatus.statusUpdated.connect(self._leftScroller.update)
716714
self._tabStatus.statusUpdated.connect(self._rightScroller.update)
717715

718-
def mergeStyle(self, style):
716+
def mergeStyle(self, style: Dict) -> None:
719717
super().mergeStyle(style)
720718
for t in self._tabStatus.tabButtons:
721719
t.mergeStyle(style)
722720
self._leftScroller.mergeStyle(style)
723721
self._rightScroller.mergeStyle(style)
724722

725-
def sideEnd(self):
723+
def sideEnd(self) -> int:
726724
return self._sideEnd
727725

728-
def setSideEnd(self, sideEnd):
726+
def setSideEnd(self, sideEnd: int) -> None:
729727
self._sideEnd = sideEnd
730728
self._rightScroller.setSideEnd(sideEnd&TTkK.RIGHT)
731729
self._leftScroller.setSideEnd(sideEnd&TTkK.LEFT)
@@ -745,7 +743,7 @@ def insertTab(self, index, label, data=None, closable=None) -> int:
745743
return index
746744

747745
@pyTTkSlot(TTkTabButton)
748-
def _tcbClickedHandler(self, btn:TTkTabButton):
746+
def _tcbClickedHandler(self, btn: TTkTabButton) -> None:
749747
index = self._tabStatus.tabButtons.index(btn)
750748
self.tabBarClicked.emit(index)
751749
self.setCurrentIndex(index)
@@ -760,46 +758,46 @@ def removeTab(self, index:int) -> None:
760758
self.layout().removeWidget(button)
761759
self._updateTabs()
762760

763-
def currentData(self):
761+
def currentData(self) -> Any:
764762
return self.tabData(self._tabStatus.currentIndex)
765763

766-
def tabButton(self, index):
764+
def tabButton(self, index: int) -> Optional[TTkTabButton]:
767765
'''tabButton'''
768766
if 0 <= index < len(self._tabStatus.tabButtons):
769767
return self._tabStatus.tabButtons[index]
770768
return None
771769

772-
def tabData(self, index):
770+
def tabData(self, index: int) -> Any:
773771
'''tabData'''
774772
if 0 <= index < len(self._tabStatus.tabButtons):
775773
return self._tabStatus.tabButtons[index].data()
776774
return None
777775

778-
def setTabData(self, index, data):
776+
def setTabData(self, index: int, data: Any) -> None:
779777
'''setTabData'''
780778
self._tabStatus.tabButtons[index].setData(data)
781779

782-
def tabsClosable(self):
780+
def tabsClosable(self) -> bool:
783781
'''tabsClosable'''
784782
return self._tabClosable
785783

786-
def setTabsClosable(self, closable):
784+
def setTabsClosable(self, closable: bool) -> None:
787785
'''setTabsClosable'''
788786
self._tabClosable = closable
789787

790-
def currentIndex(self):
788+
def currentIndex(self) -> int:
791789
'''currentIndex'''
792790
return self._tabStatus.currentIndex
793791

794792
@pyTTkSlot(int)
795-
def setCurrentIndex(self, index):
793+
def setCurrentIndex(self, index: int) -> None:
796794
'''setCurrentIndex'''
797795
self._tabStatus._setCurrentIndex(index)
798796

799-
def resizeEvent(self, w, h):
797+
def resizeEvent(self, w: int, h: int) -> None:
800798
self._updateTabs()
801799

802-
def _updateTabs(self):
800+
def _updateTabs(self) -> None:
803801
w = self.width()
804802
# Find the tabs used size max size
805803
maxLen = 0
@@ -860,17 +858,14 @@ def wheelEvent(self, evt:TTkMouseEvent) -> bool:
860858
def keyEvent(self, evt:TTkKeyEvent) -> bool:
861859
if evt.type == TTkK.SpecialKey:
862860
if evt.key == TTkK.Key_Right:
863-
self._tabStatus.highlighted = min(self._tabStatus.highlighted+1,len(self._tabStatus.tabButtons)-1)
864-
self._updateTabs()
861+
self._tabStatus._highlightToTheRight()
865862
return True
866863
elif evt.key == TTkK.Key_Left:
867-
self._tabStatus.highlighted = max(self._tabStatus.highlighted-1,0)
868-
self._updateTabs()
864+
self._tabStatus._andHighlightToTheLeft()
869865
return True
870866
if ( evt.type == TTkK.Character and evt.key==" " ) or \
871867
( evt.type == TTkK.SpecialKey and evt.key == TTkK.Key_Enter ):
872868
self._tabStatus._setCurrentIndex(self._tabStatus.highlighted)
873-
self._updateTabs()
874869
return True
875870
return False
876871

@@ -984,11 +979,11 @@ def __init__(self, *,
984979

985980
self.focusChanged.connect(self._focusChanged)
986981

987-
def _focusChanged(self, focus):
982+
def _focusChanged(self, focus: bool) -> None:
988983
if focus:
989984
self._tabStatus.tabBar.mergeStyle(_tabStyleFocussed)
990985
else:
991-
self._tabStatus.highlighted = -1
986+
self._tabStatus.highlighted = None
992987
self._tabStatus.tabBar.mergeStyle(_tabStyleNormal)
993988

994989
def count(self) -> int:

0 commit comments

Comments
 (0)