2828from dataclasses import dataclass
2929from typing import List , Tuple , Optional , Any , Dict
3030
31- from TermTk .TTkCore .constant import TTkK
31+ from TermTk .TTkCore .constant import TTkK
3232from TermTk .TTkCore .helper import TTkHelper
3333from TermTk .TTkCore .log import TTkLog
3434from TermTk .TTkCore .cfg import TTkCfg
3535from TermTk .TTkCore .color import TTkColor
3636from TermTk .TTkCore .canvas import TTkCanvas
37- from TermTk .TTkCore .string import TTkString
37+ from TermTk .TTkCore .string import TTkString , TTkStringType
3838from TermTk .TTkCore .signal import pyTTkSlot , pyTTkSignal
3939from TermTk .TTkCore .TTkTerm .inputkey import TTkKeyEvent
4040from 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-
7671class _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
199208class _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
209218class _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
221234class _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
543553class _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):
551561class _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