From c8214135d95e352323d2ae8caa665bfd233c47c2 Mon Sep 17 00:00:00 2001 From: Pier CeccoPierangioliEugenio Date: Fri, 10 Oct 2025 10:03:26 +0100 Subject: [PATCH] docs(tree): improved typings and docs (#459) --- libs/pyTermTk/TermTk/TTkCore/constant.py | 2 +- .../TTkWidgets/TTkModelView/filetree.py | 95 ++++++++-- .../TermTk/TTkWidgets/TTkModelView/tree.py | 97 ++++++++-- .../TTkWidgets/TTkModelView/treewidget.py | 174 ++++++++++++++---- .../TTkWidgets/TTkModelView/treewidgetitem.py | 11 +- 5 files changed, 303 insertions(+), 76 deletions(-) diff --git a/libs/pyTermTk/TermTk/TTkCore/constant.py b/libs/pyTermTk/TermTk/TTkCore/constant.py index 1acde11f..8ad1b60a 100644 --- a/libs/pyTermTk/TermTk/TTkCore/constant.py +++ b/libs/pyTermTk/TermTk/TTkCore/constant.py @@ -231,7 +231,7 @@ class TTkConstant: # InsertAlphabetically = 0x06 # '''The string is inserted in the alphabetic order in the combobox.''' - class DragDropMode(int): + class DragDropMode(IntEnum): '''Specifies the Drag and Drop mode allowed by this widget .. autosummary:: diff --git a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/filetree.py b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/filetree.py index 15d329a0..4430df8f 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/filetree.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/filetree.py @@ -22,6 +22,8 @@ __all__ = ['TTkFileTree'] +from typing import List,Optional + from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal @@ -204,32 +206,46 @@ class TTkFileTree(TTkTree): :type folder: :py:class:`TTkFileTreeWidgetItem` ''' return self._fileTreeWidget.folderActivated - def setHeaderLabels(self, labels:TTkString) -> None: + def setHeaderLabels(self, labels:List[TTkString]) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.setHeaderLabels` - setHeaderLabels + Adds a column in the header for each item in the labels list, and sets the label for each column. + + :param labels: the list of labels + :type labels: List[:py:class:`TTkString`] ''' return self._fileTreeWidget.setHeaderLabels(labels=labels) def setColumnWidth(self, column:int, width: int) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.setColumnWidth` - setColumnWidth + Set the width of the column requested + + :param column: the column position + :type column: int + + :rtype: int ''' return self._fileTreeWidget.setColumnWidth(column=column, width=width) def resizeColumnToContents(self, column:int) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.resizeColumnToContents` - resizeColumnToContents + rwsize the width of the column requestedto its content + + :param column: the column position + :type column: int ''' return self._fileTreeWidget.resizeColumnToContents(column=column) - def sortColumn(self): + def sortColumn(self) -> int: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.sortColumn` Returns the column used to sort the contents of the widget. + -1 in case no column sort is used + + :rtype: int ''' return self._fileTreeWidget.sortColumn() def sortItems(self, col:int, order:TTkK.SortOrder) -> None: @@ -237,16 +253,21 @@ class TTkFileTree(TTkTree): .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.sortItems` Sorts the items in the widget in the specified order by the values in the given column. + + :param col: the column used as reference for the sorting + :type col: int + :param order: the sorting order + :type order: :py:class:`TTkK.SortOrder` ''' return self._fileTreeWidget.sortItems(col=col, order=order) - def dragDropMode(self): + def dragDropMode(self) -> TTkK.DragDropMode: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.dragDropMode` dragDropMode ''' return self._fileTreeWidget.dragDropMode() - def setDragDropMode(self, dndMode): + def setDragDropMode(self, dndMode:TTkK.DragDropMode): ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.setDragDropMode` @@ -258,7 +279,7 @@ class TTkFileTree(TTkTree): ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.expandAll` - expandAll + Expands all expandable items. ''' return self._fileTreeWidget.expandAll() @pyTTkSlot() @@ -266,56 +287,90 @@ class TTkFileTree(TTkTree): ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.collapseAll` - collapseAll + Collapse all collapsable items. ''' return self._fileTreeWidget.collapseAll() + def invisibleRootItem(self) -> TTkTreeWidgetItem: + ''' + .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.invisibleRootItem` + + Returns the tree widget's invisible root item. + + The invisible root item provides access to the tree widget's top-level items through the :py:class:`TTkTreeWidgetItem` API, + making it possible to write functions that can treat top-level items and their children in a uniform way; + for example, recursive functions. + + :return: the root Item + :rtype: :py:class:`TTkTreeWidgetItem` + ''' + return self._fileTreeWidget.invisibleRootItem() def addTopLevelItem(self, item:TTkTreeWidgetItem) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.addTopLevelItem` - addTopLevelItem + Appends the item as a top-level item in the widget. + + :param item: the item to be added. + :type item: :py:class:`TTkTreeWidgetItem` ''' return self._fileTreeWidget.addTopLevelItem(item=item) - def addTopLevelItems(self, items:TTkTreeWidgetItem) -> None: + def addTopLevelItems(self, items:List[TTkTreeWidgetItem]) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.addTopLevelItems` - addTopLevelItems + Appends the list of items as a top-level items in the widget. + + :param item: the item to be added. + :type item: List[:py:class:`TTkTreeWidgetItem`] ''' return self._fileTreeWidget.addTopLevelItems(items=items) - def takeTopLevelItem(self, index) -> None: + def takeTopLevelItem(self, index:int) -> Optional[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.takeTopLevelItem` - takeTopLevelItem + Removes the top-level item at the given index in the tree and returns it, otherwise returns None; + + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] ''' return self._fileTreeWidget.takeTopLevelItem(index=index) - def topLevelItem(self, index) -> TTkTreeWidgetItem: + def topLevelItem(self, index) -> Optional[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.topLevelItem` - topLevelItem + Returns the top level item at the given index, or None if the item does not exist. + + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] ''' return self._fileTreeWidget.topLevelItem(index=index) def indexOfTopLevelItem(self, item:TTkTreeWidgetItem) -> int: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.indexOfTopLevelItem` - indexOfTopLevelItem + Returns the index of the given top-level item, or -1 if the item cannot be found. + + :rtype: int ''' return self._fileTreeWidget.indexOfTopLevelItem(item=item) - def selectedItems(self) -> list[TTkTreeWidgetItem]: + def selectedItems(self) -> List[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.selectedItems` - selectedItems + Returns a list of all selected non-hidden items. + + :rtype: List[:py:class:`TTkTreeWidgetItem`] ''' return self._fileTreeWidget.selectedItems() def clear(self) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkFileTreeWidget.clear` - clear + Clears the tree widget by removing all of its items and selections. ''' return self._fileTreeWidget.clear() def openPath(self, path): diff --git a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tree.py b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tree.py index bbaa9d0f..205382e7 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tree.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/tree.py @@ -22,12 +22,15 @@ __all__ = ['TTkTree'] +from typing import List,Optional + from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot from TermTk.TTkWidgets.TTkModelView.treewidget import TTkTreeWidget from TermTk.TTkWidgets.TTkModelView.treewidgetitem import TTkTreeWidgetItem from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea, _ForwardData + class TTkTree(TTkAbstractScrollArea): __doc__ = ''' :py:class:`TTkTree` is a container widget which place :py:class:`TTkTreeWidget` in a scrolling area with on-demand scroll bars. @@ -45,6 +48,7 @@ class TTkTree(TTkAbstractScrollArea): 'sortColumn', 'sortItems', 'dragDropMode', 'setDragDropMode', 'expandAll', 'collapseAll', + 'invisibleRootItem', # 'appendItem', 'setAlignment', 'setColumnColors', 'setColumnSize', 'setHeader', 'addTopLevelItem', 'addTopLevelItems', 'takeTopLevelItem', 'topLevelItem', 'indexOfTopLevelItem', 'selectedItems', 'clear'] ) @@ -145,32 +149,46 @@ class TTkTree(TTkAbstractScrollArea): :type col: int ''' return self._treeView.itemDoubleClicked - def setHeaderLabels(self, labels:TTkString) -> None: + def setHeaderLabels(self, labels:List[TTkString]) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.setHeaderLabels` - setHeaderLabels + Adds a column in the header for each item in the labels list, and sets the label for each column. + + :param labels: the list of labels + :type labels: List[:py:class:`TTkString`] ''' return self._treeView.setHeaderLabels(labels=labels) def setColumnWidth(self, column:int, width: int) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.setColumnWidth` - setColumnWidth + Set the width of the column requested + + :param column: the column position + :type column: int + + :rtype: int ''' return self._treeView.setColumnWidth(column=column, width=width) def resizeColumnToContents(self, column:int) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.resizeColumnToContents` - resizeColumnToContents + rwsize the width of the column requestedto its content + + :param column: the column position + :type column: int ''' return self._treeView.resizeColumnToContents(column=column) - def sortColumn(self): + def sortColumn(self) -> int: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.sortColumn` Returns the column used to sort the contents of the widget. + -1 in case no column sort is used + + :rtype: int ''' return self._treeView.sortColumn() def sortItems(self, col:int, order:TTkK.SortOrder) -> None: @@ -178,16 +196,21 @@ class TTkTree(TTkAbstractScrollArea): .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.sortItems` Sorts the items in the widget in the specified order by the values in the given column. + + :param col: the column used as reference for the sorting + :type col: int + :param order: the sorting order + :type order: :py:class:`TTkK.SortOrder` ''' return self._treeView.sortItems(col=col, order=order) - def dragDropMode(self): + def dragDropMode(self) -> TTkK.DragDropMode: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.dragDropMode` dragDropMode ''' return self._treeView.dragDropMode() - def setDragDropMode(self, dndMode): + def setDragDropMode(self, dndMode:TTkK.DragDropMode): ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.setDragDropMode` @@ -199,7 +222,7 @@ class TTkTree(TTkAbstractScrollArea): ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.expandAll` - expandAll + Expands all expandable items. ''' return self._treeView.expandAll() @pyTTkSlot() @@ -207,56 +230,90 @@ class TTkTree(TTkAbstractScrollArea): ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.collapseAll` - collapseAll + Collapse all collapsable items. ''' return self._treeView.collapseAll() + def invisibleRootItem(self) -> TTkTreeWidgetItem: + ''' + .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.invisibleRootItem` + + Returns the tree widget's invisible root item. + + The invisible root item provides access to the tree widget's top-level items through the :py:class:`TTkTreeWidgetItem` API, + making it possible to write functions that can treat top-level items and their children in a uniform way; + for example, recursive functions. + + :return: the root Item + :rtype: :py:class:`TTkTreeWidgetItem` + ''' + return self._treeView.invisibleRootItem() def addTopLevelItem(self, item:TTkTreeWidgetItem) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.addTopLevelItem` - addTopLevelItem + Appends the item as a top-level item in the widget. + + :param item: the item to be added. + :type item: :py:class:`TTkTreeWidgetItem` ''' return self._treeView.addTopLevelItem(item=item) - def addTopLevelItems(self, items:TTkTreeWidgetItem) -> None: + def addTopLevelItems(self, items:List[TTkTreeWidgetItem]) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.addTopLevelItems` - addTopLevelItems + Appends the list of items as a top-level items in the widget. + + :param item: the item to be added. + :type item: List[:py:class:`TTkTreeWidgetItem`] ''' return self._treeView.addTopLevelItems(items=items) - def takeTopLevelItem(self, index) -> None: + def takeTopLevelItem(self, index:int) -> Optional[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.takeTopLevelItem` - takeTopLevelItem + Removes the top-level item at the given index in the tree and returns it, otherwise returns None; + + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] ''' return self._treeView.takeTopLevelItem(index=index) - def topLevelItem(self, index) -> TTkTreeWidgetItem: + def topLevelItem(self, index) -> Optional[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.topLevelItem` - topLevelItem + Returns the top level item at the given index, or None if the item does not exist. + + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] ''' return self._treeView.topLevelItem(index=index) def indexOfTopLevelItem(self, item:TTkTreeWidgetItem) -> int: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.indexOfTopLevelItem` - indexOfTopLevelItem + Returns the index of the given top-level item, or -1 if the item cannot be found. + + :rtype: int ''' return self._treeView.indexOfTopLevelItem(item=item) - def selectedItems(self) -> list[TTkTreeWidgetItem]: + def selectedItems(self) -> List[TTkTreeWidgetItem]: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.selectedItems` - selectedItems + Returns a list of all selected non-hidden items. + + :rtype: List[:py:class:`TTkTreeWidgetItem`] ''' return self._treeView.selectedItems() def clear(self) -> None: ''' .. seealso:: this method is forwarded to :py:meth:`TTkTreeWidget.clear` - clear + Clears the tree widget by removing all of its items and selections. ''' return self._treeView.clear() #--FORWARD-AUTOGEN-END--# \ No newline at end of file diff --git a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidget.py b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidget.py index 5498a10f..f353718d 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidget.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidget.py @@ -239,14 +239,14 @@ class TTkTreeWidget(TTkAbstractScrollView): items: List[TTkAbstractItemModel] def __init__(self, *, - header=None, - sortingEnabled=True, + header:List[TTkString]=[], + sortingEnabled:bool=True, selectionMode:TTkK.SelectionMode=TTkK.SelectionMode.SingleSelection, dragDropMode:TTkK.DragDropMode=TTkK.DragDropMode.NoDragDrop, **kwargs) -> None: ''' :param header: define the header labels of each column, defaults to [] - :type header: list[TTkString], optional + :type header: List[:py:class:`TTkString`], optional :param sortingEnabled: enable the column sorting, defaults to False :type sortingEnabled: bool, optional :param selectionMode: This property controls whether the user can select one or many items, defaults to :py:class:`TTkK.SelectionMode.SingleSelection`. @@ -297,8 +297,23 @@ class TTkTreeWidget(TTkAbstractScrollView): # TTkLog.debug(f"{w=} {h=}") return w,h + def invisibleRootItem(self) -> TTkTreeWidgetItem: + ''' + Returns the tree widget's invisible root item. + + The invisible root item provides access to the tree widget's top-level items through the :py:class:`TTkTreeWidgetItem` API, + making it possible to write functions that can treat top-level items and their children in a uniform way; + for example, recursive functions. + + :return: the root Item + :rtype: :py:class:`TTkTreeWidgetItem` + ''' + return self._rootItem + def clear(self) -> None: - '''clear''' + ''' + Clears the tree widget by removing all of its items and selections. + ''' # Remove all the widgets if self._rootItem: self._rootItem.dataChanged.disconnect(self._refreshCache) @@ -309,77 +324,153 @@ class TTkTreeWidget(TTkAbstractScrollView): self.update() def addTopLevelItem(self, item:TTkTreeWidgetItem) -> None: - '''addTopLevelItem''' + ''' + Appends the item as a top-level item in the widget. + + :param item: the item to be added. + :type item: :py:class:`TTkTreeWidgetItem` + ''' self._rootItem.addChild(item) self.viewChanged.emit() self.update() - def addTopLevelItems(self, items:TTkTreeWidgetItem) -> None: - '''addTopLevelItems''' + def addTopLevelItems(self, items:List[TTkTreeWidgetItem]) -> None: + ''' + Appends the list of items as a top-level items in the widget. + + :param item: the item to be added. + :type item: List[:py:class:`TTkTreeWidgetItem`] + ''' self._rootItem.addChildren(items) self.viewChanged.emit() self.update() - def takeTopLevelItem(self, index) -> None: - '''takeTopLevelItem''' - self._rootItem.takeChild(index) + def takeTopLevelItem(self, index:int) -> Optional[TTkTreeWidgetItem]: + ''' + Removes the top-level item at the given index in the tree and returns it, otherwise returns None; + + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] + ''' + ret = self._rootItem.takeChild(index) self.viewChanged.emit() self.update() + return ret + + def topLevelItem(self, index) -> Optional[TTkTreeWidgetItem]: + ''' + Returns the top level item at the given index, or None if the item does not exist. - def topLevelItem(self, index) -> TTkTreeWidgetItem: - '''topLevelItem''' + :param index: the index of the item + :type index: int + + :rtype: Optional[:py:class:`TTkTreeWidgetItem`] + ''' return self._rootItem.child(index) def indexOfTopLevelItem(self, item:TTkTreeWidgetItem) -> int: - '''indexOfTopLevelItem''' + ''' + Returns the index of the given top-level item, or -1 if the item cannot be found. + + :rtype: int + ''' return self._rootItem.indexOfChild(item) def selectionMode(self) -> TTkK.SelectionMode: - '''selectionMode''' + ''' + selectionMode + + :rtype: :py:class:`TTkK.SelectionMode` + ''' return self._selectionMode def setSelectionMode(self, mode:TTkK.SelectionMode) -> None: - '''setSelectionMode''' + ''' + Sets the current selection model to the given selectionModel. + + :param mode: the selection mode used in this tree + :type mode: :py:class:`TTkK.SelectionMode` + ''' self._selectionMode = mode - def selectedItems(self) -> list[TTkTreeWidgetItem]: - '''selectedItems''' + def selectedItems(self) -> List[TTkTreeWidgetItem]: + ''' + Returns a list of all selected non-hidden items. + + :rtype: List[:py:class:`TTkTreeWidgetItem`] + ''' if self._selected: return self._selected return None - def setHeaderLabels(self, labels:TTkString) -> None: - '''setHeaderLabels''' + def setHeaderLabels(self, labels:List[TTkString]) -> None: + ''' + Adds a column in the header for each item in the labels list, and sets the label for each column. + + :param labels: the list of labels + :type labels: List[:py:class:`TTkString`] + ''' self._header = labels # Set 20 as default column size self._columnsPos = [20+x*20 for x in range(len(labels))] self.viewChanged.emit() self.update() - def dragDropMode(self): + def dragDropMode(self) -> TTkK.DragDropMode: '''dragDropMode''' return self._dndMode - def setDragDropMode(self, dndMode): + def setDragDropMode(self, dndMode:TTkK.DragDropMode): '''setDragDropMode''' self._dndMode = dndMode def isSortingEnabled(self) -> bool: - 'isSortingEnabled' + ''' + This property holds whether sorting is enabled + + If this property is true, sorting is enabled for the tree; + if the property is false, sorting is not enabled. + The default value is false. + + :rtype: bool + ''' return self._sortingEnabled - def setSortingEnabled(self, enabled) -> None: - 'setSortingEnabled' + def setSortingEnabled(self, enabled:bool) -> None: + ''' + This property holds whether sorting is enabled + + If this property is true, sorting is enabled for the tree; + if the property is false, sorting is not enabled. + The default value is false. + + :param enabled: the sorting status + :type enabled: bool + ''' if enabled != self._sortingEnabled: self._sortingEnabled = enabled self.update() - def sortColumn(self): - '''Returns the column used to sort the contents of the widget.''' + def sortColumn(self) -> int: + ''' + Returns the column used to sort the contents of the widget. + -1 in case no column sort is used + + :rtype: int + ''' return self._sortColumn def sortItems(self, col:int, order:TTkK.SortOrder) -> None: - '''Sorts the items in the widget in the specified order by the values in the given column.''' + ''' + Sorts the items in the widget in the specified order by the values in the given column. + + :param col: the column used as reference for the sorting + :type col: int + :param order: the sorting order + :type order: :py:class:`TTkK.SortOrder` + ''' if not self._sortingEnabled: return self._sortColumn = col self._sortOrder = order @@ -389,14 +480,28 @@ class TTkTreeWidget(TTkAbstractScrollView): self._refreshCache() def columnWidth(self, column:int) -> int: - '''columnWidth''' + ''' + This property hold the width of the column requested + + :param column: the column position + :type column: int + + :rtype: int + ''' if column==0: return self._columnsPos[column] else: return self._columnsPos[column]-self._columnsPos[column-1]-1 def setColumnWidth(self, column:int, width: int) -> None: - '''setColumnWidth''' + ''' + Set the width of the column requested + + :param column: the column position + :type column: int + + :rtype: int + ''' i = column newSize = ((1+self._columnsPos[i-1]) if i>0 else 0) + width oldSize = self._columnsPos[i] @@ -407,14 +512,19 @@ class TTkTreeWidget(TTkAbstractScrollView): self.update() def resizeColumnToContents(self, column:int) -> None: - '''resizeColumnToContents''' + ''' + rwsize the width of the column requestedto its content + + :param column: the column position + :type column: int + ''' _,oy = self.getViewOffsets() contentSize = self._rootItem._getColumnContentSize(column, oy) self.setColumnWidth(column, contentSize) @pyTTkSlot() def expandAll(self) -> None: - '''expandAll''' + '''Expands all expandable items.''' if not self._rootItem: return self._rootItem.dataChanged.disconnect(self._refreshCache) @@ -424,7 +534,7 @@ class TTkTreeWidget(TTkAbstractScrollView): @pyTTkSlot() def collapseAll(self) -> None: - '''collapseAll''' + '''Collapse all collapsable items.''' if not self._rootItem: return self._rootItem.dataChanged.disconnect(self._refreshCache) diff --git a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py index 536ace12..43469593 100644 --- a/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py +++ b/libs/pyTermTk/TermTk/TTkWidgets/TTkModelView/treewidgetitem.py @@ -475,10 +475,15 @@ class TTkTreeWidgetItem(TTkAbstractItemModel): return [] return self._children.children() - def indexOfChild(self, child:TTkTreeWidgetItem) -> Optional[int]: + def indexOfChild(self, child:TTkTreeWidgetItem) -> int: if not self._children: - return None - return self._children.indexOfChild(child) + return -1 + try: + return self._children.indexOfChild(child) + except ValueError: + return -1 + finally: + return -1 def icon(self, col:int) -> TTkString: if col >= len(self._icon):