Skip to content

Commit 9420adf

Browse files
refactor(TabWidget)!: tab request close event need to be handled inside the app
1 parent 4800ffb commit 9420adf

7 files changed

Lines changed: 44 additions & 15 deletions

File tree

apps/tlogg/tlogg/app/main.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def __init__(self, tloggProxy, *args, **kwargs) -> None:
7070

7171
self.addWidget(appTemplate:=TTkAppTemplate(border=False))
7272

73-
self._kodeTab = TTkKodeTab(border=False, closable=True)
73+
self._kodeTab = TTkKodeTab(border=False, closable=True)
7474

7575
appTemplate.setMenuBar(appMenuBar:=TTkMenuBarLayout(), TTkAppTemplate.LEFT)
7676
fileMenu = appMenuBar.addMenu("&File")
@@ -96,6 +96,7 @@ def _tabChanged(_,__,widget,data):
9696
tloggProxy.tloggFocussed.emit(None, data)
9797

9898
self._kodeTab.currentChanged.connect(_tabChanged)
99+
self._kodeTab.kodeTabCloseRequested.connect(self._handleTabCloseRequested)
99100

100101
# fileTree.fileActivated.connect(lambda x: self.openFile(x.path()))
101102

@@ -116,6 +117,10 @@ def _tabChanged(_,__,widget,data):
116117
appTemplate.setWidget(self._kodeTab, TTkAppTemplate.MAIN)
117118
appTemplate.setWidget(TTkLogViewer(),TTkAppTemplate.BOTTOM,size=1,title="Logs")
118119

120+
@ttk.pyTTkSlot(TTkTabWidget, int)
121+
def _handleTabCloseRequested(self, tab:TTkTabWidget, num:int):
122+
tab.removeTab(num)
123+
119124
@pyTTkSlot()
120125
def scratchpad(self):
121126
win = TTkWindow(

apps/ttkode/ttkode/app/ttkode.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ def _showBottomTab(wid:ttk.TTkWidget):
159159

160160
fileTree.fileActivated.connect(lambda x: self._openFile(x.path()))
161161
self._kodeTab.tabAdded.connect(self._tabAdded)
162+
self._kodeTab.kodeTabCloseRequested.connect(self._handleTabCloseRequested)
163+
164+
@ttk.pyTTkSlot(ttk.TTkTabWidget, int)
165+
def _handleTabCloseRequested(self, tab:ttk.TTkTabWidget, num:int):
166+
tab.removeTab(num)
162167

163168
def _getTabButtonFromWidget(self, widget:ttk.TTkWidget) -> ttk.TTkTabButton:
164169
for item, tab in self._kodeTab.iterWidgets():

demo/ttkode.01.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,12 @@ def _openFile(item):
114114

115115
fileTree.fileActivated.connect(_openFile)
116116

117+
@ttk.pyTTkSlot(ttk.TTkTabWidget, int)
117118
def _reportClose(tab:ttk.TTkTabWidget, num:int):
118119
ttk.TTkLog.debug(f"DEL: {num} - {tab} - {tab.widget(num).text()}")
120+
tab.removeTab(num)
119121

120-
kodeTab.tabCloseRequested.connect(_reportClose)
122+
kodeTab.kodeTabCloseRequested.connect(_reportClose)
121123

122124
root.mainloop()
123125

demo/ttkode.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,9 @@ def _openFile(item):
116116

117117
def _reportClose(tab:ttk.TTkTabWidget, num:int):
118118
ttk.TTkLog.debug(f"DEL: {num} - {tab} - {tab.widget(num).text()}")
119+
tab.removeTab(num)
119120

120-
kodeTab.tabCloseRequested.connect(_reportClose)
121+
kodeTab.kodeTabCloseRequested.connect(_reportClose)
121122

122123
root.mainloop()
123124

libs/pyTermTk/TermTk/TTkWidgets/kodetab.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,22 @@
5252
}
5353
class _TTkKodeTab(TTkTabWidget):
5454
__slots__ = (
55-
'_frameOverlay','_baseWidget')
55+
'_frameOverlay','_baseWidget',
56+
#Signals
57+
'kodeTabCloseRequested')
5658
def __init__(self, *,
5759
baseWidget=None,
5860
**kwargs) -> None:
61+
self.kodeTabCloseRequested = pyTTkSignal(_TTkKodeTab,int)
5962
self._baseWidget:TTkKodeTab = baseWidget
6063
self._frameOverlay = None
6164
super().__init__(**kwargs)
6265
self.tabBarClicked.connect( lambda i:self._baseWidget.tabBarClicked.emit( self, i, self.widget(i), self.tabData(i)))
6366
self.currentChanged.connect( lambda i:self._baseWidget.currentChanged.emit( self, i, self.widget(i), self.tabData(i)))
64-
self.tabCloseRequested.connect(lambda i:self._baseWidget.tabCloseRequested.emit(self, i))
65-
self.tabCloseRequested.connect( self._kodeTabClosed)
67+
self.tabCloseRequested.connect(self._handleTabCloseRequested)
68+
69+
def _handleTabCloseRequested(self, index):
70+
self.kodeTabCloseRequested.emit(self,index)
6671

6772
def _hasMenu(self):
6873
return True if (self._topLeftLayout or self._topRightLayout) else False
@@ -112,7 +117,7 @@ def dragMoveEvent(self, evt:TTkDnDEvent) -> bool:
112117
elif y>h*3//4:
113118
self._frameOverlay = (0,k+h-h//4,w,h//4)
114119
else:
115-
self._frameOverlay = None
120+
self._frameOverlay = (0,k,w,h)
116121
self.update()
117122
return True
118123

@@ -133,10 +138,12 @@ def _processDrop(widget, label, orientation, offset):
133138
index = splitter.indexOf(self)
134139
if splitter.orientation() != orientation:
135140
splitter.replaceWidget(index, splitter := TTkSplitter(orientation=orientation, style=self.parentWidget().classStyle))
141+
splitter.mergeStyle(_splitter_NERD_1_style)
136142
splitter.addWidget(self)
137143
index=offset
138144
splitter.insertWidget(index+offset, kt:=_TTkKodeTab(baseWidget=self._baseWidget, border=self.border(), barType=self._barType, closable=self.tabsClosable()))
139145
kt._dropEventProxy = self._dropEventProxy
146+
kt.kodeTabCloseRequested.connect(self._baseWidget._handleKodeTabCloseRequested)
140147
ret = kt.addTab(widget,label)
141148
self._baseWidget.tabAdded.emit(kt, ret)
142149
if fwold!=(fwnew := self._baseWidget._getFirstWidget()) and fwold._hasMenu():
@@ -206,6 +213,7 @@ def _kodeTabClosed(self, widget=None):
206213
widget = splitter
207214
splitter = widget.parentWidget()
208215
splitter.removeWidget(widget)
216+
widget.kodeTabCloseRequested.clear()
209217
if splitter == self._baseWidget and splitter.count() == 0:
210218
splitter.addWidget(self)
211219
if fwold!=(fwnew := self._baseWidget._getFirstWidget()) and fwold._hasMenu():
@@ -224,26 +232,33 @@ class TTkKodeTab(TTkSplitter):
224232
__slots__ = (
225233
'_lastKodeTabWidget', '_barType',
226234
# Signals
227-
'currentChanged','tabBarClicked','tabCloseRequested', 'tabAdded' )
235+
'currentChanged','tabBarClicked','kodeTabCloseRequested', 'tabAdded' )
228236

229237
def __init__(self,
230238
barType:TTkBarType=TTkBarType.NONE,
231239
**kwargs) -> None:
232240
self.currentChanged = pyTTkSignal(TTkTabWidget,int,TTkWidget,object)
233241
self.tabBarClicked = pyTTkSignal(TTkTabWidget,int,TTkWidget,object)
234-
self.tabCloseRequested = pyTTkSignal(TTkTabWidget,int)
242+
self.kodeTabCloseRequested = pyTTkSignal(TTkTabWidget,int)
235243
self.tabAdded = pyTTkSignal(TTkTabWidget, int)
236244
self._barType = barType
237245

238-
self.classStyle |= _splitter_NERD_1_style
239-
240246
super().__init__(**kwargs|{'layout':TTkGridLayout()})
247+
248+
self.mergeStyle(_splitter_NERD_1_style)
241249
kwargs.pop('parent',None)
242250
kwargs.pop('visible',None)
243251
# self.layout().addWidget(splitter := TTkSplitter())
244-
self._lastKodeTabWidget = _TTkKodeTab(baseWidget=self, barType=self._barType, **kwargs)
252+
self._lastKodeTabWidget = kt = _TTkKodeTab(baseWidget=self, barType=self._barType, **kwargs)
245253
self._lastKodeTabWidget._dropEventProxy = self._dropEventProxy
246254
self.addWidget(self._lastKodeTabWidget)
255+
kt.kodeTabCloseRequested.connect(self._handleKodeTabCloseRequested)
256+
257+
@pyTTkSlot(_TTkKodeTab,int)
258+
def _handleKodeTabCloseRequested(self, kt:_TTkKodeTab, index:int) -> None:
259+
TTkLog.debug(f"{kt} -> {index}")
260+
self.kodeTabCloseRequested.emit(kt, index)
261+
# kt.removeTab(index)
247262

248263
def _getFirstWidget(self):
249264
kt = self

libs/pyTermTk/TermTk/TTkWidgets/tabwidget.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,6 @@ def __init__(self, *,
747747

748748
self.rootLayout().addItem(self._tabBarTopLayout)
749749
self._tabBarTopLayout.setGeometry(0,0,self._width,self._padt)
750-
self._tabBar.tabCloseRequested.connect(self.removeTab)
751750
# forwarded methods
752751
self.currentIndex = self._tabBar.currentIndex
753752
self.setCurrentIndex = self._tabBar.setCurrentIndex
@@ -759,7 +758,7 @@ def __init__(self, *,
759758
# forwarded Signals
760759
self.currentChanged = self._tabBar.currentChanged
761760
self.tabBarClicked = self._tabBar.tabBarClicked
762-
self.tabCloseRequested = pyTTkSignal(int)
761+
self.tabCloseRequested = self._tabBar.tabCloseRequested
763762

764763
self.focusChanged.connect(self._focusChanged)
765764

@@ -902,7 +901,6 @@ def insertTab(self, index, widget, label, data=None, closable=None) -> int:
902901
@pyTTkSlot(int)
903902
def removeTab(self, index) -> None:
904903
'''removeTab'''
905-
self.tabCloseRequested.emit(index)
906904
self.layout().removeWidget(self._tabWidgets[index])
907905
self._tabWidgets.pop(index)
908906
self._tabBar.removeTab(index)

run.tlogg.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
_PATH_SCRIPT="$(dirname $(realpath $0))"
3+
PYTHONPATH=${_PATH_SCRIPT}/libs/pyTermTk:${_PATH_SCRIPT}/apps/tlogg python3 -m tlogg $@

0 commit comments

Comments
 (0)