diff --git a/TermTk/TTkAbstract/abstractscrollarea.py b/TermTk/TTkAbstract/abstractscrollarea.py index 3278d742..3fa6129f 100644 --- a/TermTk/TTkAbstract/abstractscrollarea.py +++ b/TermTk/TTkAbstract/abstractscrollarea.py @@ -159,5 +159,5 @@ class TTkAbstractScrollArea(TTkContainer): def update(self, repaint=True, updateLayout=False, updateParent=False): if self._viewport: - self._viewport.update(repaint, updateLayout, updateParent) + self._viewport.update(repaint, updateLayout, updateParent=False) return super().update(repaint, updateLayout, updateParent) diff --git a/TermTk/TTkAbstract/abstractscrollview.py b/TermTk/TTkAbstract/abstractscrollview.py index e85d60a6..50c690eb 100644 --- a/TermTk/TTkAbstract/abstractscrollview.py +++ b/TermTk/TTkAbstract/abstractscrollview.py @@ -172,10 +172,12 @@ class TTkAbstractScrollViewGridLayout(TTkGridLayout, TTkAbstractScrollViewInterf TTkGridLayout.setGeometry(self, x, y, w, h) self.viewChanged.emit() + @pyTTkSlot() def _viewChanged(self): if self._excludeEvent: return self.viewChanged.emit() + @pyTTkSlot(int,int) def _viewMovedTo(self, x, y): if self._excludeEvent: return self.viewMoveTo(x, y) diff --git a/TermTk/TTkLayouts/layout.py b/TermTk/TTkLayouts/layout.py index b648d4fc..11cd5294 100644 --- a/TermTk/TTkLayouts/layout.py +++ b/TermTk/TTkLayouts/layout.py @@ -214,9 +214,9 @@ class TTkLayout(TTkLayoutItem): if onlyVisible and not child.widget().isVisible(): continue yield child.widget() if recurse and hasattr(cw:=child.widget(),'rootLayout'): - yield from cw.rootLayout().iterWidgets() + yield from cw.rootLayout().iterWidgets(onlyVisible, recurse) if child._layoutItemType == TTkK.LayoutItem and recurse: - yield from child.iterWidgets() + yield from child.iterWidgets(onlyVisible, recurse) def _zSortItems(self): self._zSortedItems = sorted(self._items, key=lambda item: item._z) @@ -313,9 +313,9 @@ class TTkLayout(TTkLayoutItem): :type widgets: list of :class:`~TermTk.TTkWidgets` ''' for item in reversed(self._items): - if item._layoutItemType == TTkK.WidgetItem and \ - item.widget() in widgets: - self.removeItem(item) + if item._layoutItemType == TTkK.WidgetItem: + if item.widget() in widgets: + self.removeItem(item) elif item._layoutItemType == TTkK.LayoutItem: item.removeWidgets(widgets) diff --git a/TermTk/TTkTestWidgets/logviewer.py b/TermTk/TTkTestWidgets/logviewer.py index ab4f06df..db9dc17d 100644 --- a/TermTk/TTkTestWidgets/logviewer.py +++ b/TermTk/TTkTestWidgets/logviewer.py @@ -32,7 +32,7 @@ from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView class _TTkLogViewer(TTkAbstractScrollView): - __slots__ = ('_color', '_text', '_messages', '_cwd', '_follow') + __slots__ = ('_messages', '_cwd', '_follow') def __init__(self, *args, **kwargs): TTkAbstractScrollView.__init__(self, *args, **kwargs) self._messages = [TTkString()] diff --git a/TermTk/TTkWidgets/Fancy/tableview.py b/TermTk/TTkWidgets/Fancy/tableview.py index afc5b5ed..77ef67c9 100644 --- a/TermTk/TTkWidgets/Fancy/tableview.py +++ b/TermTk/TTkWidgets/Fancy/tableview.py @@ -366,21 +366,24 @@ class _TTkFancyTableView(TTkAbstractScrollView): colors = [c.modParam(val=-val) for c in self._columnColors] canvas.drawTableLine(pos=(0,y), items=item, sizes=sizes, colors=colors, alignments=self._alignments) -class TTkFancyTableView(TTkAbstractScrollViewGridLayout): +class TTkFancyTableView(TTkAbstractScrollView): __slots__ = ( - '_header', '_tableView', '_showHeader', 'activated', + '_header', '_tableView', '_showHeader', 'activated', '_excludeEvent', # Forwarded Methods 'setHeader', 'setColumnColors', 'appendItem', 'itemAt', 'dataAt', 'indexOf', 'insertItem', 'removeItem', 'removeItemAt', 'removeItemsFrom', 'doubleClicked') - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, **kwargs): + self._excludeEvent = False + super().__init__(**(kwargs|{'layout':TTkGridLayout()})) if 'parent' in kwargs: kwargs.pop('parent') self._showHeader = kwargs.get('showHeader', True) - self._tableView = _TTkFancyTableView(*args, **kwargs) - self._header = _TTkFancyTableViewHeader(*args, **kwargs) - self.addWidget(self._header,0,0) - self.addWidget(self._tableView,1,0) + self._tableView = _TTkFancyTableView(**kwargs) + self._header = _TTkFancyTableViewHeader(**kwargs) + self.layout().addWidget(self._header,0,0) + self.layout().addWidget(self._tableView,1,0) + self._tableView.viewChanged.connect(self._viewChanged) + self._tableView.viewMovedTo.connect(self._viewMovedTo) # Forward the tableSignals self.activated = self._tableView.activated self.doubleClicked = self._tableView.doubleClicked @@ -399,9 +402,38 @@ class TTkFancyTableView(TTkAbstractScrollViewGridLayout): self.removeItemAt = self._tableView.removeItemAt self.removeItemsFrom = self._tableView.removeItemsFrom + @pyTTkSlot() + def _viewChanged(self): + if self._excludeEvent: return + self.viewChanged.emit() + + @pyTTkSlot(int,int) + def _viewMovedTo(self, x, y): + if self._excludeEvent: return + self.viewMoveTo(x, y) + @pyTTkSlot(int, int) def viewMoveTo(self, x: int, y: int): - self._tableView.viewMoveTo(x, y) + fw, fh = self.viewFullAreaSize() + dw, dh = self.viewDisplayedSize() + rangex = fw - dw + rangey = fh - dh + # TTkLog.debug(f"x:{x},y:{y}, full:{fw,fh}, display:{dw,dh}, range:{rangex,rangey}") + x = max(0,min(rangex,x)) + y = max(0,min(rangey,y)) + # TTkLog.debug(f"x:{x},y:{y}, wo:{self._viewOffsetX,self._viewOffsetY}") + if self._viewOffsetX == x and \ + self._viewOffsetY == y: # Nothong to do + return + self._excludeEvent = True + for widget in self.layout().iterWidgets(recurse=False): + widget.viewMoveTo(x,y) + self._excludeEvent = False + self._viewOffsetX = x + self._viewOffsetY = y + self.viewMovedTo.emit(x,y) + self.viewChanged.emit() + self.update() def getViewOffsets(self): return self._tableView.getViewOffsets() diff --git a/TermTk/TTkWidgets/TTkModelView/tree.py b/TermTk/TTkWidgets/TTkModelView/tree.py index 5e6dfc53..a7b62fde 100644 --- a/TermTk/TTkWidgets/TTkModelView/tree.py +++ b/TermTk/TTkWidgets/TTkModelView/tree.py @@ -32,7 +32,8 @@ class TTkTree(TTkAbstractScrollArea): # Forwarded Signals 'itemActivated', 'itemChanged', 'itemClicked', 'itemExpanded', 'itemCollapsed', 'itemDoubleClicked', # Forwarded Methods - 'setAlignment', 'setHeader', 'setHeaderLabels', 'setColumnSize', 'setColumnColors', 'appendItem', + 'setHeaderLabels', + # 'appendItem', 'setAlignment', 'setColumnColors', 'setColumnSize', 'setHeader', 'addTopLevelItem', 'addTopLevelItems', 'takeTopLevelItem', 'topLevelItem', 'indexOfTopLevelItem', 'selectedItems', 'clear' ) def __init__(self, *args, **kwargs): diff --git a/TermTk/TTkWidgets/TTkModelView/treewidget.py b/TermTk/TTkWidgets/TTkModelView/treewidget.py index ef0d8b6c..d34dacbb 100644 --- a/TermTk/TTkWidgets/TTkModelView/treewidget.py +++ b/TermTk/TTkWidgets/TTkModelView/treewidget.py @@ -51,7 +51,7 @@ class TTkTreeWidget(TTkAbstractScrollView): } __slots__ = ( '_rootItem', '_header', '_columnsPos', '_cache', - '_selectedId', '_selected', '_separatorSelected', '_mouseDelta', + '_selectedId', '_selected', '_separatorSelected', '_sortColumn', '_sortOrder', # Signals 'itemChanged', 'itemClicked', 'itemDoubleClicked', 'itemExpanded', 'itemCollapsed', 'itemActivated' @@ -209,7 +209,6 @@ class TTkTreeWidget(TTkAbstractScrollView): x += ox self._separatorSelected = None - self._mouseDelta = (evt.x, evt.y) # Handle Header Events if y == 0: diff --git a/TermTk/TTkWidgets/TTkPickers/colorpicker.py b/TermTk/TTkWidgets/TTkPickers/colorpicker.py index a8d44df7..7224fae7 100644 --- a/TermTk/TTkWidgets/TTkPickers/colorpicker.py +++ b/TermTk/TTkWidgets/TTkPickers/colorpicker.py @@ -252,7 +252,7 @@ class TTkColorDialogPicker(TTkWindow): __slots__ = ( '_color', '_colorCanvas', '_hueCanvas', - '_redLE', '_greenLE', '_blueRE', '_htmlLE', + # '_redLE', '_greenLE', '_blueRE', '_htmlLE', # Signals 'colorSelected' ) diff --git a/TermTk/TTkWidgets/combobox.py b/TermTk/TTkWidgets/combobox.py index b480d35d..83c35fb8 100644 --- a/TermTk/TTkWidgets/combobox.py +++ b/TermTk/TTkWidgets/combobox.py @@ -71,7 +71,7 @@ class TTkComboBox(TTkContainer): 'borderColor': TTkColor.fg("#ffff00") + TTkColor.BOLD}, } - __slots__ = ('_list', '_id', '_lineEdit', '_listw', '_editable', '_insertPolicy', '_textAlign', '_popupFrame', + __slots__ = ('_list', '_id', '_lineEdit', '_editable', '_insertPolicy', '_textAlign', '_popupFrame', #signals 'currentIndexChanged', 'currentTextChanged', 'editTextChanged') def __init__(self, *args, **kwargs): diff --git a/TermTk/TTkWidgets/radiobutton.py b/TermTk/TTkWidgets/radiobutton.py index 9834c73a..0f8a49e7 100644 --- a/TermTk/TTkWidgets/radiobutton.py +++ b/TermTk/TTkWidgets/radiobutton.py @@ -75,7 +75,7 @@ class TTkRadioButton(TTkWidget): _radioLists = {} __slots__ = ( - '_checked', '_text', '_radiogroup' + '_checked', '_text', '_radiogroup', # Signals 'clicked' ) diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index 1b3e407c..760ce4d3 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/TermTk/TTkWidgets/texedit.py @@ -118,12 +118,12 @@ class TTkTextEditView(TTkAbstractScrollView): __slots__ = ( '_textDocument', '_hsize', - '_textCursor', '_textColor', '_cursorParams', + '_textCursor', '_cursorParams', '_textWrap', '_lineWrapMode', '_lastWrapUsed', '_replace', '_readOnly', '_multiCursor', '_clipboard', - '_preview', '_previewWidth', + # '_preview', '_previewWidth', '_multiLine', # # Forwarded Methods # 'wrapWidth', 'setWrapWidth', @@ -799,7 +799,7 @@ class TTkTextEdit(TTkAbstractScrollArea): 'toAnsi', 'toRawText', 'toPlainText', # 'toHtml', 'toMarkdown', # Signals 'focusChanged', 'currentColorChanged', - 'undoAvilable', 'redoAvailable', + 'undoAvailable', 'redoAvailable', 'textChanged' ) def __init__(self, textEditView=None, lineNumber=False, lineNumberStarting=0, **kwargs):