From e60be0d0322017eb2fa2c5ff0de44e9b33f8a3c9 Mon Sep 17 00:00:00 2001
From: Eugenio Parodi
Date: Wed, 15 Nov 2023 09:52:31 +0000
Subject: [PATCH] Doc Updated
---
.../TTkWidgets/TTkTerminal/terminal.html | 12 +-
.../TTkWidgets/TTkTerminal/terminalview.html | 275 +++++-------------
_modules/TermTk/TTkWidgets/image.html | 135 ++++++++-
.../TermTk.TTkWidgets.TTkTerminal.rst.txt | 1 +
...Widgets.TTkTerminal.terminalhelper.rst.txt | 8 +
_sources/info/installing.rst.txt | 6 +-
....TTkWidgets.TTkTerminal.debugterminal.html | 1 +
.../TermTk.TTkWidgets.TTkTerminal.html | 10 +-
.../TermTk.TTkWidgets.TTkTerminal.mode.html | 1 +
...ermTk.TTkWidgets.TTkTerminal.terminal.html | 1 +
...TkWidgets.TTkTerminal.terminal_screen.html | 1 +
...idgets.TTkTerminal.terminal_screen_C1.html | 1 +
...dgets.TTkTerminal.terminal_screen_CSI.html | 5 +-
...TTkWidgets.TTkTerminal.terminalhelper.html | 158 ++++++++++
...k.TTkWidgets.TTkTerminal.terminalview.html | 5 +-
...gets.TTkTerminal.terminalview_CSI_DEC.html | 1 +
.../TermTk.TTkWidgets.TTkTerminal.vt102.html | 1 +
autogen.TermTk/TermTk.TTkWidgets.image.html | 2 +-
genindex.html | 13 +-
info/installing.html | 6 +-
objects.inv | Bin 27096 -> 27126 bytes
py-modindex.html | 5 +
searchindex.js | 2 +-
23 files changed, 417 insertions(+), 233 deletions(-)
create mode 100644 _sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminalhelper.rst.txt
create mode 100644 autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminalhelper.html
diff --git a/_modules/TermTk/TTkWidgets/TTkTerminal/terminal.html b/_modules/TermTk/TTkWidgets/TTkTerminal/terminal.html
index dabf7a5d..a28fe8f5 100644
--- a/_modules/TermTk/TTkWidgets/TTkTerminal/terminal.html
+++ b/_modules/TermTk/TTkWidgets/TTkTerminal/terminal.html
@@ -144,9 +144,10 @@
'''
__slots__ = ('_terminalView',
# Exported methods
- 'runShell',
+ 'termWrite',
# Exported Signals
- 'titleChanged', 'bell', 'terminalClosed', 'textSelected')
+ 'titleChanged', 'bell', 'terminalClosed', 'textSelected',
+ 'termData', 'termResized')
def __init__(self, *args, **kwargs):
TTkAbstractScrollArea.__init__(self, *args, **kwargs)
if 'parent' in kwargs: kwargs.pop('parent')
@@ -155,12 +156,15 @@
self.setViewport(self._terminalView)
# Export Methods
- self.runShell = self._terminalView.runShell
+ self.termWrite = self._terminalView.termWrite
# Export Signals
+ self.bell = self._terminalView.bell
+ self.termData = self._terminalView.termData
+ self.termResized = self._terminalView.termResized
self.titleChanged = self._terminalView.titleChanged
- self.bell = self._terminalView.bell
self.textSelected = self._terminalView.textSelected
+
self.terminalClosed = pyTTkSignal(TTkTerminal)
self._terminalView.terminalClosed.connect(lambda : self.terminalClosed.emit(self))
diff --git a/_modules/TermTk/TTkWidgets/TTkTerminal/terminalview.html b/_modules/TermTk/TTkWidgets/TTkTerminal/terminalview.html
index c6fcfc85..2daff3cc 100644
--- a/_modules/TermTk/TTkWidgets/TTkTerminal/terminalview.html
+++ b/_modules/TermTk/TTkWidgets/TTkTerminal/terminalview.html
@@ -128,35 +128,24 @@
__all__ = ['TTkTerminalView']
-import os, pty, threading
-import struct, fcntl, termios
+import re
from dataclasses import dataclass
-import re
-from select import select
from TermTk.TTkCore.canvas import TTkCanvas
from TermTk.TTkCore.color import TTkColor
from TermTk.TTkCore.log import TTkLog
from TermTk.TTkCore.constant import TTkK
-from TermTk.TTkCore.cfg import TTkCfg
from TermTk.TTkCore.string import TTkString
from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot
-from TermTk.TTkCore.helper import TTkHelper
+
from TermTk.TTkGui.clipboard import TTkClipboard
-from TermTk.TTkGui.textwrap1 import TTkTextWrap
-from TermTk.TTkGui.textcursor import TTkTextCursor
-from TermTk.TTkGui.textdocument import TTkTextDocument
-from TermTk.TTkLayouts.gridlayout import TTkGridLayout
-from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea
-from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView, TTkAbstractScrollViewGridLayout
-from TermTk.TTkWidgets.widget import TTkWidget
+
+from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView
from TermTk.TTkWidgets.TTkTerminal.terminal_screen import _TTkTerminalScreen
from TermTk.TTkWidgets.TTkTerminal.mode import TTkTerminalModes
-from TermTk.TTkWidgets.TTkTerminal.vt102 import TTkVT102
-
from TermTk.TTkCore.TTkTerm.colors import TTkTermColor
from TermTk.TTkCore.TTkTerm.colors_ansi_map import ansiMap16, ansiMap256
@@ -195,48 +184,43 @@
reportMove: bool = False
sgrMode: bool = False
- __slots__ = ('_shell', '_fd', '_inout', '_pid',
- '_quit_pipe', '_resize_pipe',
- '_mode_normal'
- '_clipboard', '_selecting',
- '_buffer_lines', '_buffer_screen',
- '_keyboard', '_mouse', '_terminal',
- '_screen_current', '_screen_normal', '_screen_alt',
- # Signals
- 'titleChanged', 'bell', 'terminalClosed', 'textSelected')
+ __slots__ = (
+ '_termLoop', '_newSize',
+ '_clipboard', '_selecting',
+ '_buffer_lines', '_buffer_screen',
+ '_keyboard', '_mouse', '_terminal',
+ '_screen_current', '_screen_normal', '_screen_alt',
+ # Signals
+ 'bell',
+ 'titleChanged', 'terminalClosed', 'textSelected',
+ 'termData','termResized')
def __init__(self, *args, **kwargs):
self.bell = pyTTkSignal()
self.terminalClosed = pyTTkSignal()
self.titleChanged = pyTTkSignal(str)
self.textSelected = pyTTkSignal(str)
- self._shell = os.environ.get('SHELL', 'sh')
- self._fd = None
- self._inout = None
- self._pid = None
- self._mode_normal = True
- self._quit_pipe = None
- self._resize_pipe = None
+ self.termData = pyTTkSignal(str)
+ self.termResized = pyTTkSignal(int,int)
+ self._newSize = None
self._terminal = TTkTerminalView._Terminal()
self._keyboard = TTkTerminalView._Keyboard()
self._mouse = TTkTerminalView._Mouse()
self._buffer_lines = [TTkString()]
- # self._screen_normal = _TTkTerminalNormalScreen()
self._screen_normal = _TTkTerminalScreen()
self._screen_alt = _TTkTerminalScreen()
self._screen_current = self._screen_normal
self._clipboard = TTkClipboard()
self._selecting = False
- # self._screen_normal.bell.connect(lambda : _termLog.debug("BELL!!! 🔔🔔🔔"))
- # self._screen_alt.bell.connect( lambda : _termLog.debug("BELL!!! 🔔🔔🔔"))
self._screen_normal.bell.connect(self.bell.emit)
self._screen_alt.bell.connect( self.bell.emit)
- super().__init__(*args, **kwargs)
+ self._termLoop = self._loopGenerator()
+ next(self._termLoop)
+ self._termLoop.send("")
- # self._screen_alt._CSI_MAP |= self._CSI_MAP
- # self._screen_current._CSI_MAP |= self._CSI_MAP
+ super().__init__(*args, **kwargs)
w,h = self.size()
self._screen_alt.resize(w,h)
@@ -244,7 +228,6 @@
self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus)
self.enableWidgetCursor()
- TTkHelper.quitEvent.connect(self._quit)
self.viewChanged.connect(self._viewChangedHandler)
self._screen_normal.bufferedLinesChanged.connect(self._screenChanged)
self._screen_alt.bufferedLinesChanged.connect(self._screenChanged)
@@ -269,149 +252,54 @@
[docs] def close(self):
self._quit()
- def _resizeScreen(self):
- w,h = self.size()
- if w<=0 or h<=0: return
- self._screen_current.resize(w,h)
- if self._fd:
- # s = struct.pack('HHHH', 0, 0, 0, 0)
- # t = fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ, s)
- # print(struct.unpack('HHHH', t))
- s = struct.pack('HHHH', h, w, 0, 0)
- t = fcntl.ioctl(self._fd, termios.TIOCSWINSZ, s)
- # termios.tcsetwinsize(self._fd,(h,w))
-
[docs] def resizeEvent(self, w: int, h: int):
-
if ( self._resize_pipe and
-
( self._screen_current._w != w or
-
self._screen_current._h != h ) ):
-
os.write(self._resize_pipe[1], b'resize')
-
+
self._newSize = (w,h)
# self._screen_alt.resize(w,h)
# self._screen_normal.resize(w,h)
-
-
_termLog.info(f"Resize Terminal: {w=} {h=}")
+
self.termResized.emit(w,h)
return super().resizeEvent(w, h)
- def runShell(self, program=None):
- self._shell = program if program else self._shell
-
- self._pid, self._fd = pty.fork()
-
- if self._pid == 0:
- def _spawnTerminal(argv=[self._shell], env=os.environ):
- os.execvpe(argv[0], argv, env)
- # threading.Thread(target=_spawnTerminal).start()
- # TTkHelper.quit()
- _spawnTerminal()
- import sys
- sys.exit()
- # os.execvpe(argv[0], argv, env)
- # os.execvpe(argv[0], argv, env)
- # self._proc = subprocess.Popen(self._shell)
- # _termLog.debug(f"Terminal PID={self._proc.pid=}")
- # self._proc.wait()
- else:
- self._inout = os.fdopen(self._fd, "w+b", 0)
- name = os.ttyname(self._fd)
- _termLog.debug(f"{self._pid=} {self._fd=} {name}")
-
- self._quit_pipe = os.pipe()
- self._resize_pipe = os.pipe()
-
- threading.Thread(target=self.loop,args=[self]).start()
-
- # def _wait(v, pid=self._pid):
- # TTkLog.debug(f"Wait Terminal {v=} {self._pid=}")
- # status = os.wait()
- # TTkLog.debug(f"In parent process- {status=} {self._pid=}")
- # TTkLog.debug(f"Terminated child's process id: {status[0]}")
- # TTkLog.debug(f"Signal number that killed the child process: {status[1]}")
- # threading.Thread(target=_wait,args=[self]).start()
-
- w,h = self.size()
- self.resizeEvent(w,h)
-
# xterm escape sequences from:
# https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
# https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s_
- re_CURSOR = re.compile('^\[((\d*)(;(\d*))*)([@^`A-Za-z])')
+ re_CURSOR = re.compile(r'^\[((\d*)(;(\d*))*)([@^`A-Za-z])')
# https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s_
# Basic Re for CSI Ps matches:
# CSI : Control Sequence Introducer "<ESC>[" = '\033['
# Ps : A single (usually optional) numeric parameter, composed of one or more digits.
# fn : the single char defining the function
- re_CSI_Ps_fu = re.compile('^\[(\d*)([@ABCDEFGIJKLMPSTXZ^`abcdeghinqx])')
- re_CSI_Ps_Ps_fu = re.compile('^\[(\d*);(\d*)([Hf])')
+ re_CSI_Ps_fu = re.compile(r'^\[(\d*)([@ABCDEFGIJKLMPSTXZ^`abcdeghinqx])')
+ re_CSI_Ps_Ps_fu = re.compile(r'^\[(\d*);(\d*)([Hf])')
- re_DEC_SET_RST = re.compile('^\[(\??)(\d+)([lh])')
+ re_DEC_SET_RST = re.compile(r'^\[(\??)(\d+)([lh])')
# re_CURSOR_1 = re.compile(r'^(\d+)([ABCDEFGIJKLMPSTXZHf])')
- re_OSC_ps_Pt = re.compile('^(\d*);(.*)$')
+ re_OSC_ps_Pt = re.compile(r'^(\d*);(.*)$')
- re_XTWINOPS = re.compile('^')
+ re_XTWINOPS = re.compile(r'^')
- @pyTTkSlot()
- def _quit(self):
- if self._pid:
- os.kill(self._pid,0)
- os.kill(self._pid,15)
- if self._quit_pipe:
- try:
- os.write(self._quit_pipe[1], b'quit')
- except:
- pass
-
- def _inputGenerator(self):
- while rs := select( [self._inout,self._quit_pipe[0],self._resize_pipe[0]], [], [])[0]:
- if self._quit_pipe[0] in rs:
- # os.close(self._quit_pipe[0])
- os.close(self._quit_pipe[1])
- # os.close(self._resize_pipe[0])
- os.close(self._resize_pipe[1])
- os.close(self._fd)
- return
-
- if self._resize_pipe[0] in rs:
- self._resizeScreen()
- os.read(self._resize_pipe[0],100)
-
- if self._inout not in rs:
- continue
-
- # _termLog.debug(f"Select - {rs=}")
- for r in rs:
- if r is not self._inout:
- continue
+ def termWrite(self, data):
+ if data:
+ self._termLoop.send(data)
- try:
- _fl = fcntl.fcntl(self._inout, fcntl.F_GETFL)
- fcntl.fcntl(self._inout, fcntl.F_SETFL, _fl | os.O_NONBLOCK) # Set the input as NONBLOCK to read the full sequence
- out = b""
- while _out := self._inout.read():
- out += _out
- fcntl.fcntl(self._inout, fcntl.F_SETFL, _fl)
- except Exception as e:
- _termLog.error(f"Error: {e=}")
- self.terminalClosed.emit()
- return
-
- # out = out.decode('utf-8','ignore')
- try:
- out = out.decode()
- except Exception as e:
- _termLog.error(f"{e=}")
- _termLog.error(f"Failed to decode {out}")
- out = out.decode('utf-8','ignore')
-
- yield out
-
- def loop(self, _):
+ def _loopGenerator(self):
+ def _checkSize():
+ if self._newSize:
+ TTkLog.debug(f"{self._newSize=}")
+ self._screen_alt.resize(*self._newSize)
+ self._screen_normal.resize(*self._newSize)
+ self._newSize = None
+ yield
SGR_SET = TTkTermColor.SGR_SET # Precacing those variables to
SGR_RST = TTkTermColor.SGR_RST # speedup the search
- inputgenerator = self._inputGenerator()
leftUnhandled = ""
- for out in inputgenerator:
+ while True:
+ _checkSize()
+ # Entry Point 1
+ out = yield
+ if not out: return
+ _checkSize()
+
sout = (leftUnhandled+out).split('\033')
_termLog.debug(f"{leftUnhandled=} - {sout[0]=}")
@@ -582,23 +470,23 @@
self._terminal.DCSstring += dcs
return False, ""
- def __processDCSInputGenerator(slice):
+ ret, slice = __processDCSEscapeGenerator()
+
+ if not ret:
# If the terminator is not in the current escaped slices
# I need to fetch from the input until I got all of them
# This is not the nicest thing but it save a bunch of extra
# hcecks at any input just to find if we are in DCS mode or not
- for out in inputgenerator:
+ while True:
+ # Entry Point 2
+ out = yield
+ if not out: return (), ""
+
sout = out.split('\033')
self._terminal.DCSstring += sout[0]
escapeGenerator = (i for i in sout[1:])
ret, slice = __processDCSEscapeGenerator()
- if ret:
- return escapeGenerator, slice
-
- ret, slice = __processDCSEscapeGenerator()
-
- if not ret:
- escapeGenerator, slice = __processDCSInputGenerator()
+ if ret: break
if not slice:
continue
@@ -850,26 +738,26 @@
return ret, _slice, __oscString
return False, "", __oscString
- def __processOSCInputGenerator(__oscString:str):
+ ret, slice, oscString = __checkOSCBell(slice,oscString)
+
+ if not ret:
+ ret, slice, oscString = __processOSCEscapeGenerator(oscString)
+
+ if not ret:
# If the terminator is not in the current escaped slices
# I need to fetch from the input until I got all of them
# This is not the nicest thing but it save a bunch of extra
# hcecks at any input just to find if we are in OSC mode or not
- for out in inputgenerator:
+ while True:
+ # Entry Point 3
+ out = yield
+ if not out: return (), ""
+
sout = out.split('\033')
self._terminal.DCSstring += sout[0]
escapeGenerator = (i for i in sout[1:])
- ret, _slice, __oscString = __processOSCEscapeGenerator(__oscString)
- if ret:
- return escapeGenerator, slice, __oscString
-
- ret, slice, oscString = __checkOSCBell(slice,oscString)
-
- if not ret:
- ret, slice, oscString = __processOSCEscapeGenerator(oscString)
-
- if not ret:
- escapeGenerator, slice, oscString = __processOSCInputGenerator(oscString)
+ ret, slice, oscString = __processOSCEscapeGenerator(oscString)
+ if ret: break
_termLog.info(f"OSC: {oscString}")
@@ -918,15 +806,12 @@
def pasteEvent(self, txt:str):
if self._terminal.bracketedMode:
txt = "\033[200~"+txt+"\033[201~"
- if self._inout:
- self._inout.write(txt.encode())
+ self.termData.emit(txt.encode())
return True
[docs] def keyEvent(self, evt):
# _termLog.debug(f"Key: {evt.code=}")
_termLog.debug(f"Key: {str(evt)=}")
-
if not self._inout:
-
return False
if evt.type == TTkK.SpecialKey:
if evt.mod == TTkK.ControlModifier and evt.key == TTkK.Key_V:
txt = self._clipboard.text()
@@ -937,16 +822,16 @@
TTkK.Key_Down: b"\033OB",
TTkK.Key_Right: b"\033OC",
TTkK.Key_Left: b"\033OD"}.get(evt.key):
-
self._inout.write(code)
+
self.termData.emit(code)
return True
# if evt.key == TTkK.Key_Enter:
# _termLog.debug(f"Key: Enter")
-
# # self._inout.write(b'\n')
-
# # self._inout.write(evt.code.encode())
+
# # self.termData.emit(b'\n')
+
# # self.termData.emit(evt.code.encode())
else: # Input char
_termLog.debug(f"Key: {evt.key=}")
-
# self._inout.write(evt.key.encode())
-
self._inout.write(evt.code.encode())
+
# self.termData.emit(evt.key.encode())
+
self.termData.emit(evt.code.encode())
return True
# Extended coordinates
@@ -1023,8 +908,6 @@
# report position in pixels rather than character cells.
def _sendMouse(self, evt):
- if not self._inout:
- return False
if not self._mouse.reportPress:
return False
if ( not self._mouse.reportDrag and
@@ -1053,7 +936,7 @@
TTkK.WHEEL_Down:(k, 1,'M')}.get(
evt.evt,(0,0,'M'))
# _termLog.mouse(f'Mouse: <ESC>[<{k+km};{x};{y}{pr}')
- self._inout.write(f'\033[<{k+km};{x};{y}{pr}'.encode())
+ self.termData.emit(f'\033[<{k+km};{x};{y}{pr}'.encode())
else:
head = {
TTkK.Press: b'\033[M ',
@@ -1068,7 +951,7 @@
bah.append((x+32)%0xff)
bah.append((y+32)%0xff)
# _termLog.mouse(f'Mouse: '+bah.decode().replace('\033','<ESC>'))
- self._inout.write(bah)
+ self.termData.emit(bah)
return True
[docs] def mousePressEvent(self, evt):
@@ -1156,9 +1039,9 @@
def _CSI_n_DSR(self, ps, _):
x,y = self._screen_current.getCursor()
if ps==6:
-
self._inout.write(f"\033[{y+1};{x+1}R".encode())
+
self.termData.emit(f"\033[{y+1};{x+1}R".encode())
elif ps==5:
-
self._inout.write(f"\033[0n".encode())
+
self.termData.emit(f"\033[0n".encode())
# CSI Ps ; Ps ; Ps t
# Window manipulation (XTWINOPS), dtterm, extended by xterm.
diff --git a/_modules/TermTk/TTkWidgets/image.html b/_modules/TermTk/TTkWidgets/image.html
index a2f1e782..769853e9 100644
--- a/_modules/TermTk/TTkWidgets/image.html
+++ b/_modules/TermTk/TTkWidgets/image.html
@@ -129,6 +129,7 @@
__all__ = ['TTkImage']
from TermTk.TTkCore.color import TTkColor
+
from TermTk.TTkCore.canvas import TTkCanvas
from TermTk.TTkCore.string import TTkString
from TermTk.TTkWidgets.widget import TTkWidget
@@ -136,13 +137,45 @@
FULLBLOCK = 0x00
HALFBLOCK = 0x01
QUADBLOCK = 0x02
-
# SEXBLOCK = 0x03
+
SEXBLOCK = 0x03
-
__slots__ = ('_data', '_rasterType')
+
_quadMap =[
+
# 0x00 0x01 0x02 0x03
+
' ', '▘', '▝', '▀',
+
# 0x04 0x05 0x06 0x07
+
'▖', '▌', '▞', '▛',
+
# 0x08 0x09 0x0A 0x0B
+
'▗', '▚', '▐', '▜',
+
# 0x0C 0x0D 0x0E 0x0F
+
'▄', '▙', '▟', '█']
+
+
_sexMap = [
+
# 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
+
' ', '🬀', '🬁', '🬂', '🬃', '🬄', '🬅', '🬆',
+
# 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
+
'🬇', '🬈', '🬉', '🬊', '🬋', '🬌', '🬍', '🬎',
+
+
# 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17
+
'🬏', '🬐', '🬑', '🬒', '🬓', '▌', '🬔', '🬕',
+
# 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
+
'🬖', '🬗', '🬘', '🬙', '🬚', '🬛', '🬜', '🬝',
+
+
# 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
+
'🬞', '🬟', '🬠', '🬡', '🬢', '🬣', '🬤', '🬥',
+
# 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F
+
'🬦', '🬧', '▐', '🬨', '🬩', '🬪', '🬫', '🬬',
+
+
# 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
+
'🬭', '🬮', '🬯', '🬰', '🬱', '🬲', '🬳', '🬴',
+
# 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F
+
'🬵', '🬶', '🬷', '🬸', '🬹', '🬺', '🬻', '█']
+
+
__slots__ = ('_data', '_rasterType', '_canvasImage')
def __init__(self, *args, **kwargs):
TTkWidget.__init__(self, *args, **kwargs)
self._rasterType = kwargs.get('rasteriser' , TTkImage.QUADBLOCK )
self._data = kwargs.get('data' , [] )
+
self._canvasImage = TTkCanvas()
if self._data:
self.setData(self._data)
@@ -151,11 +184,18 @@
w = min(len(i) for i in self._data)
h = len(self._data)
if self._rasterType == TTkImage.FULLBLOCK:
-
self.resize(w,h)
+
w,h = w,h
elif self._rasterType == TTkImage.HALFBLOCK:
-
self.resize(w,h//2)
+
w,h = w,h//2
elif self._rasterType == TTkImage.QUADBLOCK:
-
self.resize(w//2,h//2)
+
w,h = w//2,h//2
+
elif self._rasterType == TTkImage.SEXBLOCK:
+
w,h = w//2,h//3
+
self._canvasImage.resize(*(self.size()))
+
self.resize(w,h)
+
self._canvasImage.resize(w,h)
+
self._canvasImage.updateSize()
+
self._drawImage(self._canvasImage)
self.update()
def setRasteriser(self, rasteriser):
@@ -203,19 +243,66 @@
ch |= 0x04 if closer(c1,c2,l[2]) else 0
ch |= 0x08 if closer(c1,c2,l[3]) else 0
-
# 0x00 0x01 0x02 0x03
-
quad = [ ' ', '▘', '▝', '▀',
-
# 0x04 0x05 0x06 0x07
-
'▖', '▌', '▞', '▛',
-
# 0x08 0x09 0x0A 0x0B
-
'▗', '▚', '▐', '▜',
-
# 0x0C 0x0D 0x0E 0x0F
-
'▄', '▙', '▟', '█']
+
return TTkString() + \
+
(TTkColor.bg(f'#{c1[0]:02X}{c1[1]:02X}{c1[2]:02X}') +
+
TTkColor.fg(f'#{c2[0]:02X}{c2[1]:02X}{c2[2]:02X}')) + \
+
TTkImage._quadMap[ch]
+
+
if deltaR >= deltaG and deltaR >= deltaB:
+
# Use Red as splitter
+
return splitReduce(0)
+
elif deltaG >= deltaB and deltaG >= deltaR:
+
# Use Green as splitter
+
return splitReduce(1)
+
else:
+
# Use Blue as splitter
+
return splitReduce(2)
+
+
def _reduceSex(self, a,b,c,d,e,f):
+
# quadblitter notcurses like
+
l = (a,b,c,d,e,f)
+
def delta(i):
+
return max(v[i] for v in l) - min(v[i] for v in l)
+
deltaR = delta(0)
+
deltaG = delta(1)
+
deltaB = delta(2)
+
+
def midColor(c1,c2):
+
return ((c1[0]+c2[0])//2,(c1[1]+c2[1])//2,(c1[2]+c2[2])//2)
+
+
def closer(a,b,c):
+
return \
+
( (a[0]-c[0])**2 + (a[1]-c[1])**2 + (a[2]-c[2])**2 ) > \
+
( (b[0]-c[0])**2 + (b[1]-c[1])**2 + (b[2]-c[2])**2 )
+
+
def splitReduce(i):
+
s = sorted(l,key=lambda x:x[i])
+
mid = (s[5][i]+s[0][i])//2
+
if s[1][i] < mid:
+
if s[2][i] > mid:
+
c1 = midColor(s[0],s[1])
+
c2 = midColor(s[2],s[3])
+
else:
+
c1 = midColor(s[0],s[1])
+
c1 = midColor(c1,s[2])
+
c2 = s[3]
+
else:
+
c1 = s[0]
+
c2 = midColor(s[1],s[2])
+
c2 = midColor(c1,s[3])
+
+
+
ch = 0x01 if closer(c1,c2,l[0]) else 0
+
ch |= 0x02 if closer(c1,c2,l[1]) else 0
+
ch |= 0x04 if closer(c1,c2,l[2]) else 0
+
ch |= 0x08 if closer(c1,c2,l[3]) else 0
+
ch |= 0x10 if closer(c1,c2,l[4]) else 0
+
ch |= 0x20 if closer(c1,c2,l[5]) else 0
return TTkString() + \
(TTkColor.bg(f'#{c1[0]:02X}{c1[1]:02X}{c1[2]:02X}') +
TTkColor.fg(f'#{c2[0]:02X}{c2[1]:02X}{c2[2]:02X}')) + \
-
quad[ch]
+
TTkImage._sexMap[ch]
if deltaR >= deltaG and deltaR >= deltaB:
# Use Red as splitter
@@ -234,8 +321,9 @@
for i,pixel in enumerate(row):
h,s,l = TTkColor.rgb2hsl(pixel)
row[i] = TTkColor.hsl2rgb(((h+deg)%360,s,l))
+
self.setData(self._data)
-
[docs] def paintEvent(self, canvas):
+
def _drawImage(self, canvas):
img = self._data
if self._rasterType == TTkImage.FULLBLOCK:
for y in range(0, len(img)):
@@ -257,7 +345,22 @@
pos=(x//2,y//2),
text=self._reduceQuad(
img[y][x] , img[y][x+1] ,
-
img[y+1][x] , img[y+1][x+1] ))
+ img[y+1][x] , img[y+1][x+1] ))
+ elif self._rasterType == TTkImage.SEXBLOCK:
+ for y in range(0, len(img)-2, 3):
+ for x in range(0, min(len(img[y])-1,len(img[y+1])-1,len(img[y+2])-1), 2):
+ canvas.drawText(
+ pos=(x//2,y//3),
+ text=self._reduceSex(
+ img[y][x] , img[y][x+1] ,
+ img[y+1][x] , img[y+1][x+1] ,
+ img[y+2][x] , img[y+2][x+1] ))
+
+[docs] def paintEvent(self, canvas: TTkCanvas):
+
w,h=self.size()
+
s = (0,0,w,h)
+
canvas.paintCanvas(self._canvasImage,s,s,s)
+
diff --git a/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.rst.txt b/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.rst.txt
index a8bea4ec..7558f631 100644
--- a/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.rst.txt
+++ b/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.rst.txt
@@ -16,6 +16,7 @@ TermTk.TTkWidgets.TTkTerminal
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+ TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
\ No newline at end of file
diff --git a/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminalhelper.rst.txt b/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminalhelper.rst.txt
new file mode 100644
index 00000000..974860f0
--- /dev/null
+++ b/_sources/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminalhelper.rst.txt
@@ -0,0 +1,8 @@
+
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: TermTk.TTkWidgets.TTkTerminal.terminalhelper
+
+.. currentmodule:: TermTk.TTkWidgets.TTkTerminal.terminalhelper
+
diff --git a/_sources/info/installing.rst.txt b/_sources/info/installing.rst.txt
index a111d8d0..dbb22eba 100644
--- a/_sources/info/installing.rst.txt
+++ b/_sources/info/installing.rst.txt
@@ -120,7 +120,7 @@ Showcase
* messagebox `messagebox.py `_ (`tryItOnline `_)
* splitter `splitter.py `_ (`tryItOnline `_)
* Windows `windowsflags.py `_ (`tryItOnline `_)
-* Tooltip `test.ui.026.toolTip.py `_ (`tryItOnline `_)
+* Tooltip `test.ui.026.toolTip.py `_ (`tryItOnline `_)
.. code:: bash
@@ -147,9 +147,9 @@ Showcase
# Demo - Windows
python3 demo/showcase/windowsflags.py
# Demo - Tooltip
- python3 tests/test.ui.026.toolTip.py
+ python3 tests/t.ui/test.ui.026.toolTip.py
# Text edit with "Pygments" highlight integrated
# it require pygments
# pip install pygments
- python3 tests/test.ui.018.TextEdit.Pygments.py README.md
\ No newline at end of file
+ python3 tests/t.ui/test.ui.018.TextEdit.Pygments.py README.md
\ No newline at end of file
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.debugterminal.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.debugterminal.html
index 3c43fdfc..181122e6 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.debugterminal.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.debugterminal.html
@@ -89,6 +89,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.html
index fbbb22d6..02a6ce1a 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.html
@@ -86,6 +86,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
@@ -144,13 +145,16 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
|
|
-TermTk.TTkWidgets.TTkTerminal.terminalview
|
+
TermTk.TTkWidgets.TTkTerminal.terminalhelper
|
|
-TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
|
+
TermTk.TTkWidgets.TTkTerminal.terminalview
|
|
-TermTk.TTkWidgets.TTkTerminal.vt102
|
+
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
|
+ |
+
+TermTk.TTkWidgets.TTkTerminal.vt102
|
|
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.mode.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.mode.html
index c8541621..5d33ae8c 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.mode.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.mode.html
@@ -89,6 +89,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal.html
index 4c586ee3..c5de0096 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal.html
@@ -89,6 +89,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen.html
index 488c31e2..149235a6 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen.html
@@ -86,6 +86,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1.html
index 5e6bcc23..4647136e 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1.html
@@ -86,6 +86,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
diff --git a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI.html b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI.html
index 218f39f4..246d1833 100644
--- a/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI.html
+++ b/autogen.TermTk/TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI.html
@@ -23,7 +23,7 @@
-
+
@@ -86,6 +86,7 @@
TermTk.TTkWidgets.TTkTerminal.terminal_screen
TermTk.TTkWidgets.TTkTerminal.terminal_screen_C1
TermTk.TTkWidgets.TTkTerminal.terminal_screen_CSI
+TermTk.TTkWidgets.TTkTerminal.terminalhelper
TermTk.TTkWidgets.TTkTerminal.terminalview
TermTk.TTkWidgets.TTkTerminal.terminalview_CSI_DEC
TermTk.TTkWidgets.TTkTerminal.vt102
@@ -128,7 +129,7 @@