Browse Source

Added keyboard cursor movement

pull/22/head
Eugenio Parodi 4 years ago
parent
commit
03c17f1f06
  1. 49
      TermTk/TTkWidgets/texedit.py
  2. 6
      demo/showcase/textedit.py
  3. 3
      docs/MDNotes/TODO.md

49
TermTk/TTkWidgets/texedit.py

@ -24,6 +24,8 @@
import re
import chardet
from TermTk.TTkCore.log import TTkLog
from TermTk.TTkWidgets.widget import *
from TermTk.TTkLayouts.gridlayout import TTkGridLayout
@ -92,7 +94,7 @@ class _TTkTextEditView(TTkAbstractScrollView):
x = self._cursorPos[0]-ox
y = self._cursorPos[1]-oy
if x >= self.width() or y>=self.height() or \
if x > self.width() or y>=self.height() or \
self._selectionFrom != self._selectionTo or \
x<0 or y<0:
TTkHelper.hideCursor()
@ -191,7 +193,50 @@ class _TTkTextEditView(TTkAbstractScrollView):
def keyEvent(self, evt):
if self._readOnly:
return super().keyEvent(evt)
return True
if evt.type == TTkK.SpecialKey:
_,_,w,h = self.geometry()
def _moveCursor(x,y):
y = max(0,min(y,len(self._lines)-1))
# The replace cursor need to be aligned to the chardet
# The Insert cursor must be placed between chars
if self._replace:
x = max(0,min(x,len(self._lines[y])-1))
else:
x = max(0,min(x,len(self._lines[y])))
self._cursorPos = (x,y)
self._selectionFrom = (x,y)
self._selectionTo = (x,y)
# Scroll the area to match the cursor
offx, offy = self.getViewOffsets()
offx = max(min(offx, x),x-w)
offy = max(min(offy, y),y-h+1)
self.viewMoveTo(offx, offy)
# Don't Handle the special tab key, for now
cx = self._cursorPos[0]
cy = self._cursorPos[1]
if evt.key == TTkK.Key_Tab:
return False
if evt.key == TTkK.Key_Up: _moveCursor(cx , cy-1)
elif evt.key == TTkK.Key_Down: _moveCursor(cx , cy+1)
elif evt.key == TTkK.Key_Left: _moveCursor(cx-1, cy )
elif evt.key == TTkK.Key_Right: _moveCursor(cx+1, cy )
elif evt.key == TTkK.Key_End: _moveCursor(len(self._lines[cy]) , cy )
elif evt.key == TTkK.Key_Home: _moveCursor(0 , cy )
elif evt.key == TTkK.Key_PageUp: _moveCursor(cx , cy - h)
elif evt.key == TTkK.Key_PageDown: _moveCursor(cx , cy + h)
elif evt.key == TTkK.Key_Insert:
self._replace = not self._replace
_moveCursor(cx , cy)
elif evt.key == TTkK.Key_Delete: pass
elif evt.key == TTkK.Key_Backspace: pass
if evt.key == TTkK.Key_Enter:
self.returnPressed.emit()
self.update()
return True
else: pass
return super().keyEvent(evt)
def focusInEvent(self):
self._pushCursor()

6
demo/showcase/textedit.py

@ -40,13 +40,13 @@ def randColor():
][random.randint(0,3)]
def getWord():
return ttk.TTkString(random.choice(words),randColor())
def getSentence(a,b):
return ttk.TTkString(" ").join([getWord() for i in range(0,random.randint(a,b))])
def getSentence(a,b,i):
return ttk.TTkString(" ").join([f"{i} "]+[getWord() for i in range(0,random.randint(a,b))])
def demoTextEdit(root=None):
te = ttk.TTkTextEdit(parent=root)
te.setReadOnly(False)
te.setText(ttk.TTkString('\n').join([ getSentence(5,25) for _ in range(50)]))
te.setText(ttk.TTkString('\n').join([ getSentence(5,25,i) for i in range(50)]))
return te
def main():

3
docs/MDNotes/TODO.md

@ -11,6 +11,9 @@
- [ ] Support Hyperlink: (gnome-terminal)
https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
- [x] Process child events before parent
- [ ] Rewrite the way focus is handled
https://doc.qt.io/qt-5/focus.html
Ref: https://github.com/ceccopierangiolieugenio/scripts/blob/master/Programming/python/pyqt5/textedit.001.py
## Terminal Helper
- [ ] Events

Loading…
Cancel
Save