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.
 
 
 
 
 

190 lines
26 KiB

#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2022 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 argparse
import os
import sys
import time
sys.path.append(os.path.join(sys.path[0],'../libs/pyTermTk'))
from TermTk import TTk, TTkGridLayout, TTkK, TTkWidget, TTkWindow, TTkColor, TTkRadioButton, TTkSpacer
parser = argparse.ArgumentParser()
parser.add_argument('-f', help='Full Screen', action='store_true')
args = parser.parse_args()
fullscreen = args.f
class PaintCanvas(TTkWidget):
__slots__ = ('_pressPos', '_dragPos', '_boxes', '_double')
def __init__(self, *args, **kwargs):
self._pressPos = None
self._dragPos = None
self._double = False
self._boxes = []
TTkWidget.__init__(self, *args, **kwargs)
self.setFocusPolicy(TTkK.ClickFocus)
def setLine(self, type):
self._double = type==1
def resizeEvent(self, w: int, h: int):
self._updateMap()
def mousePressEvent(self, evt):
self._pressPos = (evt.x, evt.y)
self.update()
return True
def mouseReleaseEvent(self, evt) -> bool:
if self._pressPos and self._dragPos:
x = min(self._pressPos[0], self._dragPos[0])
y = min(self._pressPos[1], self._dragPos[1])
w = max(self._pressPos[0]-x, self._dragPos[0]-x)-1
h = max(self._pressPos[1]-y, self._dragPos[1]-y)-1
if w>0 and h>0:
self._boxes.append(((x,y),(w,h),self._double))
self._pressPos = None
self._dragPos = None
self._updateMap()
self.update()
return True
def mouseDragEvent(self, evt) -> bool:
self._dragPos = (evt.x+1, evt.y+1)
self.update()
return True
def _updateMap(self):
_,_,w,h = self.geometry()
self._map = [ [' ']*h for _ in range(w) ]
def _place(a,b,c):
if not (0<=a<w and 0<=b<h): return
xx = self._map[a]
yy = xx[b]
# Map generated using: tools/genMapBoxes.py
self._map[a][b] = {
' ' : { ' ':' ', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'X', '':'', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', } ,
'' : { ' ':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'X', '':'X', '':'X', '':'X', '':'', '':'', '':'', '':'', '':'', '':'', } ,
}.get(self._map[a][b],{}).get(c,'0')
for b in self._boxes:
x1 = b[0][0]
x2 = b[0][0]+b[1][0]
y1 = b[0][1]
y2 = b[0][1]+b[1][1]
m = self._map
if b[2]:
c = ['','','','','','']
else:
c = ['','','','','','']
# 4 corners
_place(x1,y1,c[0])
_place(x2,y1,c[1])
_place(x1,y2,c[2])
_place(x2,y2,c[3])
# Top/Bottom Line
for i in range(x1+1,x2):
_place(i,y1,c[4])
_place(i,y2,c[4])
# Left/Right Line
for i in range(y1+1,y2):
_place(x1,i,c[5])
_place(x2,i,c[5])
def paintEvent(self, canvas):
for x,l in enumerate(self._map):
for y,c in enumerate(l):
canvas.drawChar(pos=(x,y), char=c)
# Draw the yellow reference BOX
if self._pressPos and self._dragPos:
x = min(self._pressPos[0], self._dragPos[0])
y = min(self._pressPos[1], self._dragPos[1])
w = max(self._pressPos[0]-x, self._dragPos[0]-x)
h = max(self._pressPos[1]-y, self._dragPos[1]-y)
if w>0 and h>0:
canvas.drawBox(pos=(x,y),size=(w,h), color=TTkColor.fg('#ffff00'))
root = TTk()
if fullscreen:
paint = root
root.setLayout(TTkGridLayout())
else:
root = TTk()
paint = TTkWindow(parent=root,pos = (1,1), size=(90,45), title="Paint...", border=True, layout=TTkGridLayout())
pc = PaintCanvas()
r1 = TTkRadioButton(text="Single ┼ ", radiogroup="line", maxWidth=12, checked=True)
r2 = TTkRadioButton(text="Double ╬ ", radiogroup="line", maxWidth=12)
r1.clicked.connect( lambda : pc.setLine(0))
r2.clicked.connect( lambda : pc.setLine(1))
paint.layout().addWidget(r1, 0,0,1,1)
paint.layout().addWidget(r2, 0,1,1,1)
paint.layout().addWidget(TTkSpacer(), 0,2,1,1)
paint.layout().addWidget(pc, 1,0,1,3)
root.mainloop()