From 2f9b1251d713af75f883814cf2a8f79bae296202 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Sat, 21 Oct 2023 14:57:50 +0100 Subject: [PATCH] Enhancement: #189 allow to set the starting value of the line number in the Textedit --- TermTk/TTkWidgets/texedit.py | 34 ++++++++++++++++++++++------------ demo/showcase/textedit.py | 9 ++++++--- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index 014dcaba..dd8cb2a2 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/TermTk/TTkWidgets/texedit.py @@ -50,15 +50,17 @@ class _TTkTextEditViewLineNumber(TTkAbstractScrollView): 'separatorColor': TTkColor.fg("#888888")}, } - __slots__ = ('_textWrap') - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.setMaximumWidth(20) + __slots__ = ('_textWrap','_startingNumber') + def __init__(self, startingNumber=0, **kwargs): + self._startingNumber = startingNumber self._textWrap = None + super().__init__(**kwargs) + self.setMaximumWidth(2) def _wrapChanged(self): dt = max(1,self._textWrap._lines[-1][0]) - width = 2+floor(log10(dt)) + off = self._startingNumber + width = 1+max(len(str(int(dt+off))),len(str(int(off)))) self.setMaximumWidth(width) self.update() @@ -80,6 +82,7 @@ class _TTkTextEditViewLineNumber(TTkAbstractScrollView): if not self._textWrap: return _, oy = self.getViewOffsets() w, h = self.size() + off = self._startingNumber style = self.currentStyle() color = style['color'] @@ -91,11 +94,11 @@ class _TTkTextEditViewLineNumber(TTkAbstractScrollView): if fr: canvas.drawText(pos=(0,i), text='<', width=w, color=wrapColor) else: - canvas.drawText(pos=(0,i), text=f"{dt}", width=w, color=color) + canvas.drawText(pos=(0,i), text=f"{dt+off}", width=w, color=color) canvas.drawChar(pos=(w-1,i), char='▌', color=separatorColor) else: for y in range(h): - canvas.drawText(pos=(0,y), text=f"{y+oy}", width=w, color=color) + canvas.drawText(pos=(0,y), text=f"{y+oy+off}", width=w, color=color) canvas.drawChar(pos=(w-1,y), char='▌', color=separatorColor) class TTkTextEditView(TTkAbstractScrollView): @@ -799,17 +802,17 @@ class TTkTextEdit(TTkAbstractScrollArea): 'undoAvilable', 'redoAvailable', 'textChanged' ) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, textEditView=None, lineNumber=False, lineNumberStarting=0, **kwargs): + super().__init__(**kwargs) if 'parent' in kwargs: kwargs.pop('parent') - self._textEditView = kwargs.get('textEditView', TTkTextEditView(*args, **kwargs)) + self._textEditView = textEditView if textEditView else TTkTextEditView(**kwargs) # self.setFocusPolicy(self._textEditView.focusPolicy()) # self._textEditView.setFocusPolicy(TTkK.ParentFocus) - self._lineNumber = kwargs.get('lineNumber', False) + self._lineNumber = lineNumber textEditLayout = TTkAbstractScrollViewGridLayout() textEditLayout.addWidget(self._textEditView,0,1) - self._lineNumberView = _TTkTextEditViewLineNumber(visible=self._lineNumber) + self._lineNumberView = _TTkTextEditViewLineNumber(visible=self._lineNumber, startingNumber=lineNumberStarting) self._lineNumberView.setTextWrap(self._textEditView._textWrap) textEditLayout.addWidget(self._lineNumberView,0,0) self.setViewport(textEditLayout) @@ -862,6 +865,13 @@ class TTkTextEdit(TTkAbstractScrollArea): '''setLineNumber''' self._lineNumberView.setVisible(ln) + def lineNumberStarting(self): + return self._lineNumberView._startingNumber + + def setLineNumberStarting(self, starting): + self._lineNumberView._startingNumber = starting + self._lineNumberView._wrapChanged() + def setDocument(self, document): '''setDocument''' self._textEditView.setDocument(document) diff --git a/demo/showcase/textedit.py b/demo/showcase/textedit.py index c37951da..2a690f09 100755 --- a/demo/showcase/textedit.py +++ b/demo/showcase/textedit.py @@ -52,7 +52,7 @@ def demoTextEdit(root=None, document=None): # If no document is passed a default one is created, # In this showcase I want to be able to share the same # document among 2 textEdit widgets - te = ttk.TTkTextEdit(document=document, lineNumber=True) + te = ttk.TTkTextEdit(document=document, lineNumber=True, lineNumberStarting=1) te.setReadOnly(False) @@ -127,7 +127,7 @@ def demoTextEdit(root=None, document=None): # Empty columns/cells are 1 char wide due to "columnMinWidth=1" parameter in the GridLayout # 1 3 8 11 # 0 2 4 5 6 7 9 10 12 - # 0 [ ] FG [ ] BG [ ] LineNumber + # 0 [ ] FG [ ] BG [ ] LineNumber [ 0]Starting Number # 1 ┌─────┐ ┌─────┐ ╒═══╕╒═══╕╒═══╕╒═══╕ ┌──────┐┌──────┐ # 2 │ │ │ │ │ a ││ a ││ a ││ a │ │ UNDO ││ REDO │ # 3 └─────┘ └─────┘ └───┘└───┘└───┘└───┘ ╘══════╛└──────┘ ┕━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ @@ -140,6 +140,7 @@ def demoTextEdit(root=None, document=None): fontLayout.addWidget(btn_bgColor := ttk.TTkColorButtonPicker(border=True, enabled=False, maxSize=(7 ,3)),1,2) fontLayout.addWidget(cb_linenumber := ttk.TTkCheckbox(text=" LineNumber", checked=True),0,4,1,3) + fontLayout.addWidget(sb_linenumber := ttk.TTkSpinBox(value=1, maxWidth=5, maximum=10000, minimum=-10000, enabled=True),0,7,1,1) # Char style buttons fontLayout.addWidget(btn_bold := ttk.TTkButton(border=True, maxSize=(5,3), checkable=True, text=ttk.TTkString( 'a' , ttk.TTkColor.BOLD) ),1,4) @@ -209,7 +210,9 @@ def demoTextEdit(root=None, document=None): cb_fg.clicked.connect(lambda _: _setStyle()) cb_bg.clicked.connect(lambda _: _setStyle()) - cb_linenumber.stateChanged.connect(lambda x: te.setLineNumber(x==ttk.TTkK.Checked)) + cb_linenumber.toggled.connect(te.setLineNumber) + cb_linenumber.toggled.connect(sb_linenumber.setEnabled) + sb_linenumber.valueChanged.connect(te.setLineNumberStarting) btn_fgColor.colorSelected.connect(lambda _: _setStyle()) btn_bgColor.colorSelected.connect(lambda _: _setStyle())