Browse Source

Improved init typing

pull/278/head
Eugenio Parodi 1 year ago
parent
commit
de68b1adf1
  1. 2
      TermTk/TTkAbstract/abstractitemmodel.py
  2. 11
      TermTk/TTkAbstract/abstractscrollarea.py
  3. 9
      TermTk/TTkAbstract/abstractscrollview.py
  4. 16
      TermTk/TTkCore/canvas.py
  5. 30
      TermTk/TTkCore/color.py
  6. 8
      TermTk/TTkCore/signal.py
  7. 63
      TermTk/TTkCore/string.py
  8. 157
      TermTk/TTkGui/textcursor.py
  9. 20
      TermTk/TTkWidgets/Fancy/table.py
  10. 48
      TermTk/TTkWidgets/Fancy/tableview.py
  11. 14
      TermTk/TTkWidgets/TTkModelView/filetreewidgetitem.py
  12. 6
      TermTk/TTkWidgets/TTkModelView/treewidget.py
  13. 35
      TermTk/TTkWidgets/TTkModelView/treewidgetitem.py
  14. 18
      TermTk/TTkWidgets/scrollarea.py
  15. 14
      TermTk/TTkWidgets/spinbox.py
  16. 6
      TermTk/TTkWidgets/tabwidget.py
  17. 47
      TermTk/TTkWidgets/texedit.py
  18. 7
      TermTk/TTkWidgets/widget.py
  19. 14
      TermTk/TTkWidgets/window.py
  20. 8
      demo/showcase/layout_basic.py
  21. 4
      demo/showcase/windowsflags.py
  22. 6
      tests/pytest/test_002_textedit.py
  23. 2
      tests/t.generic/test.classes.001.slots.typing.py
  24. 1
      tools/check.import.sh

2
TermTk/TTkAbstract/abstractitemmodel.py

@ -30,5 +30,5 @@ class TTkAbstractItemModel():
# Signals
'dataChanged'
)
def __init__(self, *args, **kwargs):
def __init__(self) -> None:
self.dataChanged = pyTTkSignal()

11
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)

9
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

16
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))

30
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)

8
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

63
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:

157
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 = []

20
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

48
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)

14
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:

6
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)

35
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):

18
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)

14
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)

6
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)

47
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

7
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}")

14
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):

8
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)

4
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))

6
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():

2
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')

1
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 \

Loading…
Cancel
Save