Skip to content

Commit db386ca

Browse files
chore: improve typing (#572)
1 parent ebd13f9 commit db386ca

11 files changed

Lines changed: 160 additions & 54 deletions

File tree

libs/pyTermTk/TermTk/TTkCore/constant.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class ColorType(int):
6060
ColorModifier = 0x08
6161
'''The :py:class:`TTkColor` include a color modifier based on :py:class:`TTkColorModifier`'''
6262

63-
class FocusPolicy(int, Flag):
63+
class FocusPolicy(Flag):
6464
'''
6565
This Class type defines the various policies a widget
6666
can have with respect to acquiring keyboard focus.

libs/pyTermTk/TermTk/TTkWidgets/Fancy/tableview.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,8 @@ def viewMoveTo(self, x: int, y: int):
443443
self._viewOffsetY == y: # Nothong to do
444444
return
445445
self._excludeEvent = True
446-
for widget in self.layout().iterWidgets():
447-
widget.viewMoveTo(x,y)
446+
# for widget in self.layout().iterWidgets():
447+
# widget.viewMoveTo(x,y)
448448
self._excludeEvent = False
449449
self._viewOffsetX = x
450450
self._viewOffsetY = y

libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class TTkTable(TTkAbstractScrollArea):
3535
__doc__ = '''
3636
:py:class:`TTkTable` is a container widget which place :py:class:`TTkTableWidget` in a scrolling area with on-demand scroll bars.
3737
38-
''' + TTkTableWidget.__doc__
38+
''' + str(TTkTableWidget.__doc__)
3939

4040
classStyle = TTkTableWidget.classStyle
4141

@@ -216,18 +216,20 @@ def isUndoAvailable(self) -> bool:
216216
'''
217217
.. seealso:: this method is forwarded to :py:meth:`TTkTableWidget.isUndoAvailable`
218218
219-
isUndoAvailable
219+
Returns True if undo is available, False otherwise.
220220
221-
:return: bool
221+
:return: True if undo is available
222+
:rtype: bool
222223
'''
223224
return self._tableView.isUndoAvailable()
224225
def isRedoAvailable(self) -> bool:
225226
'''
226227
.. seealso:: this method is forwarded to :py:meth:`TTkTableWidget.isRedoAvailable`
227228
228-
isRedoAvailable
229+
Returns True if redo is available, False otherwise.
229230
230-
:return: bool
231+
:return: True if redo is available
232+
:rtype: bool
231233
'''
232234
return self._tableView.isRedoAvailable()
233235
@pyTTkSlot()

libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/table_edit_proxy.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ def items(self) -> List[Any]:
158158
def value(self) -> Any:
159159
return self._value
160160

161-
def serValue(self, val: Any) -> None:
161+
def setValue(self, val: Any) -> None:
162162
'''
163163
Set the value
164164
165165
:param val: The new value
166166
:type val: Any
167167
'''
168168
if val not in self._items:
169-
raise ValueError(f"{val} not included in {self._list}")
169+
raise ValueError(f"{val} not included in {self._items}")
170170
self._value = val
171171

172172
def factory(self, value:Any, items:List[Any]) -> TTkCellListTypeBase:
@@ -253,6 +253,12 @@ def proxyDispose(self) -> None:
253253
self.close()
254254

255255
def isModal(self) -> bool:
256+
'''
257+
Check if the editor should be displayed modally.
258+
259+
:return: True if the editor requires modal display, False otherwise
260+
:rtype: bool
261+
'''
256262
return False
257263

258264

@@ -323,7 +329,8 @@ def isModal(self) -> bool:
323329
def setFocus(self) -> None:
324330
''' Set focus to the internal list widget
325331
'''
326-
return self._list.viewport().setFocus()
332+
if (viewport := self._list.viewport()) and isinstance(viewport, TTkWidget):
333+
viewport.setFocus()
327334

328335
def keyEvent(self, evt:TTkKeyEvent) -> bool:
329336
return self._list.keyEvent(evt=evt)
@@ -343,15 +350,15 @@ def editWidgetFactory(data: Any) -> TTkTableProxyEditWidget:
343350
sb = _ListBaseProxy(items=data.items(), value=data)
344351
return sb
345352

346-
def getCellData(self) -> Union[float, int]:
353+
def getCellData(self) -> TTkCellListTypeBase:
347354
''' Get the current selected value from the list
348355
349356
:return: The selected item value
350357
:rtype: Union[float, int]
351358
'''
352-
self.dataChanged.emit(self._value.factory(
359+
return self._value.factory(
353360
value=self._list.selectedItems()[0].data(),
354-
items=self._items))
361+
items=self._items)
355362

356363
class _BoolListProxy(_ListBaseProxy):
357364
''' Boolean editor for table cells
@@ -385,7 +392,7 @@ def editWidgetFactory(data: Any) -> TTkTableProxyEditWidget:
385392
sb = _BoolListProxy(value=value, items=[True,False])
386393
return sb
387394

388-
def getCellData(self) -> Union[float, int]:
395+
def getCellData(self) -> Any:
389396
''' Get the current boolean value from the list
390397
391398
:return: The selected boolean value (True or False)

libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tablemodelcsv.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@
2424

2525
import csv
2626

27+
from typing import Tuple,List,Optional,cast
28+
2729
from TermTk.TTkCore.constant import TTkK
30+
from TermTk.TTkCore.string import TTkStringType
2831
from TermTk.TTkWidgets.TTkModelView.tablemodellist import TTkTableModelList
2932

3033
class TTkTableModelCSV(TTkTableModelList):
3134
'''
32-
:py:class:`TTkTableModelCSV` extends :py:class:`TTkTableModelList` with cvs loading helpers.
35+
:py:class:`TTkTableModelCSV` extends :py:class:`TTkTableModelList` with csv loading helpers.
3336
3437
You can address the csv file through the Filename (filename) or the FileDescriptor (fd).
3538
@@ -47,7 +50,7 @@ class TTkTableModelCSV(TTkTableModelList):
4750
'''
4851

4952
def __init__(self, *,
50-
filename:str=None,
53+
filename:Optional[str]=None,
5154
fd=None) -> None:
5255
'''
5356
:param filename: the csv filename, if missing the file descriptor is used instead.
@@ -56,16 +59,20 @@ def __init__(self, *,
5659
:param fd: the FileDescriptor
5760
:type fd: io, optional
5861
'''
59-
data, head, idx = [['']], [], []
62+
data:List[List[TTkStringType]] = [['']]
63+
head:List[TTkStringType] = []
64+
idx:List[TTkStringType] = []
6065
if filename:
6166
with open(filename, "r") as fd:
6267
data, head, idx = self._csvImport(fd)
6368
elif fd:
6469
data, head, idx = self._csvImport(fd)
6570
super().__init__(data=data,header=head,indexes=idx)
6671

67-
def _csvImport(self, fd) -> tuple[list,list,list[list]]:
68-
data, head, idx = [], [], []
72+
def _csvImport(self, fd) -> Tuple[List[List[TTkStringType]],List[TTkStringType],List[TTkStringType]]:
73+
data:List[List[TTkStringType]] = []
74+
head:List[TTkStringType] = []
75+
idx:List[TTkStringType] = []
6976
sniffer = csv.Sniffer()
7077
try:
7178
has_header = sniffer.has_header(fd.read(2048))
@@ -74,7 +81,7 @@ def _csvImport(self, fd) -> tuple[list,list,list[list]]:
7481
fd.seek(0)
7582
csvreader = csv.reader(fd)
7683
for row in csvreader:
77-
data.append(row)
84+
data.append(list(row))
7885
if has_header:
7986
head = data.pop(0)
8087
# check if the first column include an index:

libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tablemodellist.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222

2323
__all__=['TTkTableModelList']
2424

25-
from typing import Any
25+
from typing import Any,List,Optional
2626

27+
from TermTk.TTkCore.string import TTkString, TTkStringType
2728
from TermTk.TTkCore.constant import TTkK
2829
from TermTk.TTkAbstract.abstracttablemodel import TTkAbstractTableModel, TTkModelIndex
2930

3031
class _TTkModelIndexList(TTkModelIndex):
3132
__slots__ = ('_col','_rowId','_rowCb')
32-
def __init__(self, col:int, rowId:list, rowCb) -> None:
33+
def __init__(self, col:int, rowId:List, rowCb) -> None:
3334
self._col = col
3435
self._rowId = rowId
3536
self._rowCb = rowCb
@@ -50,35 +51,35 @@ def setData(self, data: object) -> None:
5051
class TTkTableModelList(TTkAbstractTableModel):
5152
'''
5253
:py:class:`TTkTableModelList` extends :py:class:`TTkAbstractTableModel`,
53-
including a basic model with a 2d list data structure
54+
including a basic model with a 2d List data structure
5455
5556
'''
5657

5758
__slots__ = ('_data','_dataOriginal', '_hheader', '_vheader')
5859

5960
def __init__(self, *,
60-
data:list[list[object]]=None,
61-
header:list[str]=None,
62-
indexes:list[str]=None) -> None:
61+
data:Optional[List[List[Any]]]=None,
62+
header:Optional[List[TTkStringType]]=None,
63+
indexes:Optional[List[TTkStringType]]=None) -> None:
6364
'''
6465
:param data: the 2D List model for the view to present.
65-
:type data: list[list]
66+
:type data: List[List]
6667
6768
:param header: the header labels, defaults to the column number.
68-
:type header: list[str], optional
69+
:type header: List[str], optional
6970
7071
:param indexes: the index labels, defaults to the line number.
71-
:type indexes: list[str], optional
72+
:type indexes: List[str], optional
7273
'''
7374
self._data = self._dataOriginal = data if data else []
7475
self._hheader = header if header else []
7576
self._vheader = indexes if indexes else []
7677
super().__init__()
7778

78-
def modelList(self) -> list[list]:
79+
def modelList(self) -> List[List]:
7980
return self._data
8081

81-
def setModelList(self, modelList:list[list]) -> None:
82+
def setModelList(self, modelList:List[List]) -> None:
8283
if modelList == self._data: return
8384
self._data = modelList
8485
self.modelChanged.emit()
@@ -102,18 +103,18 @@ def data(self, row:int, col:int) -> Any:
102103
return None
103104
return col_data[col]
104105

105-
def setData(self, row:int, col:int, data:object) -> None:
106+
def setData(self, row:int, col:int, data:object) -> bool:
106107
self._data[row][col] = data
107108
self.dataChanged.emit((row,col),(1,1))
108109
return True
109110

110-
def headerData(self, num:int, orientation:int):
111+
def headerData(self, num:int, orientation:TTkK.Direction) -> TTkString:
111112
if orientation == TTkK.HORIZONTAL:
112113
if self._hheader:
113-
return self._hheader[num]
114+
return TTkString(self._hheader[num])
114115
if orientation == TTkK.VERTICAL:
115116
if self._vheader:
116-
return self._vheader[num]
117+
return TTkString(self._vheader[num])
117118
return super().headerData(num, orientation)
118119

119120
def flags(self, row:int, col:int) -> TTkK.ItemFlag:

libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tablemodelsqlite3.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,28 @@
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__=['TTkTableModelSQLite3']
2426

2527
import sqlite3
2628
import threading
2729

28-
from typing import Any
30+
from typing import Any,Dict,List
2931

3032
from TermTk.TTkCore.log import TTkLog
33+
from TermTk.TTkCore.string import TTkString
3134
from TermTk.TTkCore.constant import TTkK
3235
from TermTk.TTkAbstract.abstracttablemodel import TTkAbstractTableModel, TTkModelIndex
3336

3437
class _TTkModelIndexSQLite3(TTkModelIndex):
3538
__slots__ = ('_col','_rowId','_sqModel')
36-
def __init__(self, col:int, rowId:str, sqModel) -> None:
39+
40+
_col:int
41+
_rowId:str
42+
_sqModel:TTkTableModelSQLite3
43+
44+
def __init__(self, col:int, rowId:str, sqModel:TTkTableModelSQLite3) -> None:
3745
self._col = col
3846
self._rowId = rowId
3947
self._sqModel = sqModel
@@ -44,11 +52,11 @@ def row(self) -> int:
4452
def col(self) -> int:
4553
return self._col
4654

47-
def data(self) -> object:
55+
def data(self) -> Any:
4856
return self._sqModel.data(row=self.row(),col=self.col())
4957

50-
def setData(self, data: object) -> None:
51-
return self._sqModel.setData(row=self.row(),col=self.col(),data=data)
58+
def setData(self, data: Any) -> None:
59+
self._sqModel.setData(row=self.row(),col=self.col(),data=data)
5260

5361
class TTkTableModelSQLite3(TTkAbstractTableModel):
5462
'''
@@ -59,7 +67,7 @@ class TTkTableModelSQLite3(TTkAbstractTableModel):
5967
6068
In This example i assume i have a database named **sqlite.database.db** which contain a table **users**
6169
62-
Please refer to `test.ui.032.table.10.sqlite.py <https://github.com/ceccopierangiolieugenio/pyTermTk/blob/main/tests/t.ui/test.ui.032.table.10.sqlite.py>`_ for working eample.
70+
Please refer to `test.ui.032.table.10.sqlite.py <https://github.com/ceccopierangiolieugenio/pyTermTk/blob/main/tests/t.ui/test.ui.032.table.10.sqlite.py>`_ for working example.
6371
6472
.. code-block:: python
6573
@@ -85,6 +93,8 @@ class TTkTableModelSQLite3(TTkAbstractTableModel):
8593
'_sqliteMutex',
8694
'_idMap')
8795

96+
_idMap:Dict[str,int]
97+
8898
def __init__(self, *,
8999
fileName:str,
90100
table:str,
@@ -143,7 +153,7 @@ def index(self, row:int, col:int) -> TTkModelIndex:
143153
f"SELECT {self._key} FROM {self._table} "
144154
f"{self._sort} "
145155
f"LIMIT 1 OFFSET {row}")
146-
key = None if not (_fetch:=res.fetchone()) else _fetch[0]
156+
key:str = '' if not (_fetch:=res.fetchone()) else _fetch[0]
147157
return _TTkModelIndexSQLite3(col=col,rowId=key,sqModel=self)
148158

149159
def data(self, row:int, col:int) -> Any:
@@ -154,7 +164,7 @@ def data(self, row:int, col:int) -> Any:
154164
f"LIMIT 1 OFFSET {row}")
155165
return None if not (_fetch:=res.fetchone()) else _fetch[0]
156166

157-
def setData(self, row:int, col:int, data:object) -> None:
167+
def setData(self, row:int, col:int, data:object) -> bool:
158168
with self._sqliteMutex:
159169
res = self._cur.execute(
160170
f"SELECT {self._key} FROM {self._table} "
@@ -170,7 +180,7 @@ def setData(self, row:int, col:int, data:object) -> None:
170180
self._refreshIdMap()
171181
return True
172182

173-
def headerData(self, num:int, orientation:int):
183+
def headerData(self, num:int, orientation:TTkK.Direction) -> TTkString:
174184
if orientation == TTkK.HORIZONTAL:
175185
if self._columns:
176186
return self._columns[num]

0 commit comments

Comments
 (0)