Browse Source

Enhancement: #189 allow to set the starting value of the line number in the Textedit

pull/193/head
Eugenio Parodi 2 years ago
parent
commit
2f9b1251d7
  1. 34
      TermTk/TTkWidgets/texedit.py
  2. 9
      demo/showcase/textedit.py

34
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)

9
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())

Loading…
Cancel
Save