diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index 6fce9a28..a8c91e26 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -31,6 +31,7 @@ from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal +from TermTk.TTkGui.clipboard import TTkClipboard from TermTk.TTkWidgets.widget import TTkWidget ''' @@ -57,7 +58,9 @@ class TTkLineEdit(TTkWidget): } __slots__ = ( - '_text', '_cursorPos', '_offset', '_replace', '_inputType', '_echoMode', '_selectionFrom', '_selectionTo', + '_text', '_cursorPos', '_offset', '_replace', '_inputType', '_echoMode', + '_selectionFrom', '_selectionTo', + '_clipboard', # Signals 'returnPressed', 'textChanged', 'textEdited' ) def __init__(self, text='', inputType:int=TTkK.Input_Text, echoMode:EchoMode=EchoMode.Normal, **kwargs): @@ -73,6 +76,7 @@ class TTkLineEdit(TTkWidget): self._text = TTkString(text) self._inputType = inputType self._echoMode = echoMode + self._clipboard = TTkClipboard() super().__init__(**kwargs) self.setInputType(inputType) self.setMaximumHeight(1) @@ -161,6 +165,7 @@ class TTkLineEdit(TTkWidget): if self._selectionFrom < self._selectionTo: TTkHelper.hideCursor() self.update() + self.copy() return True def mouseDoubleClickEvent(self, evt) -> bool: @@ -185,6 +190,7 @@ class TTkLineEdit(TTkWidget): TTkHelper.hideCursor() self.update() + self.copy() return True def mouseTapEvent(self, evt) -> bool: @@ -193,6 +199,7 @@ class TTkLineEdit(TTkWidget): if self._selectionFrom < self._selectionTo: TTkHelper.hideCursor() self.update() + self.copy() return True @staticmethod @@ -203,6 +210,23 @@ class TTkLineEdit(TTkWidget): except: return False + @pyTTkSlot() + def copy(self): + if self._selectionFrom >= self._selectionTo: return + txt = self._text.substring(fr=self._selectionFrom,to=self._selectionTo) + self._clipboard.setText(txt) + + @pyTTkSlot() + def cut(self): + self.copy() + self._text = self._text.substring(to=self._selectionFrom) + self._text.substring(fr=self._selectionTo) + self._cursorPos = self._selectionFrom + self.update() + + @pyTTkSlot() + def paste(self): + txt = self._clipboard.text() + self.pasteEvent(txt) def pasteEvent(self, txt:str): txt = TTkString().join(txt.split('\n')) @@ -238,6 +262,18 @@ class TTkLineEdit(TTkWidget): TTkK.Key_Tab, TTkK.Key_Up, TTkK.Key_Down): return False + # CTRL Pressed + if evt.mod==TTkK.ControlModifier: + if evt.key == TTkK.Key_C: + self.copy() + elif evt.key == TTkK.Key_V: + self.paste() + elif evt.key == TTkK.Key_X: + self.cut() + else: + return False + return True + if evt.key == TTkK.Key_Left: if self._selectionFrom < self._selectionTo: self._cursorPos = self._selectionTo