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