From fa7396f79cce67df018be44d6b8cf3799b0321ff Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Fri, 14 Apr 2023 11:48:39 +0100 Subject: [PATCH] Added Alignment feature to the Label --- TermTk/TTkUiTools/properties/label.py | 42 ++++++++++++++++++++++----- TermTk/TTkWidgets/label.py | 19 ++++++++++-- ttkDesigner/app/propertyeditor.py | 13 +++++++-- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/TermTk/TTkUiTools/properties/label.py b/TermTk/TTkUiTools/properties/label.py index c5340a93..1fe61b2f 100644 --- a/TermTk/TTkUiTools/properties/label.py +++ b/TermTk/TTkUiTools/properties/label.py @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.string import TTkString from TermTk.TTkWidgets.label import TTkLabel @@ -27,12 +28,37 @@ from TermTk.TTkWidgets.label import TTkLabel TTkLabelProperties = { 'properties' : { 'Text' : { - 'init': {'name':'text', 'type':'singleLineTTkString' }, - 'get': {'cb':TTkLabel.text, 'type':'singleLineTTkString' } , - 'set': {'cb':TTkLabel.setText, 'type':'singleLineTTkString' } }, + 'init': {'name':'text', 'type':TTkString }, + 'get': {'cb':TTkLabel.text, 'type':TTkString } , + 'set': {'cb':TTkLabel.setText, 'type':TTkString } }, 'Color' : { - 'init': {'name':'color', 'type':TTkColor }, - 'get': {'cb':TTkLabel.color, 'type':TTkColor } , - 'set': {'cb':TTkLabel.setColor, 'type':TTkColor } }, - },'signals' : {},'slots' : {} -} + 'init': {'name':'color', 'type':TTkColor }, + 'get': {'cb':TTkLabel.color, 'type':TTkColor } , + 'set': {'cb':TTkLabel.setColor, 'type':TTkColor } }, + 'Alignment': { + 'init': {'name':'alignment', 'type':'singleflag', + 'flags': { + 'None' : TTkK.NONE , + 'Left' : TTkK.LEFT_ALIGN , + 'Right' : TTkK.RIGHT_ALIGN , + 'Center' : TTkK.CENTER_ALIGN , + 'Justify' : TTkK.JUSTIFY } } , + 'get': {'cb':TTkLabel.alignment, 'type':'singleflag', + 'flags': { + 'None' : TTkK.NONE , + 'Left' : TTkK.LEFT_ALIGN , + 'Right' : TTkK.RIGHT_ALIGN , + 'Center' : TTkK.CENTER_ALIGN , + 'Justify' : TTkK.JUSTIFY } }, + 'set': {'cb':TTkLabel.setAlignment,'type':'singleflag', + 'flags': { + 'None' : TTkK.NONE , + 'Left' : TTkK.LEFT_ALIGN , + 'Right' : TTkK.RIGHT_ALIGN , + 'Center' : TTkK.CENTER_ALIGN , + 'Justify' : TTkK.JUSTIFY } } }, + },'signals' : { + },'slots' : { + 'setText()' : {'name': 'setText', 'type':str}, + 'setAlignment()' : {'name': 'setAlignment', 'type':int}, + }} diff --git a/TermTk/TTkWidgets/label.py b/TermTk/TTkWidgets/label.py index fd1c79a8..99e08f77 100644 --- a/TermTk/TTkWidgets/label.py +++ b/TermTk/TTkWidgets/label.py @@ -22,6 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.string import TTkString from TermTk.TTkCore.signal import pyTTkSlot @@ -29,7 +30,7 @@ from TermTk.TTkWidgets.widget import TTkWidget class TTkLabel(TTkWidget): '''TTkLabel''' - __slots__ = ('_text','_color') + __slots__ = ('_text','_color','_alignment') def __init__(self, *args, **kwargs): self._color = kwargs.get('color', TTkColor.RST ) text = kwargs.get('text', TTkString() ) @@ -37,11 +38,22 @@ class TTkLabel(TTkWidget): self._text = text.split('\n') else: self._text = TTkString(text).split('\n') + self._alignment = kwargs.get('alignment', TTkK.Alignment.NONE) self.setDefaultSize(kwargs, max(t.termWidth() for t in self._text), len(self._text)) super().__init__(*args, **kwargs) self._textUpdated() + def alignment(self): + return self._alignment + + @pyTTkSlot(TTkK.Alignment) + def setAlignment(self, alignment: TTkK.Alignment): + if self._alignment == alignment: + return + self._alignment = alignment + self.update() + def color(self): '''color''' return self._color @@ -68,9 +80,10 @@ class TTkLabel(TTkWidget): def paintEvent(self): forceColor = self.color()!=TTkColor.RST + w = self.width() for y,text in enumerate(self._text): - self._canvas.drawText(pos=(0,y), text=' '*self.width(), color=self.color(), forceColor=forceColor) - self._canvas.drawText(pos=(0,y), text=text, color=self.color(), forceColor=forceColor) + self._canvas.drawText(pos=(0,y), text=' '*w, color=self.color(), forceColor=forceColor) + self._canvas.drawText(pos=(0,y), text=text, width=w, alignment=self._alignment, color=self.color(), forceColor=forceColor) def _textUpdated(self): w, h = self.size() diff --git a/ttkDesigner/app/propertyeditor.py b/ttkDesigner/app/propertyeditor.py index 43b21f65..4d3ee888 100644 --- a/ttkDesigner/app/propertyeditor.py +++ b/ttkDesigner/app/propertyeditor.py @@ -42,6 +42,11 @@ class PropertyEditor(ttk.TTkGridLayout): self._makeDetail(widget, *superWidget.getSuperProperties()) def _makeDetail(self, domw, exceptions, exclude): + def _boundValue(_f,_w,_v): + def _ret(): + _f(_w,_v) + self._superWidget.updateAll() + return _ret def _bound(_f,_w,_l): def _ret(_v): _f(_w,_l(_v)) @@ -178,8 +183,12 @@ class PropertyEditor(ttk.TTkGridLayout): # Color Fields def _processTTkColor(name, prop): getval = prop['get']['cb'](domw) - value = ttk.TTkColorButtonPicker(color=getval, height=1) - value.colorSelected.connect(_bound(prop['set']['cb'],domw,lambda v:v)) + value = ttk.TTkWidget(layout=ttk.TTkHBoxLayout(), height=1) + value.layout().addWidget(_cb := ttk.TTkColorButtonPicker(color=getval, height=1)) + value.layout().addWidget(_rc := ttk.TTkButton(text=ttk.TTkString('x',ttk.TTkColor.fg('#FFAA00')),maxWidth=3)) + _cb.colorSelected.connect(_bound(prop['set']['cb'],domw,lambda v:v)) + _rc.clicked.connect(_boundValue(prop['set']['cb'],domw,ttk.TTkColor.RST)) + _rc.clicked.connect(lambda :_cb.setColor(ttk.TTkColor.RST)) return ttk.TTkTreeWidgetItem([name,value]) # Layout field def _processTTkLayout(name, prop):