From 641fa8bf467d26c1139ad85fa91e7f7c63113b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parodi=2C=20Eugenio=20=F0=9F=8C=B6?= Date: Sun, 14 Sep 2025 12:25:30 +0100 Subject: [PATCH] refactor(plugin): include panels in the plugin engine --- apps/ttkode/ttkode/app/ttkode.py | 97 ++++++++++++++++++++++++++++---- apps/ttkode/ttkode/helper.py | 8 +++ 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/apps/ttkode/ttkode/app/ttkode.py b/apps/ttkode/ttkode/app/ttkode.py index aca3171a..e28b69d4 100644 --- a/apps/ttkode/ttkode/app/ttkode.py +++ b/apps/ttkode/ttkode/app/ttkode.py @@ -20,10 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from __future__ import annotations + __all__ = ['TTKode', 'TTKodeWidget'] import os -from typing import List,Tuple,Optional,Any +from dataclasses import dataclass +from enum import IntEnum +from typing import List,Tuple,Optional,Any,Dict import TermTk as ttk from TermTk.TTkWidgets.tabwidget import _TTkNewTabWidgetDragData @@ -167,8 +171,68 @@ class _TextEdit(ttk.TTkTextEdit, TTKodeWidget): tedit.ensureCursorVisible() tedit.textCursor().setPosition(line=linenum,pos=0) +class _Panel(): + class Position(IntEnum): + BOTTOM = 0x01 + + class _PanelDef(): + def __init__( + self, + position: _Panel.Position, + layout: ttk.TTkLayout, + menuBar: ttk.TTkMenuBarLayout, + widgets: List[ttk.TTkWidget] = []): + self.position = position + self.layout = layout + self.menuBar = menuBar + self.widgets = widgets + + __slots__ = ('_panels') + _panels:Dict[_Panel.Position,_Panel._PanelDef] + + def __init__(self): + self._panels = {} + + def addPanel( + self, + position:_Panel.Position, + layout: ttk.TTkLayout, + menuBar: ttk.TTkMenuBarLayout): + if position in self._panels: + raise ValueError(f"Panel '{position.name}' already exists") + panel = _Panel._PanelDef( + position=position, + layout=layout, + menuBar=menuBar + ) + self._panels[position] = panel + + def addWidget( + self, + position:_Panel.Position, + widget: ttk.TTkWidget, + name: ttk.TTkString, + visible: bool=False): + if not (panel:=self._panels.get(position,None)): + raise ValueError(f"Panel '{position.name}' does not exists") + widget.setVisible(visible) + + panel.layout.addWidget(widget) + panel.widgets.append(widget) + mb = panel.menuBar.addMenu(name, alignment=ttk.TTkK.LEFT_ALIGN) + + @ttk.pyTTkSlot() + def _showBottomTab(): + for _w in self._panels[self.Position.BOTTOM].widgets: + _w.hide() + widget.show() + + mb.menuButtonClicked.connect(_showBottomTab) + + class TTKode(ttk.TTkGridLayout): - __slots__ = ('_kodeTab', '_activityBar', '_lastDoc') + __slots__ = ('_kodeTab', '_activityBar', '_panel', '_lastDoc') + _panel:_Panel _lastDoc:Optional[_TextDocument] def __init__(self, **kwargs): self._lastDoc = None @@ -210,18 +274,27 @@ class TTKode(ttk.TTkGridLayout): appTemplate.setItem(bottomLayout, ttk.TTkAppTemplate.BOTTOM, size=3) appTemplate.setMenuBar(bottomMenuBar:=ttk.TTkMenuBarLayout(), ttk.TTkAppTemplate.BOTTOM) - bottomLayout.addWidget(_logViewer:=ttk.TTkLogViewer()) - bottomLayout.addWidget(_terminal:=ttk.TTkTerminal(visible=False)) + self._panel = _Panel() + self._panel.addPanel( + position=_Panel.Position.BOTTOM, + layout=bottomLayout, + menuBar=bottomMenuBar) + + _logViewer=ttk.TTkLogViewer() + _terminal=ttk.TTkTerminal(visible=False) + _th = ttk.TTkTerminalHelper(term=_terminal) _th.runShell() - @ttk.pyTTkSlot(ttk.TTkWidget) - def _showBottomTab(wid:ttk.TTkWidget): - _logViewer.hide() - _terminal.hide() - wid.show() - - bottomMenuBar.addMenu("Logs", alignment=ttk.TTkK.LEFT_ALIGN).menuButtonClicked.connect(lambda : _showBottomTab(_logViewer)) - bottomMenuBar.addMenu(" Terminal", alignment=ttk.TTkK.LEFT_ALIGN).menuButtonClicked.connect(lambda : _showBottomTab(_terminal)) + + self._panel.addWidget( + position=_Panel.Position.BOTTOM, + widget=_logViewer, + name="Logs", + visible=True) + self._panel.addWidget( + position=_Panel.Position.BOTTOM, + widget=_terminal, + name=" Terminal") fileTree.fileActivated.connect(lambda x: self._openFile(x.path())) self._kodeTab.tabAdded.connect(self._tabAdded) diff --git a/apps/ttkode/ttkode/helper.py b/apps/ttkode/ttkode/helper.py index 6c2a044e..b0564021 100644 --- a/apps/ttkode/ttkode/helper.py +++ b/apps/ttkode/ttkode/helper.py @@ -70,6 +70,14 @@ class TTkodeHelper(): name=_pluginWidget.activityName, icon=_pluginWidget.icon, widget=_pluginWidget.widget) + if isinstance(_pluginWidget, TTkodePluginWidgetPanel): + _panel = ttkodeProxy.ttkode()._panel + _panel.addWidget( + position=_panel.Position.BOTTOM, + widget=_pluginWidget.widget, + name=_pluginWidget.panelName + ) + if mod.apply is not None: mod.apply()