diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index d063f812..feec99be 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -76,7 +76,7 @@ class TTkHelper: @staticmethod def addUpdateWidget(widget): - if not widget.isVisibleAndParent(): return + # if not widget.isVisibleAndParent(): return if widget not in TTkHelper._updateWidget: TTkHelper._updateWidget.append(widget) @@ -247,6 +247,7 @@ class TTkHelper: def mousePos(): return TTkHelper._mousePos + # paintDbg = [] @staticmethod def paintAll(): ''' @@ -274,6 +275,8 @@ class TTkHelper: TTkHelper._updateBuffer = [] TTkHelper._updateWidget = [] + # TTkHelper.paintDbg.append((updateBuffers,updateWidgets)) + # Paint all the canvas for widget in updateBuffers: if not widget.isVisibleAndParent(): continue diff --git a/demo/demo.py b/demo/demo.py index 559607e7..d9aaf363 100755 --- a/demo/demo.py +++ b/demo/demo.py @@ -274,6 +274,9 @@ def main(): demoShowcase(winTabbed1, border) root.mainloop() + # for i,(a,b) in enumerate(ttk.TTkHelper.paintDbg): + # print(f"{i=} a={[w.name() for w in a]}") + # print(f"{i=} b={[w.name() for w in b]}") if __name__ == "__main__": main() diff --git a/ttkDesigner/app/__init__.py b/ttkDesigner/app/__init__.py index bb4f2160..8078b2b8 100644 --- a/ttkDesigner/app/__init__.py +++ b/ttkDesigner/app/__init__.py @@ -30,4 +30,5 @@ from .widgetbox import DragDesignItem, WidgetBox from .windoweditor import WindowEditor from .propertyeditor import PropertyEditor from .signalsloteditor import SignalSlotEditor +from .quickexport import QuickExport from .superobj import * diff --git a/ttkDesigner/app/designer.py b/ttkDesigner/app/designer.py index 49c80be9..73df2377 100644 --- a/ttkDesigner/app/designer.py +++ b/ttkDesigner/app/designer.py @@ -47,6 +47,7 @@ from .windoweditor import WindowEditor, SuperWidget from .treeinspector import TreeInspector from .propertyeditor import PropertyEditor from .signalsloteditor import SignalSlotEditor +from .quickexport import QuickExport # # Mimic the QT Designer layout @@ -147,6 +148,7 @@ class TTkDesigner(TTkGridLayout): centralSplit.setSizes([None,8]) self._toolBar.addWidget(btnPreview := TTkButton(maxWidth=12, text='Preview...')) + self._toolBar.addWidget(btnExport := TTkButton(maxWidth=17, text='Quick Export 📦')) self._toolBar.addWidget(btnColors := TTkButton(maxWidth=11, checkable=True, text= TTkString("▣",TTkColor.fg("#ff0000")) + TTkString("▣",TTkColor.fg("#ffff00")) + @@ -155,16 +157,11 @@ class TTkDesigner(TTkGridLayout): TTkString("▣",TTkColor.fg("#0000ff")) + "🦄")) btnPreview.clicked.connect(self.preview) + btnExport.clicked.connect(self.quickExport) btnColors.toggled.connect(self.toggleColors) self._toolBar.addItem(TTkLayout()) - # # Internal Debug Stuff - # mainSplit.addWidget(debugSplit := TTkSplitter(orientation=TTkK.VERTICAL)) - # # debugSplit.addWidget(TTkLabel(text='My Own Debug', maxHeight=1, minHeight=1)) - # debugSplit.addWidget(TTkTomInspector()) - # debugSplit.addWidget(TTkLogViewer()) - def getWidgets(self): widgets = [] def _getItems(layoutItem): @@ -177,11 +174,27 @@ class TTkDesigner(TTkGridLayout): _getItems(self._windowEditor.getTTk().widgetItem()) return widgets - pyTTkSlot(bool) + @pyTTkSlot(bool) def toggleColors(self, state): SuperWidget.toggleHighlightLayout.emit(state) - def preview(self, btn=None): + @pyTTkSlot() + def quickExport(self): + tui = self._windowEditor.dumpDict() + connections = self._sigslotEditor.dumpDict() + data = { + 'version':'1.0.0', + 'tui':tui, + 'connections':connections} + + win = QuickExport( + data=data, + title="Mr Export", size=(80,30), + flags=TTkK.WindowFlag.WindowMaximizeButtonHint|TTkK.WindowFlag.WindowCloseButtonHint) + TTkHelper.overlay(None, win, 2, 2, modal=True) + + @pyTTkSlot() + def preview(self): tui = self._windowEditor.dumpDict() connections = self._sigslotEditor.dumpDict() # for line in jj.split('\n'): @@ -204,10 +217,6 @@ class TTkDesigner(TTkGridLayout): def _openFile(self, fileName): TTkLog.info(f"Open: {fileName}") with open(fileName) as fp: - # jj = fp.read() - # # ttk = SuperWidget.loadDict(self._windowEditor.viewport(), jj['tui']) - # wid = TTkUiLoader.loadJson(jj) - # self._windowEditor.importWidget(wid) dd = json.load(fp) sw = SuperWidget.loadDict(self, self._windowEditor.viewport(), dd['tui']) self._windowEditor.importSuperWidget(sw) diff --git a/ttkDesigner/app/quickexport.py b/ttkDesigner/app/quickexport.py new file mode 100644 index 00000000..9791cd7d --- /dev/null +++ b/ttkDesigner/app/quickexport.py @@ -0,0 +1,60 @@ +# MIT License +# +# Copyright (c) 2023 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. + +import TermTk as ttk + +class QuickExport(ttk.TTkWindow): + __slots__ = ('_data', '_te') + def __init__(self, data, *args, **kwargs): + self._data = data + super().__init__(*args, **kwargs|{'layout':ttk.TTkGridLayout()}) + self.layout().addWidget(btnCompressed := ttk.TTkButton(text='Compressed', border=True, maxHeight=3), 0,1) + self.layout().addWidget(btnNormal := ttk.TTkButton(text='Normal', border=True, maxHeight=3), 0,0) + self._te = ttk.TTkTextEdit(lineNumber=True, readOnly=False) + self.layout().addWidget(self._te, 1,0,1,2) + + btnNormal.clicked.connect(self.useNormmal) + btnCompressed.clicked.connect(self.useCompressed) + + self.useCompressed() + + ttk.pyTTkSlot() + def useNormmal(self): + self._te.setLineWrapMode(ttk.TTkK.WidgetWidth) + self._te.setWordWrapMode(ttk.TTkK.WordWrap) + self._te.setText('from TermTk import TTkUtil, TTkUiLoader, TTk\n') + self._te.append(f'# Data generated using ttkDesigner') + self._te.append('widget = TTkUiLoader.loadDict(') + self._te.append(str(self._data)+ '")') + self._te.append('\nroot=TTk()\nroot.layout().addWidget(widget)\nroot.mainloop()\n') + + ttk.pyTTkSlot() + def useCompressed(self): + self._te.setLineWrapMode(ttk.TTkK.NoWrap) + b64str = ttk.TTkUtil.obj_inflate_2_base64(self._data) + self._te.setText('from TermTk import TTkUtil, TTkUiLoader, TTk\n') + self._te.append(f'# Data generated using ttkDesigner') + self._te.append('widget = TTkUiLoader.loadDict(TTkUtil.base64_deflate_2_obj(') + b64list = ' "' + '" +\n "'.join([b64str[i:i+128] for i in range(0,len(b64str),128)]) + '"))' + self._te.append(b64list) + self._te.append('\nroot=TTk()\nroot.layout().addWidget(widget)\nroot.mainloop()\n') +