Browse Source

Merge pull request #16 from ceccopierangiolieugenio/TTK_String

TTkString
pull/17/head
Ceccopierangiolieugenio 5 years ago committed by GitHub
parent
commit
43daf85537
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      TermTk/TTkCore/__init__.py
  2. 50
      TermTk/TTkCore/canvas.py
  3. 4
      TermTk/TTkCore/color.py
  4. 115
      TermTk/TTkCore/string.py
  5. 20
      TermTk/TTkWidgets/texedit.py
  6. 4
      demo/gittk.py
  7. 71
      tests/test.draw.003.py

1
TermTk/TTkCore/__init__.py

@ -3,4 +3,5 @@ from .cfg import *
from .signal import pyTTkSlot, pyTTkSignal
from .ttk import *
from .color import *
from .string import *
from .timer import *

50
TermTk/TTkCore/canvas.py

@ -29,6 +29,7 @@ from TermTk.TTkCore.constant import TTkK
from TermTk.TTkCore.log import TTkLog
from TermTk.TTkCore.cfg import TTkCfg, TTkGlbl
from TermTk.TTkCore.color import TTkColor
from TermTk.TTkCore.string import TTkString
from TermTk.TTkCore.helper import TTkHelper
class TTkCanvas:
@ -120,9 +121,8 @@ class TTkCanvas:
self._visible = True
def _set(self, _y, _x, _ch, _col=TTkColor.RST):
if _y < self._height and \
_x < self._width and \
_x >= 0 and _y >=0 :
if 0 <= _y < self._height and \
0 <= _x < self._width :
self._data[_y][_x] = _ch
self._colors[_y][_x] = _col.mod(_x,_y)
@ -190,30 +190,38 @@ class TTkCanvas:
def drawText(self, pos, text, width=None, color=TTkColor.RST, alignment=TTkK.NONE):
if not self._visible: return
x,y = pos
if x<0 or x>=self._width or \
y<0 or y>=self._height : return
lentxt = len(text)
if width is None or width<0:
width = lentxt
x,y = pos
if lentxt < width:
pad = width-lentxt
if alignment in [TTkK.NONE, TTkK.LEFT_ALIGN]:
text = text + " "*pad
elif alignment == TTkK.RIGHT_ALIGN:
text = " "*pad + text
elif alignment == TTkK.CENTER_ALIGN:
p1 = pad//2
p2 = pad-p1
text = " "*p1 + text+" "*p2
elif alignment == TTkK.JUSTIFY:
# TODO: Text Justification
text = text + " "*pad
if isinstance(text, TTkString):
text = text.align(width=width, alignment=alignment, color=color)
txt, colors = text.getData()
for i in range(x,min(self._width,x+len(txt))):
self._set(y, i, txt[i-x], colors[i-x])
else:
text=text[:width]
if lentxt < width:
pad = width-lentxt
if alignment in [TTkK.NONE, TTkK.LEFT_ALIGN]:
text = text + " "*pad
elif alignment == TTkK.RIGHT_ALIGN:
text = " "*pad + text
elif alignment == TTkK.CENTER_ALIGN:
p1 = pad//2
p2 = pad-p1
text = " "*p1 + text+" "*p2
elif alignment == TTkK.JUSTIFY:
# TODO: Text Justification
text = text + " "*pad
else:
text=text[:width]
arr = list(text)
for i in range(0, len(arr)):
self._set(y, x+i, arr[i], color)
arr = list(text)
for i in range(0, len(arr)):
self._set(y, x+i, arr[i], color)
def drawBoxTitle(self, pos, size, text, align=TTkK.CENTER_ALIGN, color=TTkColor.RST, colorText=TTkColor.RST, grid=0):
if not self._visible: return

4
TermTk/TTkCore/color.py

@ -227,7 +227,7 @@ class TTkColor(_TTkColor):
color = args[0]
else:
color = kwargs.get('color', "" )
return _TTkColor(fg=TTkHelper.Color.fg(color), colorMod=mod)
return TTkColor(fg=TTkHelper.Color.fg(color), colorMod=mod)
@staticmethod
def bg(*args, **kwargs):
@ -236,5 +236,5 @@ class TTkColor(_TTkColor):
color = args[0]
else:
color = kwargs.get('color', "" )
return _TTkColor(bg=TTkHelper.Color.bg(color), colorMod=mod)
return TTkColor(bg=TTkHelper.Color.bg(color), colorMod=mod)

115
TermTk/TTkCore/string.py

@ -0,0 +1,115 @@
#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 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.
from TermTk.TTkCore.constant import TTkK
from TermTk.TTkCore.log import TTkLog
from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal
from TermTk.TTkCore.color import TTkColor
class TTkString():
__slots__ = ('_text','_colors','_baseColor')
def __init__(self):
self._baseColor = TTkColor.RST
self._text = ""
self._colors = []
def __len__(self):
return len(self._text)
def __str__(self):
return self._text
def __add__(self, other):
ret = TTkString()
ret._baseColor = self._baseColor
if isinstance(other, TTkString):
ret._text = self._text + other._text
ret._colors = self._colors + other._colors
elif isinstance(other, str):
ret._text = self._text + other
ret._colors = self._colors + [self._baseColor]*len(other)
elif isinstance(other, TTkColor):
ret._text = self._text
ret._colors = self._colors
ret._baseColor = other
return ret
def __radd__(self, other):
ret = TTkString()
ret._baseColor = self._baseColor
if isinstance(other, TTkString):
ret._text = other._text + self._text
ret._colors = other._colors + self._colors
elif isinstance(other, str):
ret._text = other + self._text
ret._colors = [self._baseColor]*len(other) + self._colors
return ret
def __setitem__(self, index, value):
raise NotImplementedError()
def __getitem__(self, index):
raise NotImplementedError()
def toAansi(self):
out = ""
color = None
for ch, col in zip(self._text, self._colors):
if col != color:
color = col
out += str(TTkColor.RST) + str(color)
out += ch
return out
def align(self, width=None, color=TTkColor.RST, alignment=TTkK.NONE):
lentxt = len(self._text)
if not width or width == lentxt: return self
ret = TTkString()
if lentxt < width:
pad = width-lentxt
if alignment in [TTkK.NONE, TTkK.LEFT_ALIGN]:
ret._text = self._text + " " *pad
ret._colors = self._colors + [color]*pad
elif alignment == TTkK.RIGHT_ALIGN:
ret._text = " " *pad + self._text
ret._colors = [color]*pad + self._colors
elif alignment == TTkK.CENTER_ALIGN:
p1 = pad//2
p2 = pad-p1
ret._text = " " *p1 + self._text + " " *p2
ret._colors = [color]*p1 + self._colors + [color]*p2
elif alignment == TTkK.JUSTIFY:
# TODO: Text Justification
ret._text = self._text + " " *pad
ret._colors = self._colors + [color]*pad
else:
ret._text = self._text[:width]
ret._colors = self._colors[:width]
return ret
def getData(self):
return (self._text,self._colors)

20
TermTk/TTkWidgets/texedit.py

@ -27,6 +27,7 @@ from TermTk.TTkCore.log import TTkLog
from TermTk.TTkWidgets.widget import *
from TermTk.TTkLayouts.gridlayout import TTkGridLayout
from TermTk.TTkCore.color import TTkColor
from TermTk.TTkCore.string import TTkString
from TermTk.TTkWidgets.scrollbar import TTkScrollBar
from TermTk.TTkAbstract.abstractscrollarea import TTkAbstractScrollArea
from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView
@ -41,13 +42,13 @@ class _TTkTextEditView(TTkAbstractScrollView):
@pyTTkSlot(str)
def setText(self, text):
self._lines = [(TTkColor.RST, line) for line in text.split('\n')]
self._lines = [line for line in text.split('\n')]
self.viewMoveTo(0, 0)
self.viewChanged.emit()
self.update()
@pyTTkSlot(str)
def setColoredLines(self, lines):
def setLines(self, lines):
self._lines = lines
self.viewMoveTo(0, 0)
self.viewChanged.emit()
@ -62,21 +63,14 @@ class _TTkTextEditView(TTkAbstractScrollView):
def paintEvent(self):
_, oy = self.getViewOffsets()
for y, t in enumerate(self._lines[oy:]):
self._canvas.drawText(pos=(0,y), text=t[1], color=t[0])
self._canvas.drawText(pos=(0,y), text=t)
class TTkTextEdit(TTkAbstractScrollArea):
__slots__ = ('_textEditView')
__slots__ = ('_textEditView', 'setText', 'setColoredLines')
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self._name = kwargs.get('name' , 'TTkTextEdit' )
self._textEditView = _TTkTextEditView()
self.setViewport(self._textEditView)
@pyTTkSlot(str)
def setText(self, text):
self._textEditView.setText(text)
@pyTTkSlot(str)
def setColoredLines(self, lines):
self._textEditView.setColoredLines(lines)
self.setText = self._textEditView.setText
self.setLines = self._textEditView.setLines

4
demo/gittk.py

@ -93,8 +93,8 @@ def _tableCallback(val):
color = ttk.TTkColor.fg('#ff0000')
elif line.startswith('@@'):
color = ttk.TTkColor.fg('#0088ff')
lines.append((color,line))
diffText.setColoredLines(lines)
lines.append(ttk.TTkString() + color + line.replace('\t',' '*4))
diffText.setLines(lines)
tableCommit.activated.connect(_tableCallback)

71
tests/test.draw.003.py

@ -0,0 +1,71 @@
#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 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 sys, os
import logging
import time
sys.path.append(os.path.join(sys.path[0],'..'))
from TermTk.libbpytop import Term, Mv, Color
from TermTk import TTkLog
from TermTk.TTkCore import TTkColor
from TermTk.TTkCore import TTkHelper
from TermTk.TTkCore import TTkString
TTkLog.use_default_file_logging()
Term.init(mouse=False)
TTkLog.info("Starting")
s1 = TTkString() + "Text " + "Text 1"
s2 = TTkString() + TTkColor.fg("#ff0000") + "Test " + "Text 2"
s3 = TTkString() + TTkColor.bg("#550088") + "Test " + "Text 3"
s4 = TTkString() + ( TTkColor.fg("#00ff00") +
TTkColor.bg("#555500") ) + "Test " + TTkColor.bg("#880055") + "Text 4"
Term.push(
TTkHelper.Mv.t(2,4) + # Cursor x:2, y:4
s1.toAansi() )
time.sleep(1)
TTkLog.info("next : 3")
Term.push(
TTkHelper.Mv.d(1) + Mv.l(3) + # Cursor 1 Down, 3 Left
s2.toAansi() )
time.sleep(1)
TTkLog.info("next : 2")
Term.push(
TTkHelper.Mv.d(1) + Mv.l(3) + # Cursor 1 Down, 3 Left
s3.toAansi() )
time.sleep(1)
TTkLog.info("next : 1")
Term.push(
TTkHelper.Mv.d(1) + Mv.l(3) + # Cursor 1 Down, 3 Left
s4.toAansi() )
time.sleep(3)
TTkLog.info("Ending")
Term.exit()
Loading…
Cancel
Save