From de68b1adf1ce8decf61cca39a1f149b284a546a7 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Sun, 3 Nov 2024 20:43:44 +0000 Subject: [PATCH] Improved init typing --- TermTk/TTkAbstract/abstractitemmodel.py | 2 +- TermTk/TTkAbstract/abstractscrollarea.py | 11 +- TermTk/TTkAbstract/abstractscrollview.py | 9 +- TermTk/TTkCore/canvas.py | 16 +- TermTk/TTkCore/color.py | 30 ++-- TermTk/TTkCore/signal.py | 8 +- TermTk/TTkCore/string.py | 63 +++---- TermTk/TTkGui/textcursor.py | 157 +++++++++--------- TermTk/TTkWidgets/Fancy/table.py | 20 ++- TermTk/TTkWidgets/Fancy/tableview.py | 48 ++++-- .../TTkModelView/filetreewidgetitem.py | 14 +- TermTk/TTkWidgets/TTkModelView/treewidget.py | 6 +- .../TTkWidgets/TTkModelView/treewidgetitem.py | 35 ++-- TermTk/TTkWidgets/scrollarea.py | 18 +- TermTk/TTkWidgets/spinbox.py | 14 +- TermTk/TTkWidgets/tabwidget.py | 6 +- TermTk/TTkWidgets/texedit.py | 47 ++++-- TermTk/TTkWidgets/widget.py | 7 +- TermTk/TTkWidgets/window.py | 14 +- demo/showcase/layout_basic.py | 8 +- demo/showcase/windowsflags.py | 4 +- tests/pytest/test_002_textedit.py | 6 +- .../test.classes.001.slots.typing.py | 2 +- tools/check.import.sh | 1 + 24 files changed, 317 insertions(+), 229 deletions(-) diff --git a/TermTk/TTkAbstract/abstractitemmodel.py b/TermTk/TTkAbstract/abstractitemmodel.py index b33f0907..23aa3085 100644 --- a/TermTk/TTkAbstract/abstractitemmodel.py +++ b/TermTk/TTkAbstract/abstractitemmodel.py @@ -30,5 +30,5 @@ class TTkAbstractItemModel(): # Signals 'dataChanged' ) - def __init__(self, *args, **kwargs): + def __init__(self) -> None: self.dataChanged = pyTTkSignal() diff --git a/TermTk/TTkAbstract/abstractscrollarea.py b/TermTk/TTkAbstract/abstractscrollarea.py index 3fa6129f..398d4857 100644 --- a/TermTk/TTkAbstract/abstractscrollarea.py +++ b/TermTk/TTkAbstract/abstractscrollarea.py @@ -38,15 +38,18 @@ class TTkAbstractScrollArea(TTkContainer): '_verticalScrollBar', '_verticalScrollBarPolicy', '_horizontalScrollBar', '_horizontalScrollBarPolicy',) - def __init__(self, *args, **kwargs): + def __init__(self, *, + verticalScrollBarPolicy:TTkK.ScrollBarPolicy=TTkK.ScrollBarPolicy.ScrollBarAsNeeded, + horizontalScrollBarPolicy:TTkK.ScrollBarPolicy=TTkK.ScrollBarPolicy.ScrollBarAsNeeded, + **kwargs) -> None: self._processing = False self._viewport = None # self.setLayout(TTkGridLayout()) self._verticalScrollBar = TTkScrollBar(orientation=TTkK.VERTICAL, visible=False) self._horizontalScrollBar = TTkScrollBar(orientation=TTkK.HORIZONTAL, visible=False) - self._verticalScrollBarPolicy = kwargs.get("verticalScrollBarPolicy", TTkK.ScrollBarAsNeeded) - self._horizontalScrollBarPolicy = kwargs.get("horizontalScrollBarPolicy",TTkK.ScrollBarAsNeeded) - super().__init__(*args, **kwargs) + self._verticalScrollBarPolicy = verticalScrollBarPolicy + self._horizontalScrollBarPolicy = horizontalScrollBarPolicy + super().__init__(**kwargs) self.layout().addWidget(self._verticalScrollBar) self.layout().addWidget(self._horizontalScrollBar) diff --git a/TermTk/TTkAbstract/abstractscrollview.py b/TermTk/TTkAbstract/abstractscrollview.py index 13a0c1c5..2389edcb 100644 --- a/TermTk/TTkAbstract/abstractscrollview.py +++ b/TermTk/TTkAbstract/abstractscrollview.py @@ -81,14 +81,15 @@ class TTkAbstractScrollView(TTkContainer, TTkAbstractScrollViewInterface): # Signals 'viewMovedTo', 'viewSizeChanged', 'viewChanged') - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs) -> None: # Signals self.viewMovedTo = pyTTkSignal(int, int) # x, y self.viewSizeChanged = pyTTkSignal(int, int) # w, h self.viewChanged = pyTTkSignal() self._viewOffsetX = 0 self._viewOffsetY = 0 - TTkContainer.__init__(self, *args, **kwargs) + # Do NOT use super() + TTkContainer.__init__(self, **kwargs) @pyTTkSlot(int, int) def viewMoveTo(self, x: int, y: int): @@ -161,7 +162,7 @@ class TTkAbstractScrollViewLayout(TTkLayout, TTkAbstractScrollViewInterface): # Signals 'viewMovedTo', 'viewSizeChanged', 'viewChanged', '_excludeEvent') - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: # Signals self.viewMovedTo = pyTTkSignal(int, int) # x, y self.viewSizeChanged = pyTTkSignal(int, int) # w, h @@ -222,7 +223,7 @@ class TTkAbstractScrollViewGridLayout(TTkGridLayout, TTkAbstractScrollViewInterf # Signals 'viewMovedTo', 'viewSizeChanged', 'viewChanged') - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: # Signals self.viewMovedTo = pyTTkSignal(int, int) # x, y self.viewSizeChanged = pyTTkSignal(int, int) # w, h diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index c2c5f562..2d2780ef 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -29,18 +29,22 @@ from TermTk.TTkCore.cfg import TTkCfg from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.string import TTkString -class TTkCanvas: +class TTkCanvas(): ''' Init the Canvas object - :param width: the width of the Canvas - :param height: the height of the Canvas + :param width: the width of the Canvas + :type width: int + :param height: the height of the Canvas + :type height: int ''' __slots__ = ( '_width', '_height', '_newWidth', '_newHeight', '_data', '_colors', '_bufferedData', '_bufferedColors', '_visible', '_transparent', '_doubleBuffer') - def __init__(self, *args, **kwargs): + def __init__(self, + width:int=0, + height:int=0) -> None: self._visible = True self._transparent = False self._doubleBuffer = False @@ -48,8 +52,8 @@ class TTkCanvas: self._height = 0 self._data = [[]] self._colors = [[]] - self._newWidth = kwargs.get('width', 0 ) - self._newHeight = kwargs.get('height', 0 ) + self._newWidth = width + self._newHeight = height self.updateSize() # self.resize(self._width, self._height) # TTkLog.debug((self._width, self._height)) diff --git a/TermTk/TTkCore/color.py b/TermTk/TTkCore/color.py index e66b8ff0..711df532 100644 --- a/TermTk/TTkCore/color.py +++ b/TermTk/TTkCore/color.py @@ -63,8 +63,14 @@ from TermTk.TTkCore.helper import TTkHelper class _TTkColor: __slots__ = ('_fg','_bg','_mod', '_colorMod', '_link', '_buffer', '_clean') - _fg: tuple; _bg: tuple; _mod: int - def __init__(self, fg:tuple=None, bg:tuple=None, mod:int=0, colorMod=None, link:str='', clean=False): + _fg: tuple[int]; _bg: tuple[int]; _mod: int + def __init__(self, + fg:tuple[int]=None, + bg:tuple[int]=None, + mod:int=0, + colorMod=None, + link:str='', + clean=False) -> None: self._fg = fg self._bg = bg self._mod = mod @@ -240,7 +246,7 @@ class _TTkColor: return ret return self - def modParam(self, *args, **kwargs): + def modParam(self, *args, **kwargs) -> None: if not self._colorMod: return self ret = self.copy() ret._colorMod.setParam(*args, **kwargs) @@ -262,8 +268,8 @@ class _TTkColor: return ret class _TTkColorModifier(): - def __init__(self, *args, **kwargs): pass - def setParam(self, *args, **kwargs): pass + def __init__(self, *args, **kwargs) -> None: pass + def setParam(self, *args, **kwargs) -> None: pass def copy(self): return self class TTkColorGradient(_TTkColorModifier): @@ -271,7 +277,7 @@ class TTkColorGradient(_TTkColorModifier): __slots__ = ('_fgincrement', '_bgincrement', '_val', '_step', '_buffer', '_orientation') _increment: int; _val: int - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) if "increment" in kwargs: self._fgincrement = kwargs.get("increment") @@ -284,7 +290,7 @@ class TTkColorGradient(_TTkColorModifier): self._step = 1 self._buffer = {} - def setParam(self, *args, **kwargs): + def setParam(self, *args, **kwargs) -> None: self._val = kwargs.get("val",0) self._step = kwargs.get("step",1) @@ -327,14 +333,14 @@ class TTkLinearGradient(_TTkColorModifier): default_target_color = _TTkColor(fg=(0,255,0), bg=(255,0,0)) - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self._base_pos = (0, 0) self._direction = (30, 30) self._target_color = self.default_target_color self.setParam(*args, **kwargs) - def setParam(self, *args, **kwargs): + def setParam(self, *args, **kwargs) -> None: self._base_pos = tuple(kwargs.get('base_pos', self._base_pos)) direct = tuple(kwargs.get('direction', self._direction)) self._direction = direct @@ -480,7 +486,7 @@ class TTkColor(_TTkColor): return TTkColor(fg=fg, bg=bg, mod=mod, clean=clean) @staticmethod - def fg(*args, **kwargs): + def fg(*args, **kwargs) -> None: ''' Helper to generate a Foreground color Example: @@ -507,7 +513,7 @@ class TTkColor(_TTkColor): return TTkColor(fg=TTkColor.hexToRGB(color), colorMod=mod, link=link) @staticmethod - def bg(*args, **kwargs): + def bg(*args, **kwargs) -> None: ''' Helper to generate a Background color Example: @@ -560,7 +566,7 @@ class TTkAlternateColor(_TTkColorModifier): '''TTkAlternateColor''' __slots__ = ('_alternateColor') - def __init__(self, alternateColor:TTkColor=TTkColor.RST, **kwargs): + def __init__(self, alternateColor:TTkColor=TTkColor.RST, **kwargs) -> None: super().__init__(**kwargs) self.setParam(alternateColor) diff --git a/TermTk/TTkCore/signal.py b/TermTk/TTkCore/signal.py index f569952d..25e0c42d 100644 --- a/TermTk/TTkCore/signal.py +++ b/TermTk/TTkCore/signal.py @@ -74,7 +74,7 @@ def pyTTkSlot(*args): class pyTTkSignal(): _signals = [] __slots__ = ('_types', '_connected_slots', '_mutex') - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: # ref: http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html#PyQt5.QtCore.pyqtSignal # PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]]) @@ -125,12 +125,12 @@ class pyTTkSignal(): if slot not in self._connected_slots: self._connected_slots[slot]=slice(nargs) - def disconnect(self, *args, **kwargs): + def disconnect(self, *args, **kwargs) -> None: for slot in args: if slot in self._connected_slots: del self._connected_slots[slot] - def emit(self, *args, **kwargs): + def emit(self, *args, **kwargs) -> None: if not self._mutex.acquire(False): return if len(args) != len(self._types): error = "func"+str(self._types)+" signal has "+str(len(self._types))+" argument(s) but "+str(len(args))+" provided" @@ -148,6 +148,6 @@ class pyTTkSignal(): s.clear() def forward(self): - def _ret(*args, **kwargs): + def _ret(*args, **kwargs) -> None: self.emit(*args, **kwargs) return _ret diff --git a/TermTk/TTkCore/string.py b/TermTk/TTkCore/string.py index 349e4c78..5801bec7 100644 --- a/TermTk/TTkCore/string.py +++ b/TermTk/TTkCore/string.py @@ -25,6 +25,7 @@ __all__ = ['TTkString'] import re import unicodedata from types import GeneratorType +from typing import Self,Any from TermTk.TTkCore.cfg import TTkCfg from TermTk.TTkCore.constant import TTkK @@ -63,7 +64,9 @@ class TTkString(): __slots__ = ('_text','_colors','_baseColor','_hasTab','_hasSpecialWidth') - def __init__(self, text:str="", color:TTkColor=None) -> None: + def __init__(self, + text:str="", + color:TTkColor=None) -> None: if issubclass(type(text), TTkString): self._text = text._text self._colors = text._colors if color is None else [color]*len(self._text) @@ -102,16 +105,16 @@ class TTkString(): colret += [color]*(len(text)-pos) return txtret, colret - def termWidth(self): + def termWidth(self) -> int: return self._hasSpecialWidth if self._hasSpecialWidth is not None else len(self) - def __len__(self): + def __len__(self) -> int: return len(self._text) - def __str__(self): + def __str__(self) -> str: return self._text - def __add__(self, other): + def __add__(self, other:Self) -> Self: ret = TTkString() ret._baseColor = self._baseColor if isinstance(other, TTkString): @@ -133,7 +136,7 @@ class TTkString(): ret._baseColor = other return ret - def __radd__(self, other): + def __radd__(self, other:Self) -> Self: ret = TTkString() ret._baseColor = self._baseColor if isinstance(other, TTkString): @@ -148,17 +151,17 @@ class TTkString(): ret._checkWidth() return ret - def __setitem__(self, index, value): + def __setitem__(self, index:int, value:Any): raise NotImplementedError() - def __getitem__(self, index): + def __getitem__(self, index:int): raise NotImplementedError() - def __int__(self): + def __int__(self) -> int: return int(self._text) - def __float__(self): + def __float__(self) -> float: return float(self._text) - def __complex__(self): + def __complex__(self) -> complex: return complex(self._text) # Operators @@ -169,40 +172,40 @@ class TTkString(): def __gt__(self, other): return self._text > other._text if issubclass(type(other),TTkString) else self._text > other def __ge__(self, other): return self._text >= other._text if issubclass(type(other),TTkString) else self._text >= other - def sameAs(self, other): + def sameAs(self, other:Self) -> bool: if not issubclass(type(other),TTkString): return False return ( self==other and len(self._colors) == len(other._colors) and all(s==o for s,o in zip(self._colors,other._colors)) ) - def isdigit(self): + def isdigit(self) -> bool: return self._text.isdigit() - def lstrip(self, ch): + def lstrip(self, ch:str) -> Self: ret = TTkString() ret._text = self._text.lstrip(ch) ret._colors = self._colors[-len(ret._text):] return ret - def charAt(self, pos): + def charAt(self, pos:int) -> str: return self._text[pos] - def setCharAt(self, pos, char): + def setCharAt(self, pos:int, char:str) -> Self: self._text = self._text[:pos]+char+self._text[pos+1:] self._checkWidth() return self - def colorAt(self, pos): + def colorAt(self, pos:int) -> TTkColor: if pos >= len(self._colors): return TTkColor() return self._colors[pos] - def setColorAt(self, pos, color): + def setColorAt(self, pos, color) -> Self: self._colors[pos] = color return self - def tab2spaces(self, tabSpaces=4): + def tab2spaces(self, tabSpaces=4) -> Self: '''Return the string representation with the tabs (converted in spaces) trimmed and aligned''' if not self._hasTab: return self ret = TTkString() @@ -220,7 +223,7 @@ class TTkString(): pos+=len(s)+1 return ret - def tabCharPos(self, pos, tabSpaces=4, alignTabRight=False): + def tabCharPos(self, pos, tabSpaces=4, alignTabRight=False) -> int: '''Return the char position in the string from the position in its representation with the tab and variable char sizes are solved i.e. @@ -316,7 +319,7 @@ class TTkString(): return out return out+str(TTkColor.RST) - def align(self, width=None, color=TTkColor.RST, alignment=TTkK.NONE): + def align(self, width=None, color=TTkColor.RST, alignment=TTkK.NONE) -> Self: ''' Align the string :param width: the new width @@ -378,7 +381,7 @@ class TTkString(): return ret - def extractShortcuts(self): + def extractShortcuts(self) -> Self: def _chGenerator(): for ch,color in zip(self._text,self._colors): yield ch,color @@ -395,7 +398,7 @@ class TTkString(): _newColors.append(color) return TTkString._importString1(_newText,_newColors), _ret - def replace(self, *args, **kwargs): + def replace(self, *args, **kwargs) -> Self: ''' **replace** (*old*, *new*, *count*) Replace "**old**" match with "**new**" string for "**count**" times @@ -443,7 +446,7 @@ class TTkString(): return ret - def completeColor(self, color, match=None, posFrom=None, posTo=None): + def completeColor(self, color, match=None, posFrom=None, posTo=None) -> Self: ''' Complete the color of the entire string or a slice of it The Fg and/or Bg of the string is replaced with the selected Fg/Bg color only if missing @@ -484,7 +487,7 @@ class TTkString(): return ret - def setColor(self, color, match=None, posFrom=None, posTo=None): + def setColor(self, color, match=None, posFrom=None, posTo=None) -> Self: ''' Set the color of the entire string or a slice of it If only the color is specified, the entire string is colorized @@ -520,7 +523,7 @@ class TTkString(): ret._colors += self._colors return ret - def substring(self, fr=None, to=None): + def substring(self, fr=None, to=None) -> Self: ''' Return the substring :param fr: the starting of the slice, defaults to 0 @@ -535,7 +538,7 @@ class TTkString(): ret._fastCheckWidth(self._hasSpecialWidth) return ret - def split(self, separator ): + def split(self, separator ) -> list[Self]: ''' Split the string using a separator .. note:: Only a one char separator is currently supported @@ -572,7 +575,7 @@ class TTkString(): ''' return re.search(regexp, self._text, re.IGNORECASE if ignoreCase else 0) - def find(self, *args, **kwargs): + def find(self, *args, **kwargs) -> None: return self._text.find(*args, **kwargs) def findall(self, regexp, ignoreCase=False): @@ -588,7 +591,7 @@ class TTkString(): def getIndexes(self, char): return [i for i,c in enumerate(self._text) if c==char] - def join(self, strings): + def join(self, strings:list[Self]) -> Self: ''' Join the input strings using the current as separator :param strings: the list of strings to be joined @@ -605,7 +608,7 @@ class TTkString(): # Unicode Zero/Half/Normal sized chars helpers: @staticmethod - def _isWideCharData(ch): + def _isWideCharData(ch:str): if len(ch) == 1: return unicodedata.east_asian_width(ch)=='W' if len(ch) > 1: diff --git a/TermTk/TTkGui/textcursor.py b/TermTk/TTkGui/textcursor.py index 44e338d5..dc090ff0 100644 --- a/TermTk/TTkGui/textcursor.py +++ b/TermTk/TTkGui/textcursor.py @@ -22,11 +22,59 @@ __all__ = ['TTkTextCursor'] +from typing import Self + from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.string import TTkString +from TermTk.TTkGui.textwrap1 import TTkTextWrap from TermTk.TTkGui.textdocument import TTkTextDocument + +class _CP(): + # The Cursor Position is based on the + # document data structure, where the + # the entire document is divided in lines + # instead of considering it a massive string + __slots__ = ('line','pos') + line:int + pos:int + def __init__(self, l:int=0, p:int=0) -> None: + self.set(l,p) + def copy(self) -> Self: + return _CP(self.line, self.pos) + def set(self, l, p) -> None: + self.pos = p + self.line = l + def toNum(self) -> int: + return self.pos | self.line << 16 + +class _Prop(): + __slots__ = ('anchor', 'position') + anchor:_CP + position:_CP + def __init__(self, anchor:_CP, position:_CP) -> None: + self.anchor:_CP = anchor + self.position:_CP = position + + def copy(self) -> Self: + return _Prop(self.anchor.copy(), self.position.copy()) + + def selectionStart(self) -> _CP: + if self.position.toNum() > self.anchor.toNum(): + return self.anchor + else: + return self.position + + def selectionEnd(self) -> _CP: + if self.position.toNum() >= self.anchor.toNum(): + return self.position + else: + return self.anchor + + def hasSelection(self) -> bool: + return not (self.position.line == self.anchor.line and self.position.pos == self.anchor.pos) + class TTkTextCursor(): class MoveMode(): MoveAnchor = 0x00 @@ -127,56 +175,14 @@ class TTkTextCursor(): NextRow = MoveOperation.NextRow PreviousRow = MoveOperation.PreviousRow - class _prop(): - __slots__ = ('anchor', 'position') - def __init__(self, anchor, position): - self.anchor = anchor - self.position = position - - def copy(self): - return TTkTextCursor._prop(self.anchor.copy(), self.position.copy()) - - def selectionStart(self): - if self.position.toNum() > self.anchor.toNum(): - return self.anchor - else: - return self.position - - def selectionEnd(self): - if self.position.toNum() >= self.anchor.toNum(): - return self.position - else: - return self.anchor - - def hasSelection(self): - return not (self.position.line == self.anchor.line and self.position.pos == self.anchor.pos) - - class _CP(): - # The Cursor Position is based on the - # document data structure, where the - # the entire document is divided in lines - # instead of considering it a massive string - __slots__ = ('line','pos') - def __init__(self, l=0, p=0): - self.set(l,p) - def copy(self): - return TTkTextCursor._CP(self.line, self.pos) - def set(self, l, p): - self.pos = p - self.line = l - def toNum(self): - return self.pos | self.line << 16 - __slots__ = ('_document', '_properties', '_cID', '_color', '_autoChanged') - def __init__(self, *args, **kwargs): + def __init__(self, document:TTkTextDocument=None) -> None: self._color = None self._cID = 0 self._autoChanged = False - self._properties = [TTkTextCursor._prop( - TTkTextCursor._CP(), - TTkTextCursor._CP())] - if 'document' in kwargs: - self._document = kwargs.get('document') + self._properties = [_Prop(_CP(),_CP())] + if document: + self._document = document self._document.contentsChanged.connect(self._documentContentChanged) def _documentContentChanged(self): @@ -184,7 +190,7 @@ class TTkTextCursor(): self.clearCursors() self.clearSelection() - def copy(self): + def copy(self) -> Self: ret = TTkTextCursor() ret._document = self._document ret._properties = [p.copy() for p in self._properties] @@ -193,7 +199,7 @@ class TTkTextCursor(): ret._autoChanged = self._autoChanged return ret - def restore(self, cursor): + def restore(self, cursor:Self) -> None: self._document = cursor._document self._properties = [p.copy() for p in cursor._properties] self._cID = cursor._cID @@ -201,36 +207,33 @@ class TTkTextCursor(): self._autoChanged = cursor._autoChanged self._document.cursorPositionChanged.emit(self) - def setColor(self, color): + def setColor(self, color:TTkColor) -> None: self._color = color - def clearColor(self): + def clearColor(self) -> None: self._color = None - def anchor(self): + def anchor(self) -> _CP: return self._properties[self._cID].anchor - def position(self): + def position(self) -> _CP: return self._properties[self._cID].position - def addCursor(self, line, pos): + def addCursor(self, line:int, pos:int) -> None: self._cID = 0 - self._properties.insert(0, - TTkTextCursor._prop( - TTkTextCursor._CP(line, pos), - TTkTextCursor._CP(line, pos))) + self._properties.insert(0, _Prop( _CP(line, pos), _CP(line, pos))) self._checkCursors(notify=True) - def clearCursors(self): + def clearCursors(self) -> None: p = self._properties[self._cID] self._cID = 0 self._properties = [p] - def clearSelection(self): + def clearSelection(self) -> None: for p in self._properties: p.anchor.line,p.anchor.pos = p.position.line,p.position.pos - def positionChar(self, cID=-1): + def positionChar(self, cID:int=-1) -> str: cID = self._cID if cID==-1 else cID p = self._properties[cID].position l = self._document._dataLines[p.line] @@ -241,7 +244,7 @@ class TTkTextCursor(): ch = ' ' return ch - def positionColor(self, cID=-1): + def positionColor(self, cID:int=-1) -> TTkColor: cID = self._cID if cID==-1 else cID p = self._properties[cID].position l = self._document._dataLines[p.line] @@ -252,16 +255,16 @@ class TTkTextCursor(): color = TTkColor() return color - def setPosition(self, line, pos, moveMode=MoveMode.MoveAnchor, cID=0): + def setPosition(self, line:int, pos:int, moveMode:MoveMode=MoveMode.MoveAnchor, cID:int=0) -> None: self._properties[cID].position.set(line,pos) if moveMode==TTkTextCursor.MoveAnchor: self._properties[cID].anchor.set(line,pos) self._document.cursorPositionChanged.emit(self) - def getLinesUnderCursor(self): + def getLinesUnderCursor(self) -> TTkString: return [ self._document._dataLines[p.position.line] for p in self._properties ] - def _checkCursors(self, notify=False): + def _checkCursors(self, notify:bool=False) -> None: currCurs = self._properties[self._cID] currPos = currCurs.position.toNum() # Sort the cursors based on the starting position @@ -289,7 +292,7 @@ class TTkTextCursor(): if notify or currPos != currCurs.position.toNum(): self._document.cursorPositionChanged.emit(self) - def movePosition(self, operation, moveMode=MoveMode.MoveAnchor, n=1, textWrap=None): + def movePosition(self, operation:MoveOperation, moveMode:MoveMode=MoveMode.MoveAnchor, n=1, textWrap:TTkTextWrap=None) -> None: currPos = self.position().toNum() def moveRight(cID,p,_): if p.pos < len(self._document._dataLines[p.line]): @@ -336,10 +339,10 @@ class TTkTextCursor(): self._checkCursors(notify=self.position().toNum()!=currPos) - def document(self): + def document(self) -> TTkTextDocument: return self._document - def replaceText(self, text, moveCursor=False): + def replaceText(self, text:TTkString, moveCursor:bool=False) -> None: # if there is no selection, just select the next n chars till the end of the line # the newline is not replaced for p in self._properties: @@ -354,7 +357,7 @@ class TTkTextCursor(): p.anchor.set(line,pos) return self.insertText(text, moveCursor) - def insertText(self, text, moveCursor=False): + def insertText(self, text:TTkString, moveCursor:bool=False) -> None: _lineFirst = -1 if self.hasSelection(): _lineFirst, _lineRem, _lineAdd = self._removeSelectedText() @@ -445,13 +448,13 @@ class TTkTextCursor(): self._autoChanged = False self._document.cursorPositionChanged.emit(self) - def selectionStart(self): + def selectionStart(self) -> _CP: return self._properties[self._cID].selectionStart() - def selectionEnd(self): + def selectionEnd(self) -> _CP: return self._properties[self._cID].selectionEnd() - def select(self, selection): + def select(self, selection:SelectionType) -> None: currPos = self.position().toNum() for p in self._properties: if selection == TTkTextCursor.SelectionType.Document: @@ -482,7 +485,7 @@ class TTkTextCursor(): p.anchor.pos = xFrom self._checkCursors(notify=self.position().toNum()!=currPos) - def selectedText(self): + def selectedText(self) -> TTkString: def _getText(p): _ret = [] selSt = p.selectionStart() @@ -498,13 +501,13 @@ class TTkTextCursor(): ret += _getText(p) return TTkString('\n').join(ret) - def hasSelection(self): + def hasSelection(self) -> bool: for p in self._properties: if p.hasSelection(): return True return False - def _removeSelectedText(self): + def _removeSelectedText(self) -> None: currPos = self.position().toNum() lineFirst = self._properties[0].selectionStart().line @@ -544,7 +547,7 @@ class TTkTextCursor(): return lineFirst, lineRem, lineAdd - def removeSelectedText(self): + def removeSelectedText(self) -> None: if not self.hasSelection(): return a,b,c = self._removeSelectedText() self._autoChanged = True @@ -553,7 +556,7 @@ class TTkTextCursor(): self._document.contentsChange.emit(a,b,c) self._autoChanged = False - def applyColor(self, color): + def applyColor(self, color:TTkColor) -> None: for p in self._properties: selSt = p.selectionStart() selEn = p.selectionEnd() @@ -568,7 +571,7 @@ class TTkTextCursor(): # self._document.contentsChange.emit(0,0,0) self._autoChanged = True - def getHighlightedLines(self, fr, to, color): + def getHighlightedLines(self, fr:int, to:int, color:TTkColor) -> list[TTkString]: # Create a list of cursors (filtering out the ones which # position/selection is outside the screen boundaries) sel = [] diff --git a/TermTk/TTkWidgets/Fancy/table.py b/TermTk/TTkWidgets/Fancy/table.py index e7992efd..c3dac170 100644 --- a/TermTk/TTkWidgets/Fancy/table.py +++ b/TermTk/TTkWidgets/Fancy/table.py @@ -23,6 +23,8 @@ __all__ = ['TTkFancyTable'] from TermTk.TTkCore.constant import TTkK +from TermTk.TTkCore.color import TTkColor +from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.Fancy.tableview import TTkFancyTableView from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea @@ -35,11 +37,19 @@ class TTkFancyTable(TTkAbstractScrollArea): - def __init__(self, *args, **kwargs): - TTkAbstractScrollArea.__init__(self, *args, **kwargs) - kwargs.pop('parent',None) - kwargs.pop('visible',None) - self._tableView = TTkFancyTableView(*args, **kwargs) + def __init__(self, *, + # TTkWidget init + parent:TTkWidget=None, + visible:bool=True, + # TTkFancyTableView init + columns:list[int]=None, + columnColors:list[TTkColor]=None, + selectColor:TTkColor=TTkColor.BOLD, + headerColor:TTkColor=TTkColor.BOLD, + showHeader:bool=True, + **kwargs) -> None: + super().__init__(parent=parent, visible=visible, **kwargs) + self._tableView = TTkFancyTableView(columns=columns, columnColors=columnColors, selectColor=selectColor, headerColor=headerColor, showHeader=showHeader, **kwargs) # Forward the signal self.activated = self._tableView.activated diff --git a/TermTk/TTkWidgets/Fancy/tableview.py b/TermTk/TTkWidgets/Fancy/tableview.py index a6902002..161ae195 100644 --- a/TermTk/TTkWidgets/Fancy/tableview.py +++ b/TermTk/TTkWidgets/Fancy/tableview.py @@ -32,12 +32,15 @@ from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView, TTkAbst class _TTkFancyTableViewHeader(TTkAbstractScrollView): __slots__ = ('_header', '_alignments', '_headerColor', '_columns') - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._columns = kwargs.get('columns' , [-1] ) + def __init__(self, *, + columns:list[int]=None, + headerColor:TTkColor=TTkColor.BOLD, + **kwargs) -> None: + super().__init__(**kwargs) + self._columns = columns if columns else [-1] self._header = [TTkString()]*len(self._columns) self._alignments = [TTkK.NONE]*len(self._columns) - self._headerColor = kwargs.get('headerColor' , TTkColor.BOLD ) + self._headerColor = headerColor self.setMaximumHeight(1) self.setMinimumHeight(1) @@ -100,22 +103,27 @@ class _TTkFancyTableView(TTkAbstractScrollView): '_tableWidth', # Signals 'activated', 'doubleClicked') - def __init__(self, *args, **kwargs): + def __init__(self, *, + columns:list[int]=None, + columnColors:list[TTkColor]=None, + selectColor:TTkColor=TTkColor.BOLD, + headerColor:TTkColor=TTkColor.BOLD, + **kwargs) -> None: self._tableDataId = [] self._tableDataText = [] self._tableDataWidget = [] self._shownWidgets = [] - super().__init__(*args, **kwargs) + super().__init__(**kwargs) # define signals self.activated = pyTTkSignal(int) # Value self.doubleClicked = pyTTkSignal(int) # Value self._tableWidth = 0 - self._columns = kwargs.get('columns' , [-1] ) + self._columns = columns if columns else [-1] self._alignments = [TTkK.NONE]*len(self._columns) - self._columnColors = kwargs.get('columnColors' , [TTkColor.RST]*len(self._columns) ) - self._selectColor = kwargs.get('selectColor' , TTkColor.BOLD ) - self._headerColor = kwargs.get('headerColor' , TTkColor.BOLD ) + self._columnColors = columnColors if columnColors else [TTkColor.RST]*len(self._columns) + self._selectColor = selectColor + self._headerColor = headerColor self._selected = -1 self.setFocusPolicy(TTkK.ClickFocus) self.viewChanged.connect(self._viewChangedHandler) @@ -373,14 +381,20 @@ class TTkFancyTableView(TTkAbstractScrollView): 'setHeader', 'setColumnColors', 'appendItem', 'itemAt', 'dataAt', 'indexOf', 'insertItem', 'removeItem', 'removeItemAt', 'removeItemsFrom', 'doubleClicked') - def __init__(self, **kwargs): + def __init__(self, *, + # _TTkFancyTableView init + columns:list[int]=None, + columnColors:list[TTkColor]=None, + selectColor:TTkColor=TTkColor.BOLD, + headerColor:TTkColor=TTkColor.BOLD, + # TTkFancyTableView init + showHeader:bool=True, + **kwargs) -> None: self._excludeEvent = False - super().__init__(**(kwargs|{'layout':TTkGridLayout()})) - kwargs.pop('parent',None) - kwargs.pop('visible',None) - self._showHeader = kwargs.get('showHeader', True) - self._tableView = _TTkFancyTableView(**kwargs) - self._header = _TTkFancyTableViewHeader(**kwargs) + super().__init__(**kwargs|{'layout':TTkGridLayout()}) + self._showHeader = showHeader + self._tableView = _TTkFancyTableView(columns=columns, columnColors=columnColors, selectColor=selectColor, headerColor=headerColor, **kwargs) + self._header = _TTkFancyTableViewHeader(columns=columns, headerColor=headerColor, **kwargs) self.layout().addWidget(self._header,0,0) self.layout().addWidget(self._tableView,1,0) self._tableView.viewChanged.connect(self._viewChanged) diff --git a/TermTk/TTkWidgets/TTkModelView/filetreewidgetitem.py b/TermTk/TTkWidgets/TTkModelView/filetreewidgetitem.py index f7ae1d79..ca334de2 100644 --- a/TermTk/TTkWidgets/TTkModelView/filetreewidgetitem.py +++ b/TermTk/TTkWidgets/TTkModelView/filetreewidgetitem.py @@ -32,11 +32,15 @@ class TTkFileTreeWidgetItem(TTkTreeWidgetItem): DIR = 0x01 __slots__ = ('_path', '_type', '_raw') - def __init__(self, *args, **kwargs): - TTkTreeWidgetItem.__init__(self, *args, **kwargs) - self._path = kwargs.get('path', '.') - self._type = kwargs.get('type', TTkFileTreeWidgetItem.FILE) - self._raw = kwargs.get('raw') + def __init__(self, *args, + path:str='.', + type:int=FILE, + raw:list=None, + **kwargs) -> None: + super().__init__(*args, **kwargs) + self._path = path + self._type = type + self._raw = raw self.setTextAlignment(1, TTkK.RIGHT_ALIGN) def setFilter(self, filter:str) -> None: diff --git a/TermTk/TTkWidgets/TTkModelView/treewidget.py b/TermTk/TTkWidgets/TTkModelView/treewidget.py index 46fca537..87c410e3 100644 --- a/TermTk/TTkWidgets/TTkModelView/treewidget.py +++ b/TermTk/TTkWidgets/TTkModelView/treewidget.py @@ -163,19 +163,19 @@ class TTkTreeWidget(TTkAbstractScrollView): self.itemExpanded = pyTTkSignal(TTkTreeWidgetItem) self.itemCollapsed = pyTTkSignal(TTkTreeWidgetItem) - super().__init__(**kwargs) self._selected = None self._selectedId = None self._separatorSelected = None - self._header = kwargs.get('header',[]) + self._header = header self._columnsPos = [] self._cache = [] self._sortingEnabled=sortingEnabled self._sortColumn = -1 self._sortOrder = TTkK.AscendingOrder + self._rootItem = TTkTreeWidgetItem(expanded=True) + super().__init__(**kwargs) self.setMinimumHeight(1) self.setFocusPolicy(TTkK.ClickFocus) - self._rootItem = TTkTreeWidgetItem(expanded=True) self.clear() self.setPadding(1,0,0,0) self.viewChanged.connect(self._viewChangedHandler) diff --git a/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py b/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py index 6aadd854..bed1bb59 100644 --- a/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py +++ b/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py @@ -22,6 +22,8 @@ __all__ = ['TTkTreeWidgetItem'] +from typing import Self + from TermTk.TTkCore.cfg import TTkCfg from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.string import TTkString @@ -39,35 +41,40 @@ class TTkTreeWidgetItem(TTkAbstractItemModel): 'heightChanged' ) - def __init__(self, *args, **kwargs): + def __init__(self, *args, + parent:Self=None, + expanded:bool=False, + selected:bool=False, + hidden:bool=False, + icon:TTkString=None, + childIndicatorPolicy:TTkK.ChildIndicatorPolicy =TTkK.ChildIndicatorPolicy.DontShowIndicatorWhenChildless, + **kwargs) -> None: # Signals # self.refreshData = pyTTkSignal(TTkTreeWidgetItem) self.heightChanged = pyTTkSignal(int) - super().__init__(*args, **kwargs) self._hasWidgets = False self._children = [] self._parentWidget = None self._height = 1 data = args[0] if len(args)>0 and type(args[0])==list else [TTkString()] # self._data = [i if issubclass(type(i), TTkString) else TTkString(i) if isinstance(i,str) else TTkString() for i in data] - self._data, self._widgets = self._processDataInput(data) - self._alignment = [TTkK.LEFT_ALIGN]*len(self._data) - self._parent = kwargs.get('parent', None) - self._childIndicatorPolicy = kwargs.get('childIndicatorPolicy', TTkK.DontShowIndicatorWhenChildless) - + self._parent = parent + self._childIndicatorPolicy = childIndicatorPolicy self._defaultIcon = True - self._expanded = kwargs.get('expanded', False) - self._selected = kwargs.get('selected', False) - self._hidden = kwargs.get('hidden', False) - self._parent = kwargs.get("parent", None) - + self._expanded = expanded + self._selected = selected + self._hidden = hidden self._sortColumn = -1 self._sortOrder = TTkK.AscendingOrder + super().__init__(**kwargs) + self._data, self._widgets = self._processDataInput(data) + self._alignment = [TTkK.LEFT_ALIGN]*len(self._data) + self._icon = ['']*len(self._data) self._setDefaultIcon() - if 'icon' in kwargs: - self._icon[0] = kwargs['icon'] + if icon: + self._icon[0] = icon self._defaultIcon = False def _processDataInputWidget(self, widget, index): diff --git a/TermTk/TTkWidgets/scrollarea.py b/TermTk/TTkWidgets/scrollarea.py index 6f33484a..4a3fba13 100644 --- a/TermTk/TTkWidgets/scrollarea.py +++ b/TermTk/TTkWidgets/scrollarea.py @@ -24,12 +24,13 @@ __all__ = ['TTkScrollArea'] from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.signal import pyTTkSlot +from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView class _TTkAreaWidget(TTkAbstractScrollView): __slots__ = () - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: TTkAbstractScrollView.__init__(self, *args, **kwargs) self.viewChanged.connect(self._viewChangedHandler) @@ -53,10 +54,15 @@ class _TTkAreaWidget(TTkAbstractScrollView): class TTkScrollArea(TTkAbstractScrollArea): '''TTkScrollArea''' __slots__ = ('_areaView') - def __init__(self, *args, **kwargs): - TTkAbstractScrollArea.__init__(self, *args, **kwargs) - kwargs.pop('parent',None) - kwargs.pop('visible',None) - self._areaView = _TTkAreaWidget(*args, **kwargs) + def __init__(self, *, + # TTkWidget init + parent:TTkWidget=None, + visible:bool=True, + # TTkAbstractScrollArea init + verticalScrollBarPolicy:TTkK.ScrollBarPolicy=TTkK.ScrollBarPolicy.ScrollBarAsNeeded, + horizontalScrollBarPolicy:TTkK.ScrollBarPolicy=TTkK.ScrollBarPolicy.ScrollBarAsNeeded, + **kwargs) -> None: + self._areaView = _TTkAreaWidget(**kwargs) + TTkAbstractScrollArea.__init__(self, parent=parent, visible=visible, verticalScrollBarPolicy=verticalScrollBarPolicy, horizontalScrollBarPolicy=horizontalScrollBarPolicy, **kwargs) self.setFocusPolicy(TTkK.ClickFocus) self.setViewport(self._areaView) \ No newline at end of file diff --git a/TermTk/TTkWidgets/spinbox.py b/TermTk/TTkWidgets/spinbox.py index 0a871a93..ceb33110 100644 --- a/TermTk/TTkWidgets/spinbox.py +++ b/TermTk/TTkWidgets/spinbox.py @@ -44,13 +44,17 @@ class TTkSpinBox(TTkContainer): '_mouseDelta', '_valueDelta', '_draggable', # Signals 'valueChanged') - def __init__(self, *args, **kwargs): + def __init__(self, *, + value:int=0, + minimum:int=0, + maximum:int=99, + **kwargs) -> None: # Signals self.valueChanged=pyTTkSignal(int) - super().__init__(*args, **kwargs) - self._value = kwargs.get("value",0) - self._maximum = kwargs.get("maximum",99) - self._minimum = kwargs.get("minimum",0) + super().__init__(**kwargs) + self._value = value + self._minimum = minimum + self._maximum = maximum self.setLayout(TTkGridLayout()) self.setPadding(0,0,0,2) self.setMinimumSize(4,1) diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 2b954c51..ce958ab2 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -573,13 +573,15 @@ class TTkTabWidget(TTkFrame): 'tabData', 'setTabData', 'currentData', 'currentIndex', 'setCurrentIndex', 'tabCloseRequested') - def __init__(self, **kwargs) -> None: + def __init__(self, *, + closable:bool=False, + **kwargs) -> None: self._tabWidgets = [] self._tabBarTopLayout = TTkGridLayout() super().__init__(forwardStyle=False, **kwargs) - self._tabBar = TTkTabBar(small = not self.border(), closable=kwargs.get('closable', False)) + self._tabBar = TTkTabBar(small = not self.border(), closable=closable) self._topLeftLayout = None self._topRightLayout = None self._tabBarTopLayout.addWidget(self._tabBar,0,1,3 if self.border() else 2,1) diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index cc8059e1..83b21ec3 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/TermTk/TTkWidgets/texedit.py @@ -35,6 +35,7 @@ from TermTk.TTkGui.clipboard import TTkClipboard from TermTk.TTkGui.textwrap1 import TTkTextWrap from TermTk.TTkGui.textcursor import TTkTextCursor from TermTk.TTkGui.textdocument import TTkTextDocument +from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkLayouts.gridlayout import TTkGridLayout from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView, TTkAbstractScrollViewGridLayout @@ -52,7 +53,7 @@ class _TTkTextEditViewLineNumber(TTkAbstractScrollView): } __slots__ = ('_textWrap','_startingNumber') - def __init__(self, startingNumber=0, **kwargs): + def __init__(self, startingNumber=0, **kwargs) -> None: self._startingNumber = startingNumber self._textWrap = None super().__init__(**kwargs) @@ -142,14 +143,18 @@ class TTkTextEditView(TTkAbstractScrollView): [ (line, (posFrom, posTo)), ... ] This is required to support the wrap feature ''' - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, *, + readOnly:bool=False, + multiLine:bool=True, + document:TTkTextDocument=None, + **kwargs) -> None: + super().__init__(**kwargs) self.currentColorChanged = pyTTkSignal(TTkColor) self.undoAvailable = pyTTkSignal(bool) self.redoAvailable = pyTTkSignal(bool) self.textChanged = pyTTkSignal() - self._readOnly = kwargs.get('readOnly', False) - self._multiLine = kwargs.get('multiLine', True) + self._readOnly = readOnly + self._multiLine = multiLine self._multiCursor = True self._hsize = 0 self._lastWrapUsed = 0 @@ -161,7 +166,7 @@ class TTkTextEditView(TTkAbstractScrollView): self._textWrap = None self._clipboard = TTkClipboard() self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) - self.setDocument(kwargs.get('document', TTkTextDocument())) + self.setDocument(document if document else TTkTextDocument()) self.disableWidgetCursor(self._readOnly) self._updateSize() self.viewChanged.connect(self._pushCursor) @@ -243,10 +248,10 @@ class TTkTextEditView(TTkAbstractScrollView): self._textWrap.wrapChanged.connect(self.update) # forward textWrap Methods - def wrapWidth(self, *args, **kwargs): return self._textWrap.wrapWidth(*args, **kwargs) - def setWrapWidth(self, *args, **kwargs): return self._textWrap.setWrapWidth(*args, **kwargs) - def wordWrapMode(self, *args, **kwargs): return self._textWrap.wordWrapMode(*args, **kwargs) - def setWordWrapMode(self, *args, **kwargs): return self._textWrap.setWordWrapMode(*args, **kwargs) + def wrapWidth(self, *args, **kwargs) -> None: return self._textWrap.wrapWidth(*args, **kwargs) + def setWrapWidth(self, *args, **kwargs) -> None: return self._textWrap.setWrapWidth(*args, **kwargs) + def wordWrapMode(self, *args, **kwargs) -> None: return self._textWrap.wordWrapMode(*args, **kwargs) + def setWordWrapMode(self, *args, **kwargs) -> None: return self._textWrap.setWordWrapMode(*args, **kwargs) def textCursor(self) -> TTkTextCursor: return self._textCursor @@ -811,11 +816,23 @@ class TTkTextEdit(TTkAbstractScrollArea): 'undoAvailable', 'redoAvailable', 'textChanged' ) - def __init__(self, textEditView=None, lineNumber=False, lineNumberStarting=0, **kwargs): - super().__init__(**kwargs) - kwargs.pop('parent', None) - kwargs.pop('visible', None) - self._textEditView = textEditView if textEditView else TTkTextEditView(**kwargs) + def __init__(self, *, + # TTkWidget init + parent:TTkWidget=None, + visible:bool=True, + + # TTkTextEditView init + readOnly:bool=False, + multiLine:bool=True, + document:TTkTextDocument=None, + + # TTkText init + textEditView:TTkTextEditView=None, + lineNumber:bool=False, + lineNumberStarting:int=0, + **kwargs) -> None: + super().__init__(parent=parent, visible=visible, **kwargs) + self._textEditView = textEditView if textEditView else TTkTextEditView(readOnly=readOnly, multiLine=multiLine, document=document) # self.setFocusPolicy(self._textEditView.focusPolicy()) # self._textEditView.setFocusPolicy(TTkK.ParentFocus) self._lineNumber = lineNumber diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 833d6f43..e0ebfa89 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -22,6 +22,8 @@ __all__ = ['TTkWidget'] +from typing import Self + from TermTk.TTkCore.cfg import TTkCfg, TTkGlbl from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog @@ -145,7 +147,7 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): 'focusChanged', 'sizeChanged', 'currentStyleChanged', 'closed') def __init__(self, - parent = None, + parent:Self = None, x:int=0, y:int=0, width:int=0, height:int=0, pos : tuple = None, @@ -162,8 +164,7 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): toolTip : TTkString = '', style : dict = None, addStyle : dict = None, - **kwargs - ): + **kwargs) -> None: if kwargs: TTkLog.warn(f"Unhandled init params {self.__class__.__name__} -> {kwargs}") diff --git a/TermTk/TTkWidgets/window.py b/TermTk/TTkWidgets/window.py index 739cc1ff..a36d4e0f 100644 --- a/TermTk/TTkWidgets/window.py +++ b/TermTk/TTkWidgets/window.py @@ -31,7 +31,7 @@ from TermTk.TTkWidgets.resizableframe import TTkResizableFrame class _MinimizedButton(TTkButton): __slots__ = ('_windowWidget') - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self._windowWidget = kwargs.get('windowWidget') def _cb(): @@ -64,15 +64,17 @@ class TTkWindow(TTkResizableFrame): '_btnClose', '_btnMax', '_btnMin', '_btnReduce', '_flags', '_winTopLayout', '_maxBk', '_redBk' ) - def __init__(self, *args, **kwargs): + def __init__(self, *, + flags:TTkK.WindowFlag=TTkK.WindowFlag.WindowCloseButtonHint, + **kwargs) -> None: self._winTopLayout = TTkGridLayout() - super().__init__(*args, **kwargs) self._flags = TTkK.NONE - self.setPadding(3,1,1,1) self._mouseDelta = (0,0) - self.setFocusPolicy(TTkK.ClickFocus) self._draggable = False self._menubarTopPosition = 2 + super().__init__(**kwargs) + self.setPadding(3,1,1,1) + self.setFocusPolicy(TTkK.ClickFocus) # Add the top Layout to keep the windows action buttons # self._winTopLayout = TTkGridLayout() @@ -100,7 +102,7 @@ class TTkWindow(TTkResizableFrame): self._winTopLayout.setGeometry(1,1,self.width()-2,1) self._winTopLayout.update() - self.setWindowFlag(kwargs.get('flags', TTkK.WindowFlag.WindowCloseButtonHint)) + self.setWindowFlag(flags) self.focusChanged.connect(self._focusChanged) def _maximize(self): diff --git a/demo/showcase/layout_basic.py b/demo/showcase/layout_basic.py index c6be6868..4f97de31 100755 --- a/demo/showcase/layout_basic.py +++ b/demo/showcase/layout_basic.py @@ -29,10 +29,10 @@ import TermTk as ttk def demoLayout(root=None): - rightframe = ttk.TTkFrame(parent=root, border=True, title="V Box Layout", titleColor=ttk.TTkColor.BOLD+ttk.TTkColor.fg('#8888dd')) + rightframe = ttk.TTkFrame(parent=root, border=True, titleAlign=ttk.TTkK.Alignment.LEFT_ALIGN, title=ttk.TTkString("V Box Layout (Left Align)", ttk.TTkColor.BOLD+ttk.TTkColor.fg('#8888dd'))) rightframe.setLayout(ttk.TTkVBoxLayout()) - gridFrame = ttk.TTkFrame(parent=rightframe, border=True, title="Grid Layout", titleColor=ttk.TTkColor.fg('#88dd88')) + gridFrame = ttk.TTkFrame(parent=rightframe, border=True, title=ttk.TTkString("Grid Layout", ttk.TTkColor.fg('#88dd88'))) gridFrame.setLayout(ttk.TTkGridLayout()) ttk.TTkButton(parent=gridFrame, border=True, text="Button1") ttk.TTkButton(parent=gridFrame, border=True, text="Button2") @@ -50,9 +50,9 @@ def demoLayout(root=None): gridFrame.layout().addWidget(ttk.TTkFrame(border=True,title="Frame4"),5,1) - centerrightframe=ttk.TTkFrame(parent=rightframe, border=True, title="H Box Layout", titleColor=ttk.TTkColor.fg('#dd88dd')) + centerrightframe=ttk.TTkFrame(parent=rightframe, border=True, titleAlign=ttk.TTkK.Alignment.RIGHT_ALIGN, title=ttk.TTkString("H Box Layout (Right Align)", ttk.TTkColor.fg('#dd88dd'))) centerrightframe.setLayout(ttk.TTkHBoxLayout()) - ttk.TTkTestWidget(parent=rightframe, border=True, title="Test Widget", titleColor=ttk.TTkColor.fg('#dddddd')) + ttk.TTkTestWidget(parent=rightframe, border=True, title=ttk.TTkString("Test Widget", ttk.TTkColor.fg('#dddddd'))) smallframe = ttk.TTkFrame(parent=centerrightframe, border=True) diff --git a/demo/showcase/windowsflags.py b/demo/showcase/windowsflags.py index 68493aa8..684fa2b5 100755 --- a/demo/showcase/windowsflags.py +++ b/demo/showcase/windowsflags.py @@ -30,8 +30,8 @@ import TermTk as ttk # Testing Window with a checkbox to enable/disable any control button class WindowFlagsTest(ttk.TTkWindow): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, **kwargs): + super().__init__(**kwargs) rb = ttk.TTkCheckbox( parent=self, pos=(0,0), size=(20,1), text='Reduce Button', checked=bool(self.windowFlag()&ttk.TTkK.WindowFlag.WindowReduceButtonHint)) diff --git a/tests/pytest/test_002_textedit.py b/tests/pytest/test_002_textedit.py index 8a87df08..a60eef17 100755 --- a/tests/pytest/test_002_textedit.py +++ b/tests/pytest/test_002_textedit.py @@ -45,9 +45,9 @@ def _setCursor(cur, prop): cur._properties = [] for p in prop: cur._properties.append( - ttk.TTkTextCursor._prop( - ttk.TTkTextCursor._CP(p[0][0], p[0][1]), - ttk.TTkTextCursor._CP(p[1][0], p[1][1]))) + ttk.TTkGui.textcursor._Prop( + ttk.TTkGui.textcursor._CP(p[0][0], p[0][1]), + ttk.TTkGui.textcursor._CP(p[1][0], p[1][1]))) cur._checkCursors() def test_demo1(): diff --git a/tests/t.generic/test.classes.001.slots.typing.py b/tests/t.generic/test.classes.001.slots.typing.py index c3bd31b3..1d019022 100644 --- a/tests/t.generic/test.classes.001.slots.typing.py +++ b/tests/t.generic/test.classes.001.slots.typing.py @@ -38,7 +38,7 @@ class A(): def __str__(self) -> str: return f"A: {id(self)} -> {self.a=}, {self.b=}, {self.c}" - self.c=c + # self.c=c class B(): __slots__ = ('a','b','c') diff --git a/tools/check.import.sh b/tools/check.import.sh index 16f4a310..c9150e19 100755 --- a/tools/check.import.sh +++ b/tools/check.import.sh @@ -3,6 +3,7 @@ __check(){ grep -r -e "^import" -e "^from" TermTk | grep -v -e "from TermTk" -e "import TermTk" | + grep -v "from typing import" | grep -v "__init__.py:from \.[^ ]* *import" | grep -v -e "import re" -e "import os" -e "import datetime" | grep -v \