Browse Source

Added Quick Export in ttkDesigner

pull/99/head
Eugenio Parodi 3 years ago
parent
commit
bbcc7e247a
  1. 5
      TermTk/TTkCore/helper.py
  2. 3
      demo/demo.py
  3. 1
      ttkDesigner/app/__init__.py
  4. 33
      ttkDesigner/app/designer.py
  5. 60
      ttkDesigner/app/quickexport.py

5
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

3
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()

1
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 *

33
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)

60
ttkDesigner/app/quickexport.py

@ -0,0 +1,60 @@
# MIT License
#
# Copyright (c) 2023 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# 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')
Loading…
Cancel
Save