From b111dc937dabc32ae1dc82fb44e04010bc397e0d Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 24 Aug 2023 09:44:17 +0100 Subject: [PATCH] Adapted the tabwidget and the combobox to the new layout --- TermTk/TTkCore/helper.py | 10 +++++++--- TermTk/TTkWidgets/combobox.py | 5 +++-- TermTk/TTkWidgets/tabwidget.py | 24 ++++++++++++++++++++---- TermTk/TTkWidgets/widget.py | 10 +++++++--- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index 66d26035..59ec720c 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -197,8 +197,9 @@ class TTkHelper: TTkHelper._rootWidget.rootLayout().addWidget(widget) widget.setFocus() widget.raiseWidget() - for w in widget.rootLayout().iterWidgets(onlyVisible=True): - w.update() + if hasattr(widget,'rootLayout'): + for w in widget.rootLayout().iterWidgets(onlyVisible=True): + w.update() @staticmethod def getOverlay(): @@ -372,7 +373,10 @@ class TTkHelper: wx,wy,ww,wh = widget.geometry() if wx <= x < wx+ww and wy <= y < wy+wh: - return TTkHelper.widgetAt(x-wx, y-wy, widget.rootLayout()) + if hasattr(widget,'rootLayout'): + return TTkHelper.widgetAt(x-wx, y-wy, widget.rootLayout()) + else: + return widget continue elif item.layoutItemType() == TTkK.LayoutItem: diff --git a/TermTk/TTkWidgets/combobox.py b/TermTk/TTkWidgets/combobox.py index ce214f07..54748f31 100644 --- a/TermTk/TTkWidgets/combobox.py +++ b/TermTk/TTkWidgets/combobox.py @@ -30,11 +30,12 @@ from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.string import TTkString from TermTk.TTkLayouts.gridlayout import TTkGridLayout from TermTk.TTkWidgets.widget import TTkWidget +from TermTk.TTkWidgets.container import TTkContainer from TermTk.TTkWidgets.list_ import TTkList from TermTk.TTkWidgets.lineedit import TTkLineEdit from TermTk.TTkWidgets.resizableframe import TTkResizableFrame -class TTkComboBox(TTkWidget): +class TTkComboBox(TTkContainer): ''' TTkComboBox: Editable = False @@ -67,7 +68,7 @@ class TTkComboBox(TTkWidget): self.currentIndexChanged = pyTTkSignal(int) self.currentTextChanged = pyTTkSignal(str) self.editTextChanged = pyTTkSignal(str) - TTkWidget.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) # self.checked = pyTTkSignal() self._lineEdit = TTkLineEdit(parent=self) self._list = kwargs.get('list', [] ) diff --git a/TermTk/TTkWidgets/tabwidget.py b/TermTk/TTkWidgets/tabwidget.py index 9b267fe6..2a217993 100644 --- a/TermTk/TTkWidgets/tabwidget.py +++ b/TermTk/TTkWidgets/tabwidget.py @@ -57,19 +57,17 @@ class _TTkTabBarDragData(): class TTkTabButton(TTkButton): '''TTkTabButton''' - __slots__ = ('_sideEnd', '_tabStatus', '_closable', 'closeClicked', '_closeButton') + __slots__ = ('_sideEnd', '_tabStatus', '_closable', 'closeClicked', '_closeButtonPressed') def __init__(self, *args, **kwargs): self._sideEnd = TTkK.NONE self._tabStatus = TTkK.Unchecked self._closable = kwargs.get('closable', False) self.closeClicked = pyTTkSignal() TTkButton.__init__(self, *args, **kwargs) + self._closeButtonPressed = False size = self.text().termWidth() + 2 if self._closable: size += 3 - self._closeButton = TTkButton(parent=self, border=False, text="x", pos=(size-4,1 if self._border else 0), size=(3,1)) - self._closeButton.setFocusPolicy(TTkK.ParentFocus) - self._closeButton.clicked.connect(self.closeClicked.emit) if self._border: self.resize(size, 3) self.setMinimumSize(size, 3) @@ -97,14 +95,28 @@ class TTkTabButton(TTkButton): # This is a hack to force the action aftet the keypress # And not key release as normally happen to the button def mousePressEvent(self, evt): + x,y = evt.x,evt.y + w,h = self.size() + self._closeButtonPressed = False if self._closable and evt.key == TTkK.MidButton: self.closeClicked.emit() return True + if y == (1 if self._border else 0) and w-4<=x bool: drag = TTkDrag() + self._closeButtonPressed = False if tb := self.parentWidget(): if issubclass(type(tb),TTkTabBar): if tw:= tb.parentWidget(): @@ -124,12 +136,16 @@ class TTkTabButton(TTkButton): return super().mouseDragEvent(evt) def paintEvent(self, canvas): + w,h = self.size() canvas.drawTabButton( pos=(0,0), size=self.size(), small=(not self._border), sideEnd=self._sideEnd, status=self._tabStatus, color=self._borderColor ) canvas.drawText(pos=(1,1 if self._border else 0), text=self.text(), color=self.color()) + if self._closable: + canvas.drawText(pos=(w-4,1 if self._border else 0), text="[X]", color=self.color()) + class _TTkTabMenuButton(TTkMenuBarButton): def __init__(self, *args, **kwargs): diff --git a/TermTk/TTkWidgets/widget.py b/TermTk/TTkWidgets/widget.py index 52ca9c45..53efc8e5 100644 --- a/TermTk/TTkWidgets/widget.py +++ b/TermTk/TTkWidgets/widget.py @@ -169,9 +169,13 @@ class TTkWidget(TMouseEvents,TKeyEvents, TDragEvents): # TODO: Check this, # The parent should always have a layout - if hasattr(self._parent,'layout') and self._parent.layout(): - self._parent.layout().addWidget(self) - self._parent.update(repaint=True, updateLayout=True) + if self._parent: + if not hasattr(self._parent,'layout'): + TTkLog.warn(f"The parent={self._parent} is not a container") + else: + if self._parent.layout(): + self._parent.layout().addWidget(self) + self._parent.update(repaint=True, updateLayout=True) self.update(repaint=True, updateLayout=True)