Skip to content

Commit cae23b1

Browse files
chore: improve typing (#504)
1 parent bdfc130 commit cae23b1

24 files changed

Lines changed: 153 additions & 120 deletions

demo/demo.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
from showcase.dndtabs import demoDnDTabs
5555
from showcase.sigmask import demoSigmask
5656
from showcase.apptemplate import demoAppTemplate
57-
from showcase.datetime import demoDateTimePicker
57+
from showcase.date_time import demoDateTimePicker
5858

5959
def stupidPythonHighlighter(txt):
6060
def _colorize(regex, txt, color):
@@ -185,7 +185,7 @@ def demoShowcase(root=None, border=True):
185185
tabPickers.addTab(demoFilePicker(), " File Picker ", 'showcase/filepicker.py')
186186
tabPickers.addTab(demoColorPicker(), " Color Picker ", 'showcase/colorpicker.py')
187187
tabPickers.addTab(demoTextPicker(), " Text Picker ", 'showcase/textpicker.py')
188-
tabPickers.addTab(demoDateTimePicker(), " DateTime Picker ", 'showcase/datetime.py')
188+
tabPickers.addTab(demoDateTimePicker(), " DateTime Picker ", 'showcase/date_time.py')
189189
tabPickers.addMenu("sources", ttk.TTkK.RIGHT, tabPickers).menuButtonClicked.connect(lambda _menuButton : showSource(_menuButton.data().currentData()))
190190

191191
listMenu.addItem(f"Graphs")
@@ -243,7 +243,7 @@ def main():
243243

244244
root = ttk.TTk(title="pyTermTk Demo", mouseTrack=mouseTrack)
245245
if windowed:
246-
winTabbed1 = ttk.TTkWindow(parent=root,pos=(0,0), size=(120,40), title="pyTermTk Showcase", border=True, layout=ttk.TTkGridLayout(), flags=ttk.TTkK.NONE)
246+
winTabbed1 = ttk.TTkWindow(parent=root,pos=(0,0), size=(120,40), title="pyTermTk Showcase", border=True, layout=ttk.TTkGridLayout(), flags=ttk.TTkK.WindowFlag.NONE)
247247
border = True
248248
else:
249249
root.setLayout(ttk.TTkGridLayout())

demo/showcase/windowsflags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def demoWindowsFlags(root=None):
6969
flags = ttk.TTkK.WindowFlag.WindowMaximizeButtonHint | ttk.TTkK.WindowFlag.WindowCloseButtonHint)
7070
# Disable all the control buttons
7171
WindowFlagsTest(parent=frame, pos = (4,4), size=(40,8), title="Test Window 3",
72-
flags = ttk.TTkK.NONE)
72+
flags = ttk.TTkK.WindowFlag.NONE)
7373
# Enable only the Max and Min Buttons
7474
WindowFlagsTest(parent=frame, pos = (6,6), size=(40,8), title="Test Window 4",
7575
flags = ttk.TTkK.WindowFlag.WindowMinMaxButtonsHint)

libs/pyTermTk/TermTk/TTkCore/TTkTerm/inputkey.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
__all__ = ['TTkKeyEvent']
2424

25+
from typing import Union
26+
2527
from TermTk.TTkCore.constant import TTkK
2628

2729
class TTkKeyEvent:
@@ -60,7 +62,7 @@ class TTkKeyEvent:
6062
6163
'''
6264
__slots__ = ('type', 'key', 'code', 'mod')
63-
def __init__(self, type:int, key: str, code: str, mod: int):
65+
def __init__(self, type:int, key: Union[str,int], code: str, mod: int):
6466
self.type = type
6567
self.key = key
6668
self.mod = mod

libs/pyTermTk/TermTk/TTkCore/cfg.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@
1919
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2020
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
# SOFTWARE.
22+
from __future__ import annotations
2223

2324
__all__ = ['TTkCfg', 'TTkGlbl']
2425

25-
from TermTk.TTkCore.constant import TTkK
26+
from typing import TYPE_CHECKING, Optional
27+
if TYPE_CHECKING:
28+
from TermTk.TTkTheme.theme import TTkTheme
29+
2630
from TermTk import __version__
31+
from TermTk.TTkCore.constant import TTkK
2732

28-
class TTkCfg:
33+
class _TTkCfg:
2934
version:str = __version__
3035
name:str = "pyTermTk"
3136

@@ -36,8 +41,17 @@ class TTkCfg:
3641
doubleBuffer:bool = True
3742
doubleBufferNew:bool = False
3843

39-
scrollDelta:bool = 5
40-
theme = None
44+
scrollDelta:int = 5
45+
46+
_theme:Optional[TTkTheme] = None
47+
@property
48+
def theme(self) -> TTkTheme:
49+
if not TTkCfg._theme:
50+
from TermTk.TTkTheme.theme import TTkTheme
51+
TTkCfg._theme = TTkTheme()
52+
return TTkCfg._theme
53+
54+
TTkCfg = _TTkCfg()
4155

4256
class TTkGlbl:
4357
term_w: int = 0

libs/pyTermTk/TermTk/TTkCore/constant.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ class LayoutItemTypes(int):
565565
LayoutItem = LayoutItemTypes.LayoutItem
566566
WidgetItem = LayoutItemTypes.WidgetItem
567567

568-
class WindowFlag(int):
568+
class WindowFlag(Flag):
569569
'''
570570
Those flags are used to enable customization of the window controls.
571571
@@ -576,6 +576,8 @@ class WindowFlag(int):
576576
WindowMinMaxButtonsHint
577577
WindowCloseButtonHint
578578
'''
579+
NONE = 0
580+
'''Empty flag'''
579581
# FramelessWindowHint = 0x00000800
580582
# ''' Produces a borderless window.'''
581583
# CustomizeWindowHint = 0x02000000
@@ -676,7 +678,7 @@ class KeyModifier(int):
676678
CTRL = KeyModifier.CTRL
677679
ALT = KeyModifier.ALT
678680

679-
class ShortcutContext(int):
681+
class ShortcutContext(IntEnum):
680682
'''
681683
For a :py:class:`TTkShortcut` event to occur,
682684
the shortcut's key sequence must be entered by the user in a context where the shortcut is active.

libs/pyTermTk/TermTk/TTkCore/shortcut.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,27 @@
2020
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
# SOFTWARE.
2222

23+
from __future__ import annotations
24+
2325
__all__ = ['TTkShortcut']
2426

27+
from typing import TYPE_CHECKING,Dict,List,Union,Optional
28+
2529
from TermTk.TTkCore.log import TTkLog
2630
from TermTk.TTkCore.constant import TTkK
2731
from TermTk.TTkCore.helper import TTkHelper
2832
from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal
2933
from TermTk.TTkCore.TTkTerm.inputkey import TTkKeyEvent
3034

31-
class TTkStandardKey():
35+
if TYPE_CHECKING:
36+
from TermTk.TTkWidgets.widget import TTkWidget
37+
38+
class _TTkStandardKey():
3239
pass
3340

34-
class TTkKeySequence():
41+
class _TTkKeySequence():
3542
__slots__ = ('_key')
3643
def __init__(self, key:int):
37-
self._key = key
3844
mod = (
3945
( TTkK.ControlModifier if key & TTkK.CTRL else 0 ) |
4046
( TTkK.AltModifier if key & TTkK.ALT else 0 ) |
@@ -47,27 +53,27 @@ def __init__(self, key:int):
4753
else:
4854
self._key = TTkKeyEvent(mod=mod, code="", type=TTkK.Character, key=chr(key) )
4955

50-
51-
5256
def __hash__(self) -> int:
5357
return self._key.__hash__()
5458

55-
def __eq__(self, __value: object) -> bool:
56-
pass
5759

5860
class TTkShortcut():
5961
'''TTkShortcut'''
60-
_shortcuts = {}
62+
_shortcuts:Dict[TTkKeyEvent,List[TTkShortcut]] = {}
6163
__slots__ = (
62-
'_key', '_parent', '_shortcutContext',
64+
'_parent', '_shortcutContext',
6365
# Signals
6466
'activated')
6567
def __init__(self,
66-
key:int, parent=None,
68+
key:Union[int,TTkKeyEvent], parent:Optional['TTkWidget']=None,
6769
shortcutContext: TTkK.ShortcutContext = TTkK.ShortcutContext.WindowShortcut):
6870
if type(key) == int:
69-
key = TTkKeySequence(key)._key
70-
self._key = key
71+
key = _TTkKeySequence(key)._key
72+
elif isinstance(key, TTkKeyEvent):
73+
key = key
74+
else:
75+
raise TypeError(f"{key=} is not int or TTkKeyEvent")
76+
7177
self._parent = parent
7278
self._shortcutContext = shortcutContext
7379
# Signals
@@ -77,24 +83,17 @@ def __init__(self,
7783
TTkShortcut._shortcuts[key].append(self)
7884

7985
@staticmethod
80-
def processKey(key, focusWidget):
81-
# TTkLog.debug(f"{str(key)=}")
82-
# for k in TTkShortcut._shortcuts:
83-
# TTkLog.debug(f"{str(k)=} - {key==k=}")
84-
if key in TTkShortcut._shortcuts:
85-
for sc in TTkShortcut._shortcuts[key]:
86-
# if sc._parent:
87-
# TTkLog.debug(f"{focusWidget=} {sc._parent=} {sc._parent._parent=}")
88-
# else:
89-
# TTkLog.debug(f"{focusWidget=} {sc._parent=}")
90-
if ( ( sc._shortcutContext == TTkK.WidgetShortcut
91-
and focusWidget == sc._parent )
92-
or ( sc._shortcutContext == TTkK.WidgetWithChildrenShortcut
93-
and ( focusWidget == sc._parent
94-
or TTkHelper.isParent(sc._parent,focusWidget) ) )
95-
or ( sc._shortcutContext == TTkK.WindowShortcut )
96-
or ( sc._shortcutContext == TTkK.ApplicationShortcut )):
97-
if sc.activated._connected_slots:
98-
sc.activated.emit()
99-
return True
86+
def processKey(key:TTkKeyEvent, focusWidget:'TTkWidget') -> bool:
87+
for sc in TTkShortcut._shortcuts.get(key,[]):
88+
if ( ( sc._shortcutContext == TTkK.WidgetShortcut
89+
and focusWidget == sc._parent )
90+
or ( sc._shortcutContext == TTkK.WidgetWithChildrenShortcut
91+
and sc._parent
92+
and ( focusWidget == sc._parent
93+
or TTkHelper.isParent(sc._parent,focusWidget) ) )
94+
or ( sc._shortcutContext == TTkK.WindowShortcut )
95+
or ( sc._shortcutContext == TTkK.ApplicationShortcut )):
96+
if sc.activated._connected_slots:
97+
sc.activated.emit()
98+
return True
10099
return False

libs/pyTermTk/TermTk/TTkCore/string.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ def __ne__(self, other): return self._text != other._text if issubclass(type(oth
179179
def __gt__(self, other): return self._text > other._text if issubclass(type(other),TTkString) else self._text > other
180180
def __ge__(self, other): return self._text >= other._text if issubclass(type(other),TTkString) else self._text >= other
181181

182-
def sameAs(self, other:TTkString) -> bool:
183-
if not issubclass(type(other),TTkString): return False
182+
def sameAs(self, other:TTkStringType) -> bool:
183+
if not isinstance(other,TTkString): return False
184184
return (
185185
self==other and
186186
len(self._colors) == len(other._colors) and
@@ -602,7 +602,7 @@ def findall(self, regexp, ignoreCase=False):
602602
def getIndexes(self, char):
603603
return [i for i,c in enumerate(self._text) if c==char]
604604

605-
def join(self, strings:Union[GeneratorType[TTkStringType,None,None],List[TTkStringType]]) -> TTkString:
605+
def join(self, strings:Union[GeneratorType[TTkStringType,None,None],List[TTkStringType],List[TTkString],List[str]]) -> TTkString:
606606
''' Join the input strings using the current as separator
607607
608608
:param strings: the list of strings to be joined
@@ -638,7 +638,7 @@ def _getWidthText(txt:str):
638638
sum(unicodedata.category(ch) in ('Me','Mn') for ch in txt) )
639639

640640
@staticmethod
641-
def _getLenTextWoZero(txt:str):
641+
def _getLenTextWoZero(txt:str) -> int:
642642
return ( len(txt) -
643643
sum(unicodedata.category(ch) in ('Me','Mn') for ch in txt) )
644644

libs/pyTermTk/TermTk/TTkCore/timer_pyodide.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,19 @@
2020
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
# SOFTWARE.
2222

23+
from __future__ import annotations
24+
2325
__all__ = ['TTkTimer']
2426

25-
from typing import Optional,Callable
27+
from typing import Optional,Callable,Dict
2628

2729
from TermTk.TTkCore.helper import TTkHelper
2830
from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal
2931

3032
import pyodideProxy
3133

3234
class TTkTimer():
33-
_timers = {}
35+
_timers:Dict[int,TTkTimer] = {}
3436
_uid = 0
3537

3638
__slots__ = (

libs/pyTermTk/TermTk/TTkCore/ttk.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class TTk(TTkContainer):
119119

120120
_timer:TTkTimer
121121
_exceptions:List[Exception]
122+
_mouseCursor:Optional[_MouseCursor]
122123

123124
def __init__(self, *,
124125
title:str='TermTk',
@@ -223,7 +224,6 @@ def _mainloop(self) -> None:
223224
if self._showMouseCursor:
224225
self._mouseCursor = _MouseCursor()
225226
self._mouseCursor.updated.connect(self.update)
226-
self.paintChildCanvas = self._mouseCursorPaintChildCanvas
227227

228228
if platform.system() != 'Emscripten':
229229
TTkInput.start()
@@ -278,7 +278,7 @@ def _quit_timer(self) -> None:
278278
self._timer.quit()
279279
self._paintEvent.set()
280280

281-
def _mouseCursorPaintChildCanvas(self) -> None:
281+
def paintChildCanvas(self) -> None:
282282
super().paintChildCanvas()
283283
if self._mouseCursor:
284284
ch = self._mouseCursor._cursor

0 commit comments

Comments
 (0)