From 85ec8d7c26a71286c9500e5aa52f4b3d88f3b2e5 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 11 Jan 2024 10:34:31 +0000 Subject: [PATCH 1/4] Restructured doc folders --- TermTk/TTkCore/helper.py | 3 ++- docs/MDNotes/Games.md | 3 ++- docs/source/index.rst | 1 + docs/source/info/{dev => resources}/clipboard.rst | 0 docs/source/info/{dev => resources}/dragdrop.rst | 0 docs/source/info/resources/index.rst | 9 +++++++++ docs/source/info/{dev => resources}/input.rst | 0 docs/source/info/resources/modal.rst | 8 ++++++++ docs/source/info/{dev => resources}/paint.rst | 0 9 files changed, 22 insertions(+), 2 deletions(-) rename docs/source/info/{dev => resources}/clipboard.rst (100%) rename docs/source/info/{dev => resources}/dragdrop.rst (100%) create mode 100644 docs/source/info/resources/index.rst rename docs/source/info/{dev => resources}/input.rst (100%) create mode 100644 docs/source/info/resources/modal.rst rename docs/source/info/{dev => resources}/paint.rst (100%) diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index 4927f075..236076e5 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -169,7 +169,8 @@ class TTkHelper: return TTkHelper.rootOverlay(widget) is not None @staticmethod - def overlay(caller, widget, x, y, modal=False, forceBoundaries=True, toolWindow=False): + def overlay(caller, widget, x:int, y:int, modal:bool=False, forceBoundaries:bool=True, toolWindow:bool=False): + '''overlay''' if not caller: caller = TTkHelper._rootWidget wx, wy = TTkHelper.absPos(caller) diff --git a/docs/MDNotes/Games.md b/docs/MDNotes/Games.md index 1acf7b5b..fcc54f4c 100644 --- a/docs/MDNotes/Games.md +++ b/docs/MDNotes/Games.md @@ -26,4 +26,5 @@ For this reason games like MarioBros are not technically possible on a terminal * Whac-A-Mole * Dungeon Master * Flappy Bird -* \ No newline at end of file +* Pacman (Does not require long keypresses) +* Nibbles (Does not require long keypresses) \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 75cec6f4..dc35c336 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -74,6 +74,7 @@ Intro info/installing info/debug + info/resources/index .. toctree:: diff --git a/docs/source/info/dev/clipboard.rst b/docs/source/info/resources/clipboard.rst similarity index 100% rename from docs/source/info/dev/clipboard.rst rename to docs/source/info/resources/clipboard.rst diff --git a/docs/source/info/dev/dragdrop.rst b/docs/source/info/resources/dragdrop.rst similarity index 100% rename from docs/source/info/dev/dragdrop.rst rename to docs/source/info/resources/dragdrop.rst diff --git a/docs/source/info/resources/index.rst b/docs/source/info/resources/index.rst new file mode 100644 index 00000000..1f19488a --- /dev/null +++ b/docs/source/info/resources/index.rst @@ -0,0 +1,9 @@ +Resources +========= + +.. toctree:: + :caption: Resources + :maxdepth: 1 + :hidden: + + modal \ No newline at end of file diff --git a/docs/source/info/dev/input.rst b/docs/source/info/resources/input.rst similarity index 100% rename from docs/source/info/dev/input.rst rename to docs/source/info/resources/input.rst diff --git a/docs/source/info/resources/modal.rst b/docs/source/info/resources/modal.rst new file mode 100644 index 00000000..b4d1d8c4 --- /dev/null +++ b/docs/source/info/resources/modal.rst @@ -0,0 +1,8 @@ +========================= +Overlay Widgets (Windows) +========================= + +An Overlay Widget is a Widget that is placed on top of any other components. +It is normally used to define toolbox or modal windows. +The routine :class:`~TermTk.TTkCore.helper.TTkHelper` -> :class:`~TermTk.TTkCore.helper.TTkHelper.overlay` is required in order to achieve this + diff --git a/docs/source/info/dev/paint.rst b/docs/source/info/resources/paint.rst similarity index 100% rename from docs/source/info/dev/paint.rst rename to docs/source/info/resources/paint.rst From 7b2829995c5d13653d4e183e488a719ac3513446 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 11 Jan 2024 14:17:10 +0000 Subject: [PATCH 2/4] Added the EchoMode in the TTkLineEdit --- TermTk/TTkUiTools/properties/lineedit.py | 37 ++++++++--- TermTk/TTkWidgets/lineedit.py | 83 +++++++++++++++++------- 2 files changed, 87 insertions(+), 33 deletions(-) diff --git a/TermTk/TTkUiTools/properties/lineedit.py b/TermTk/TTkUiTools/properties/lineedit.py index 576f9a94..4a521627 100644 --- a/TermTk/TTkUiTools/properties/lineedit.py +++ b/TermTk/TTkUiTools/properties/lineedit.py @@ -29,16 +29,37 @@ from TermTk.TTkWidgets.lineedit import TTkLineEdit TTkLineEditProperties = { 'properties' : { 'Input Type' : { - 'init': {'name':'inputType', 'type':'multiflags', + 'init': {'name':'inputType', 'type':'singleflag', 'flags': { - 'Text' : TTkK.Input_Text , - 'Number' : TTkK.Input_Number , - 'Password': TTkK.Input_Password } }, - 'get': {'cb':TTkLineEdit.inputType, 'type':'multiflags', + 'Text' : TTkK.Input_Text , + 'Number' : TTkK.Input_Number } }, + 'get': {'cb':TTkLineEdit.inputType, 'type':'singleflag', 'flags': { - 'Text' : TTkK.Input_Text , - 'Number' : TTkK.Input_Number , - 'Password': TTkK.Input_Password } } }, + 'Text' : TTkK.Input_Text , + 'Number' : TTkK.Input_Number } }, + 'set': {'cb':TTkLineEdit.setInputType, 'type':'singleflag', + 'flags': { + 'Text' : TTkK.Input_Text , + 'Number' : TTkK.Input_Number } } }, + 'Echo Mode' : { + 'init': {'name':'echoMode', 'type':'singleflag', + 'flags': { + 'Normal' : TTkLineEdit.EchoMode.Normal , + 'No Echo' : TTkLineEdit.EchoMode.NoEcho , + 'Password' : TTkLineEdit.EchoMode.Password , + 'Password, Echo on Edit' : TTkLineEdit.EchoMode.PasswordEchoOnEdit } }, + 'get': {'cb':TTkLineEdit.echoMode, 'type':'singleflag', + 'flags': { + 'Normal' : TTkLineEdit.EchoMode.Normal , + 'No Echo' : TTkLineEdit.EchoMode.NoEcho , + 'Password' : TTkLineEdit.EchoMode.Password , + 'Password, Echo on Edit' : TTkLineEdit.EchoMode.PasswordEchoOnEdit } }, + 'set': {'cb':TTkLineEdit.setEchoMode, 'type':'singleflag', + 'flags': { + 'Normal' : TTkLineEdit.EchoMode.Normal , + 'No Echo' : TTkLineEdit.EchoMode.NoEcho , + 'Password' : TTkLineEdit.EchoMode.Password , + 'Password, Echo on Edit' : TTkLineEdit.EchoMode.PasswordEchoOnEdit } } }, 'Text' : { 'init': {'name':'text', 'type':'singleLineTTkString', } , 'get': {'cb':TTkLineEdit.text, 'type':'singleLineTTkString' } , diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index e6aedcb4..0dfcf03c 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -25,6 +25,7 @@ __all__ = ['TTkLineEdit'] import re from TermTk.TTkCore.cfg import TTkCfg +from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.string import TTkString @@ -41,6 +42,12 @@ from TermTk.TTkWidgets.widget import TTkWidget class TTkLineEdit(TTkWidget): '''TTkLineEdit''' + class EchoMode(int): + Normal = 0x00 # Display characters as they are entered. This is the default. + NoEcho = 0x01 # Do not display anything. This may be appropriate for passwords where even the length of the password should be kept secret. + Password = 0x02 # Display asterisks instead of the characters actually entered. + PasswordEchoOnEdit = 0x03 # Display characters as they are entered while editing otherwise display asterisks. + classStyle = { 'default': {'color': TTkColor.fg("#dddddd")+TTkColor.bg("#222222"), 'selectedColor': TTkColor.fg("#ffffff")+TTkColor.bg("#008844")}, @@ -50,10 +57,10 @@ class TTkLineEdit(TTkWidget): } __slots__ = ( - '_text', '_cursorPos', '_offset', '_replace', '_inputType', '_selectionFrom', '_selectionTo', + '_text', '_cursorPos', '_offset', '_replace', '_inputType', '_echoMode', '_selectionFrom', '_selectionTo', # Signals 'returnPressed', 'textChanged', 'textEdited' ) - def __init__(self, *args, **kwargs): + def __init__(self, text:str|TTkString='', inputType:int=TTkK.Input_Text, echoMode:EchoMode=EchoMode.Normal, **kwargs): # Signals self.returnPressed = pyTTkSignal() self.textChanged = pyTTkSignal(str) @@ -63,12 +70,11 @@ class TTkLineEdit(TTkWidget): self._selectionFrom = 0 self._selectionTo = 0 self._replace=False - self._text = TTkString(kwargs.get('text' , '' )) - self._inputType = kwargs.get('inputType' , TTkK.Input_Text ) - super().__init__(*args, **kwargs) - if ( self._inputType & TTkK.Input_Number and - not self._isFloat(self._text)): - self._text = TTkString('0') + self._text = TTkString(text) + self._inputType = inputType + self._echoMode = echoMode + super().__init__(**kwargs) + self.setInputType(inputType) self.setMaximumHeight(1) self.setMinimumSize(1,1) self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus) @@ -91,6 +97,30 @@ class TTkLineEdit(TTkWidget): '''inputType''' return self._inputType + def setInputType(self, inputType): + '''inputType''' + if bool(inputType & TTkK.Input_Text) and bool(inputType & TTkK.Input_Number): + return + # Kept here for retrocompatibility + if inputType & TTkK.Input_Password: + TTkLog.warn("TTkK.Input_Password is deprecated, use the EchoMode instead") + self._echoMode = TTkLineEdit.EchoMode.Password + inputType &= ~TTkK.Input_Password + if inputType & ~(TTkK.Input_Text|TTkK.Input_Number): + return + self._inputType = inputType & (TTkK.Input_Text|TTkK.Input_Number) if inputType else TTkK.Input_Text + if ( self._inputType == TTkK.Input_Number and + not self._isFloat(self._text)): + self._text = TTkString('0') + self.update() + + def echoMode(self) -> EchoMode: + return self._echoMode + + def setEchoMode(self, echoMode:EchoMode): + self._echoMode = echoMode + self.update() + def resizeEvent(self, w: int, h: int): self._pushCursor() return super().resizeEvent(w, h) @@ -116,23 +146,6 @@ class TTkLineEdit(TTkWidget): self.update() - def paintEvent(self, canvas): - style = self.currentStyle() - - color = style['color'] - selectColor = style['selectedColor'] - - w = self.width() - text = TTkString('', color) - if self._inputType & TTkK.Input_Password: - text += ("*"*(len(self._text))) - else: - text += self._text - if self._selectionFrom < self._selectionTo: - text = text.setColor(color=selectColor, posFrom=self._selectionFrom, posTo=self._selectionTo) - text = text.substring(self._offset) - canvas.drawText(pos=(0,0), text=text, color=color, width=w) - def mousePressEvent(self, evt): txtPos = self._text.tabCharPos(evt.x+self._offset) self._cursorPos = txtPos @@ -296,3 +309,23 @@ class TTkLineEdit(TTkWidget): self._selectionTo = 0 TTkHelper.hideCursor() self.update() + + def paintEvent(self, canvas): + style = self.currentStyle() + + color = style['color'] + selectColor = style['selectedColor'] + + w = self.width() + text = TTkString('', color) + if self._echoMode != TTkLineEdit.EchoMode.NoEcho: + if ( self._echoMode == TTkLineEdit.EchoMode.Password or + ( self._echoMode == TTkLineEdit.EchoMode.PasswordEchoOnEdit and + not self.hasFocus() )): + text += ("*"*(len(self._text))) + else: + text += self._text + if self._selectionFrom < self._selectionTo: + text = text.setColor(color=selectColor, posFrom=self._selectionFrom, posTo=self._selectionTo) + text = text.substring(self._offset) + canvas.drawText(pos=(0,0), text=text, color=color, width=w) From 66d1f1c2926f5bd1746b3c3a1bdc6af731c3725d Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 11 Jan 2024 14:35:05 +0000 Subject: [PATCH 3/4] Avoid input spaces in the number --- TermTk/TTkWidgets/lineedit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index 0dfcf03c..e6b351a3 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -291,7 +291,7 @@ class TTkLineEdit(TTkWidget): text = pre + evt.key + post if ( self._inputType & TTkK.Input_Number and - not self._isFloat(text) ): + ( evt.key in (' ') or not self._isFloat(text) )): return True self.setText(text, self._cursorPos+1) From 32eae4f35a33e4ca4aa5ffe0ea885057ae0b9b65 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 11 Jan 2024 14:39:52 +0000 Subject: [PATCH 4/4] Fix test error --- TermTk/TTkWidgets/lineedit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index e6b351a3..6fce9a28 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -60,7 +60,7 @@ class TTkLineEdit(TTkWidget): '_text', '_cursorPos', '_offset', '_replace', '_inputType', '_echoMode', '_selectionFrom', '_selectionTo', # Signals 'returnPressed', 'textChanged', 'textEdited' ) - def __init__(self, text:str|TTkString='', inputType:int=TTkK.Input_Text, echoMode:EchoMode=EchoMode.Normal, **kwargs): + def __init__(self, text='', inputType:int=TTkK.Input_Text, echoMode:EchoMode=EchoMode.Normal, **kwargs): # Signals self.returnPressed = pyTTkSignal() self.textChanged = pyTTkSignal(str)