diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index a40846fc..a4524be5 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/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() diff --git a/demo/showcase/textedit.py b/demo/showcase/textedit.py index bb979287..f48c3005 100755 --- a/demo/showcase/textedit.py +++ b/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(): diff --git a/docs/MDNotes/TODO.md b/docs/MDNotes/TODO.md index b16ef579..7fdd9545 100644 --- a/docs/MDNotes/TODO.md +++ b/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