Browse Source

Fixed alignment when next/prev char is selected, fixed handling of tabls and unicode var sized chars

pull/68/head
Eugenio Parodi 3 years ago
parent
commit
1a2e43a153
  1. 34
      TermTk/TTkCore/string.py
  2. 13
      TermTk/TTkGui/textcursor.py
  3. 2
      TermTk/TTkGui/textwrap.py
  4. 4
      tests/test.draw.006.py

34
TermTk/TTkCore/string.py

@ -236,7 +236,7 @@ class TTkString():
pp = 0
for i,ch in enumerate(self._text):
if ch=='\t':
pass
pp += tabSpaces - (pp+tabSpaces)%tabSpaces
elif unicodedata.east_asian_width(ch) == 'W':
pp += 2
elif unicodedata.category(ch) in ('Me','Mn'):
@ -513,8 +513,30 @@ class TTkString():
@staticmethod
def _getWidthText(txt):
return ( len(txt) +
sum(unicodedata.east_asian_width(ch) == 'W' for ch in txt) -
sum(unicodedata.category(ch) in ('Me','Mn') for ch in txt) )
sum(unicodedata.east_asian_width(ch) == 'W' for ch in txt) -
sum(unicodedata.category(ch) in ('Me','Mn') for ch in txt) )
@staticmethod
def _getLenTextWoZero(txt):
return ( len(txt) -
sum(unicodedata.category(ch) in ('Me','Mn') for ch in txt) )
def nextPos(self, pos):
pos += 1
for i,ch in enumerate(self._text[pos:]):
if not unicodedata.category(ch) in ('Me','Mn'):
return pos+i
return len(self._text)
def prevPos(self, pos):
# from TermTk.TTkCore.log import TTkLog
# TTkLog.debug(f"->{self._text[:pos]}<- {pos=}")
# TTkLog.debug(f"{str(reversed(self._text[:pos]))} {pos=}")
for i,ch in enumerate(reversed(self._text[:pos])):
# TTkLog.debug(f"{i}---> {ch} ")
if not unicodedata.category(ch) in ('Me','Mn'):
return pos-i-1
return 0
def _checkWidth(self):
self._hasSpecialWidth = (
@ -538,7 +560,11 @@ class TTkString():
retTxt += (ch,'')
retCol += (self._colors[i],self._colors[i])
elif unicodedata.category(ch) in ('Me','Mn'):
retTxt[-1]+=ch
if retTxt:
retTxt[-1]+=ch
else:
retTxt = [f" {ch}"]
retCol = [TTkColor.RST]
else:
retTxt.append(ch)
retCol.append(self._colors[i])

13
TermTk/TTkGui/textcursor.py

@ -283,12 +283,14 @@ class TTkTextCursor():
currPos = self.position().toNum()
def moveRight(cID,p,_):
if p.pos < len(self._document._dataLines[p.line]):
self.setPosition(p.line, p.pos+1, moveMode, cID=cID)
nextPos = self._document._dataLines[p.line].nextPos(p.pos)
self.setPosition(p.line, nextPos, moveMode, cID=cID)
elif p.line < len(self._document._dataLines)-1:
self.setPosition(p.line+1, 0, moveMode, cID=cID)
def moveLeft(cID,p,_):
if p.pos > 0:
self.setPosition(p.line, p.pos-1, moveMode, cID=cID)
prevPos = self._document._dataLines[p.line].prevPos(p.pos)
self.setPosition(p.line, prevPos, moveMode, cID=cID)
elif p.line > 0:
self.setPosition(p.line-1, len(self._document._dataLines[p.line-1]) , moveMode, cID=cID)
def moveUpDown(offset):
@ -327,10 +329,13 @@ class TTkTextCursor():
# the newline is not replaced
for p in self._properties:
if not p.hasSelection():
line = p.position.line
line = p.position.line
pos = p.position.pos
lenWoZero = TTkString._getLenTextWoZero(text)
size = len(self._document._dataLines[line])
pos = min(size,pos+len(text))
for _ in range(lenWoZero):
pos = self._document._dataLines[line].nextPos(pos)
pos = min(size,pos)
p.anchor.set(line,pos)
return self.insertText(text)

2
TermTk/TTkGui/textwrap.py

@ -91,7 +91,7 @@ class TTkTextWrap():
return
while len(l):
fl = l.tab2spaces(self._tabSpaces)
if len(fl) <= w:
if fl.termWidth() <= w:
self._lines.append((i,(fr,fr+len(l)+1)))
l=[]
else:

4
tests/test.draw.006.py

@ -51,12 +51,16 @@ s3 = TTkString(f"Zero Size: - o{zc1} o{zc2} o{zc3} o{zc1}{zc2} o{zc1}{zc2}{z
s4 = TTkString("This is a normal string")
s5 = TTkString(f"-😁😂😍😎- o{zc1} o{zc2} o{zc3} o{zc1}{zc2} o{zc1}{zc2}{zc3} -")
s6 = TTkString(f"{zc1} o{zc2} o{zc3} o{zc1}{zc2} o{zc1}{zc2}{zc3} -")
print(f"o{zc1}{zc2}{zc3} - XXXX")
print(f"{zc1}{zc2}{zc3} - XXXX")
print(s1.getData()[0])
print(s2.getData()[0])
print(s3.getData()[0])
print(s4.getData()[0])
print(s5.getData()[0])
print(s6.getData()[0])
s5.tabCharPos(1,tabSpaces=4)
s5.tabCharPos(5,tabSpaces=4)

Loading…
Cancel
Save