|
|
|
|
#!/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()
|