You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

170 lines
7.2 KiB

# MIT License
#
# Copyright (c) 2024 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.
__all__ = ['ExportArea']
import TermTk as ttk
from .paintarea import PaintArea
class ExportArea(ttk.TTkGridLayout):
__slots__ = ('_paintArea', '_te','_cbCrop', '_cbFull', '_cbPal')
def __init__(self, paintArea:PaintArea, **kwargs):
self._paintArea:PaintArea = paintArea
super().__init__(**kwargs)
self._te = ttk.TTkTextEdit(lineNumber=True, readOnly=False)
btn_exIm = ttk.TTkButton(text="Export Image")
btn_exLa = ttk.TTkButton(text="Export Layer")
btn_exPr = ttk.TTkButton(text="Export Document")
self._cbCrop = ttk.TTkCheckbox(text="Crop",checked=True)
self._cbFull = ttk.TTkCheckbox(text="Full",checked=True)
self._cbPal = ttk.TTkCheckbox(text="Palette",checked=True)
self.addWidget(btn_exLa ,0,0)
self.addWidget(btn_exIm ,0,1)
self.addWidget(btn_exPr ,0,2)
self.addWidget(self._cbCrop,0,3)
self.addWidget(self._cbFull,0,4)
self.addWidget(self._cbPal ,0,5)
self.addWidget(self._te,1,0,1,7)
btn_exLa.clicked.connect(self._exportLayer)
btn_exPr.clicked.connect(self._exportDocument)
btn_exIm.clicked.connect(self._exportImage)
@ttk.pyTTkSlot()
def _exportImage(self):
import base64, gzip
crop = self._cbCrop.isChecked()
palette = self._cbPal.isChecked()
full = self._cbFull.isChecked()
image = self._paintArea.exportImage()
# trim the lines
imagexxx = [line.rstrip() for line in image.split("\n")]
image = "\n".join(imagexxx)
self._te.setText(image)
self._te.append("\n")
self._te.append(ttk.TTkString("# Python Code",ttk.TTkColor.GREEN))
lines = [f' "{line}\\n"' for line in image.replace("\033","\\033").split('\n')]
mergedLines = "\n".join(lines)
self._te.append(f"image = (\n{mergedLines})")
self._te.append('print(image)')
self._te.append("\n")
self._te.append(ttk.TTkString("# Python Code using pyTermTk archive",ttk.TTkColor.GREEN))
self._te.append('from TermTk import TTkUtil\n')
self._te.append('image = TTkUtil.base64_deflate_2_obj(')
b64str = ttk.TTkUtil.obj_inflate_2_base64(image)
b64list = ' "' + '" +\n "'.join([b64str[i:i+128] for i in range(0,len(b64str),128)]) + '")'
self._te.append(b64list)
self._te.append('print(image)')
self._te.append("\n")
self._te.append(ttk.TTkString("# Python Code using standard archive libs",ttk.TTkColor.GREEN))
b64str = base64.b64encode(gzip.compress(bytearray(image,encoding='utf8'))).decode("ascii")
self._te.append('import zlib, pickle, base64\n')
self._te.append('image = pickle.loads(zlib.decompress(base64.b64decode((')
b64str = ttk.TTkUtil.obj_inflate_2_base64(image)
b64list = ' "' + '" +\n "'.join([b64str[i:i+128] for i in range(0,len(b64str),128)]) + '").encode("ascii"))))'
self._te.append(b64list)
self._te.append('print(image)')
self._te.append("\n")
self._te.append(ttk.TTkString("# Bash Code",ttk.TTkColor.GREEN))
lines = [f'echo -e "{line}"' for line in image.replace("\033","\\033").split('\n')]
mergedLines = "\n".join(lines)
self._te.append(mergedLines)
self._te.append("\n")
self._te.append(ttk.TTkString("# Bash Code Compressed",ttk.TTkColor.GREEN))
b64str = base64.b64encode(gzip.compress(bytearray(image,encoding='utf8'))).decode("ascii")
b64list = "\n".join([b64str[i:i+128] for i in range(0,len(b64str),128)])
self._te.append(f'echo "{b64list}" | base64 -d | zcat\n')
@ttk.pyTTkSlot()
def _exportLayer(self):
crop = self._cbCrop.isChecked()
palette = self._cbPal.isChecked()
full = self._cbFull.isChecked()
dd = self._paintArea.exportLayer(full=full,palette=palette,crop=crop)
if not dd:
self._te.setText('# No Data toi be saved!!!')
return
self._te.setText('# Compressed Data:')
self._te.append('data = TTkUtil.base64_deflate_2_obj(')
b64str = ttk.TTkUtil.obj_inflate_2_base64(dd)
b64list = ' "' + '" +\n "'.join([b64str[i:i+128] for i in range(0,len(b64str),128)]) + '")'
self._te.append(b64list)
self._te.append('\n# Uncompressed Data:')
outTxt = '{\n'
for i in dd:
if i in ('data','colors','palette'): continue
if type(dd[i]) == str:
outTxt += f" '{i}':'{dd[i]}',\n"
else:
outTxt += f" '{i}':{dd[i]},\n"
outTxt += " 'data':[\n"
for l in dd['data']:
outTxt += f" {l},\n"
outTxt += " ],'colors':[\n"
for l in dd['colors']:
outTxt += f" {l},\n"
if 'palette' in dd:
outTxt += " ],'palette':["
for i,l in enumerate(dd['palette']):
if not i%10:
outTxt += f"\n "
outTxt += f"{l},"
outTxt += "]}\n"
self._te.append(outTxt)
@ttk.pyTTkSlot()
def _exportDocument(self):
crop = self._cbCrop.isChecked()
palette = self._cbPal.isChecked()
full = self._cbFull.isChecked()
dd = self._paintArea.exportDocument(full=full,palette=palette,crop=crop)
if not dd:
self._te.setText('# No Data to be saved!!!')
return
self._te.setText('# Compressed Data:')
self._te.append('data = TTkUtil.base64_deflate_2_obj(')
b64str = ttk.TTkUtil.obj_inflate_2_base64(dd)
b64list = ' "' + '" +\n "'.join([b64str[i:i+128] for i in range(0,len(b64str),128)]) + '")'
self._te.append(b64list)
self._te.append('\n# Uncompressed Data:')
outTxt = '{\n'
for i in dd:
if i=='layers': continue
if type(dd[i]) == str:
outTxt += f" '{i}':'{dd[i]}',\n"
else:
outTxt += f" '{i}':{dd[i]},\n"
outTxt += " 'layers':[\n"
for l in dd['layers']:
outTxt += f" {l},\n"
outTxt += "]}\n"
self._te.append(outTxt)