From d400ce5018d9a7763f29e66fabc67a1487f303a0 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Wed, 28 Dec 2022 20:39:26 +0100 Subject: [PATCH] First drom of the Dom Tree Viewer --- TermTk/TTkTestWidgets/__init__.py | 1 + TermTk/TTkTestWidgets/domtreeview.py | 82 ++++++++++++++++++++++++++++ demo/demo.py | 10 +++- 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 TermTk/TTkTestWidgets/domtreeview.py diff --git a/TermTk/TTkTestWidgets/__init__.py b/TermTk/TTkTestWidgets/__init__.py index dd897322..d6d44f8c 100644 --- a/TermTk/TTkTestWidgets/__init__.py +++ b/TermTk/TTkTestWidgets/__init__.py @@ -3,3 +3,4 @@ from .testwidget import TTkTestWidget from .testwidgetsizes import TTkTestWidgetSizes from .testabstractscroll import TTkTestAbstractScrollWidget from .keypressview import TTkKeyPressView +from .domtreeview import TTkDomTreeView diff --git a/TermTk/TTkTestWidgets/domtreeview.py b/TermTk/TTkTestWidgets/domtreeview.py new file mode 100644 index 00000000..eede3b3b --- /dev/null +++ b/TermTk/TTkTestWidgets/domtreeview.py @@ -0,0 +1,82 @@ +# MIT License +# +# Copyright (c) 2022 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from TermTk.TTkCore.constant import TTkK +from TermTk.TTkCore.helper import TTkHelper +from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot +from TermTk.TTkLayouts.gridlayout import TTkGridLayout +from TermTk.TTkWidgets.widget import TTkWidget +from TermTk.TTkWidgets.button import TTkButton +from TermTk.TTkWidgets.TTkModelView.tree import TTkTree +from TermTk.TTkWidgets.TTkModelView.treewidgetitem import TTkTreeWidgetItem + +class TTkDomTreeView(TTkWidget): + __slots__ = ('_domTree') + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + layout = TTkGridLayout() + self.setLayout(layout) + + + self._domTree = TTkTree() + self._domTree.setHeaderLabels(["Object", "Class", "Visibility", "Layout"]) + self._domTree.addTopLevelItem(TTkDomTreeView._getDomTreeItem(TTkHelper._rootWidget._widgetItem)) + + btnRefresh = TTkButton(text="refresh") + btnRefresh.clicked.connect(self._refresh) + + layout.addWidget(btnRefresh, 0,0) + layout.addWidget(self._domTree, 1,0) + + @pyTTkSlot() + def _refresh(self): + self._domTree.clear() + self._domTree.addTopLevelItem(TTkDomTreeView._getDomTreeItem(TTkHelper._rootWidget._widgetItem)) + + @staticmethod + def _getDomTreeItem(layoutItem): + if layoutItem.layoutItemType == TTkK.WidgetItem: + widget = layoutItem.widget() + top = TTkTreeWidgetItem([ + widget._name, widget.__class__.__name__, + str(widget.isVisible()), + widget.layout().__class__.__name__]) + for c in widget.layout().children(): + top.addChild(TTkDomTreeView._getDomTreeItem(c)) + + for c in widget.rootLayout().children(): + if c == widget.layout(): continue + top.addChild(tc:=TTkTreeWidgetItem(["layout (Other)", c.__class__.__name__, ""])) + for cc in c.children(): + tc.addChild(TTkDomTreeView._getDomTreeItem(cc)) + return top + + if layoutItem.layoutItemType == TTkK.LayoutItem: + top = TTkTreeWidgetItem(["layout", layoutItem.__class__.__name__,"",layoutItem.__class__.__name__]) + for c in layoutItem.children(): + top.addChild(TTkDomTreeView._getDomTreeItem(c)) + return top + + return TTkTreeWidgetItem(["ERROR!!!", "None"]) + + diff --git a/demo/demo.py b/demo/demo.py index 4e9e7dde..e828a3f4 100755 --- a/demo/demo.py +++ b/demo/demo.py @@ -105,12 +105,17 @@ def demoShowcase(root=None, border=True): logInput = ttk.TTkKeyPressView(visible=False, maxHeight=3, minHeight=3) root.layout().addWidget(logInput, 1, 0) + domTree = ttk.TTkFrame(parent=root, title="Dom Tree", border=True, visible=False, layout=ttk.TTkGridLayout()) + ttk.TTkDomTreeView(parent=domTree) + leftFrame = ttk.TTkFrame(parent=splitter, layout=ttk.TTkGridLayout(), border=False) themesFrame = ttk.TTkFrame(title="Theme", border=True, layout=ttk.TTkVBoxLayout(), maxHeight=5, minHeight=5) listMenu = ttk.TTkList(maxWidth=30, minWidth=10) logInputToggler = ttk.TTkCheckbox(text='ShowInput') logInputToggler.stateChanged.connect(lambda x: logInput.setVisible(x==ttk.TTkK.Checked)) + domTreeToggler = ttk.TTkCheckbox(text='Dom Tree') + domTreeToggler.stateChanged.connect(lambda x: domTree.setVisible(x==ttk.TTkK.Checked)) mouseToggler = ttk.TTkCheckbox(text='Mouse 🐀', checked=True) mouseToggler.stateChanged.connect(lambda x: ttk.TTkTerm.push(ttk.TTkTerm.Mouse.ON if x==ttk.TTkK.Checked else ttk.TTkTerm.Mouse.OFF)) quitButton = ttk.TTkButton(text="Quit", border=True, maxHeight=3) @@ -119,8 +124,9 @@ def demoShowcase(root=None, border=True): leftFrame.layout().addWidget(themesFrame, 0, 0) leftFrame.layout().addWidget(listMenu, 1, 0) leftFrame.layout().addWidget(mouseToggler, 2, 0) - leftFrame.layout().addWidget(logInputToggler, 3, 0) - leftFrame.layout().addWidget(quitButton, 4, 0) + leftFrame.layout().addWidget(domTreeToggler, 3, 0) + leftFrame.layout().addWidget(logInputToggler, 4, 0) + leftFrame.layout().addWidget(quitButton, 5, 0) mainFrame = ttk.TTkFrame(parent=splitter, layout=ttk.TTkGridLayout(), border=False)