|
|
|
|
@ -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<w-1: |
|
|
|
|
self._closeButtonPressed = True |
|
|
|
|
return True |
|
|
|
|
return super().mouseReleaseEvent(evt) |
|
|
|
|
def mouseReleaseEvent(self, evt): |
|
|
|
|
x,y = evt.x,evt.y |
|
|
|
|
w,h = self.size() |
|
|
|
|
if y == (1 if self._border else 0) and w-4<=x<w-1 and self._closeButtonPressed: |
|
|
|
|
self._closeButtonPressed = False |
|
|
|
|
self.closeClicked.emit() |
|
|
|
|
return True |
|
|
|
|
self._closeButtonPressed = False |
|
|
|
|
return False |
|
|
|
|
def mouseDragEvent(self, evt) -> 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): |
|
|
|
|
|