feat(textarea): dynamically determine line number integer padding

This commit is contained in:
Christian Rocha
2024-07-17 09:26:38 -04:00
parent 1a3627eb98
commit 95d338b099
+24 -18
View File
@@ -266,9 +266,6 @@ type Model struct {
// vertically such that we can maintain the same navigating position. // vertically such that we can maintain the same navigating position.
lastCharOffset int lastCharOffset int
// lineNumberFormat is the format string used to display line numbers.
lineNumberFormat string
// viewport is the vertically-scrollable viewport of the multi-line text // viewport is the vertically-scrollable viewport of the multi-line text
// input. // input.
viewport *viewport.Model viewport *viewport.Model
@@ -299,11 +296,10 @@ func New() Model {
Cursor: cur, Cursor: cur,
KeyMap: DefaultKeyMap, KeyMap: DefaultKeyMap,
value: make([][]rune, minHeight, defaultMaxHeight), value: make([][]rune, minHeight, defaultMaxHeight),
focus: false, focus: false,
col: 0, col: 0,
row: 0, row: 0,
lineNumberFormat: "%3v ",
viewport: &vp, viewport: &vp,
} }
@@ -1101,11 +1097,12 @@ func (m Model) View() string {
} }
m.Cursor.TextStyle = m.style.computedCursorLine() m.Cursor.TextStyle = m.style.computedCursorLine()
var s strings.Builder var (
var style lipgloss.Style s strings.Builder
lineInfo := m.LineInfo() style lipgloss.Style
newLines int
var newLines int lineInfo = m.LineInfo()
)
displayLine := 0 displayLine := 0
for l, line := range m.value { for l, line := range m.value {
@@ -1126,15 +1123,15 @@ func (m Model) View() string {
if m.ShowLineNumbers { if m.ShowLineNumbers {
if wl == 0 { if wl == 0 {
if m.row == l { if m.row == l {
s.WriteString(style.Render(m.style.computedCursorLineNumber().Render(fmt.Sprintf(m.lineNumberFormat, l+1)))) s.WriteString(style.Render(m.style.computedCursorLineNumber().Render(m.formatLineNumber(l + 1))))
} else { } else {
s.WriteString(style.Render(m.style.computedLineNumber().Render(fmt.Sprintf(m.lineNumberFormat, l+1)))) s.WriteString(style.Render(m.style.computedLineNumber().Render(m.formatLineNumber(l + 1))))
} }
} else { } else {
if m.row == l { if m.row == l {
s.WriteString(style.Render(m.style.computedCursorLineNumber().Render(fmt.Sprintf(m.lineNumberFormat, " ")))) s.WriteString(style.Render(m.style.computedCursorLineNumber().Render(m.formatLineNumber(" "))))
} else { } else {
s.WriteString(style.Render(m.style.computedLineNumber().Render(fmt.Sprintf(m.lineNumberFormat, " ")))) s.WriteString(style.Render(m.style.computedLineNumber().Render(m.formatLineNumber(" "))))
} }
} }
} }
@@ -1187,6 +1184,15 @@ func (m Model) View() string {
return m.style.Base.Render(m.viewport.View()) return m.style.Base.Render(m.viewport.View())
} }
// formatLineNumber formats the line number for display dynamically based on
// the maximum number of lines
func (m Model) formatLineNumber(x any) string {
// XXX: ultimately we should use a max buffer height, which has yet to be
// implemented.
digits := len(strconv.Itoa(m.MaxHeight))
return fmt.Sprintf(" %*v ", digits, x)
}
func (m Model) getPromptString(displayLine int) (prompt string) { func (m Model) getPromptString(displayLine int) (prompt string) {
prompt = m.Prompt prompt = m.Prompt
if m.promptFunc == nil { if m.promptFunc == nil {
@@ -1240,7 +1246,7 @@ func (m Model) placeholderView() string {
ln = strconv.Itoa(i + 1) ln = strconv.Itoa(i + 1)
fallthrough fallthrough
case len(plines) > i: case len(plines) > i:
s.WriteString(lineStyle.Render(lineNumberStyle.Render(fmt.Sprintf(m.lineNumberFormat, ln)))) s.WriteString(lineStyle.Render(lineNumberStyle.Render(m.formatLineNumber(ln))))
default: default:
} }
} }