diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-05 19:24:09 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-05 19:24:09 +0200 |
| commit | 30c955ef113e5e0c99c147ee4e7c8c20b0a7f273 (patch) | |
| tree | f872b7c44e62609a455dbed356fcc28ab3b53531 /internal/atable | |
| parent | 33064821d637aeef94fe6ee96edbac7a503c0692 (diff) | |
Migrate UI stack to Bubble Tea v2
Diffstat (limited to 'internal/atable')
| -rw-r--r-- | internal/atable/table.go | 70 |
1 files changed, 38 insertions, 32 deletions
diff --git a/internal/atable/table.go b/internal/atable/table.go index 44f1c9f..d31088e 100644 --- a/internal/atable/table.go +++ b/internal/atable/table.go @@ -4,11 +4,11 @@ package table import ( "strings" - "github.com/charmbracelet/bubbles/help" - "github.com/charmbracelet/bubbles/key" - "github.com/charmbracelet/bubbles/viewport" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" + "charm.land/bubbles/v2/help" + "charm.land/bubbles/v2/key" + "charm.land/bubbles/v2/viewport" + tea "charm.land/bubbletea/v2" + "charm.land/lipgloss/v2" "github.com/charmbracelet/x/ansi" ) @@ -150,7 +150,7 @@ func New(opts ...Option) Model { m := Model{ cursor: 0, colCursor: 0, - viewport: viewport.New(0, 20), //nolint:mnd + viewport: viewport.New(viewport.WithWidth(0), viewport.WithHeight(20)), //nolint:mnd KeyMap: DefaultKeyMap(), Help: help.New(), @@ -184,14 +184,14 @@ func WithRows(rows []Row) Option { // WithHeight sets the height of the table. func WithHeight(h int) Option { return func(m *Model) { - m.viewport.Height = h - lipgloss.Height(m.headersView()) + m.viewport.SetHeight(h - lipgloss.Height(m.headersView())) } } // WithWidth sets the width of the table. func WithWidth(w int) Option { return func(m *Model) { - m.viewport.Width = w + m.viewport.SetWidth(w) } } @@ -230,20 +230,21 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { } switch msg := msg.(type) { - case tea.KeyMsg: + case tea.KeyPressMsg: + height := m.viewport.Height() switch { case key.Matches(msg, m.KeyMap.LineUp): m.MoveUp(1) case key.Matches(msg, m.KeyMap.LineDown): m.MoveDown(1) case key.Matches(msg, m.KeyMap.PageUp): - m.MoveUp(m.viewport.Height) + m.MoveUp(height) case key.Matches(msg, m.KeyMap.PageDown): - m.MoveDown(m.viewport.Height) + m.MoveDown(height) case key.Matches(msg, m.KeyMap.HalfPageUp): - m.MoveUp(m.viewport.Height / 2) //nolint:mnd + m.MoveUp(height / 2) //nolint:mnd case key.Matches(msg, m.KeyMap.HalfPageDown): - m.MoveDown(m.viewport.Height / 2) //nolint:mnd + m.MoveDown(height / 2) //nolint:mnd case key.Matches(msg, m.KeyMap.GotoTop): m.GotoTop() case key.Matches(msg, m.KeyMap.GotoBottom): @@ -296,16 +297,17 @@ func (m Model) HelpView() string { // columns and rows. func (m *Model) UpdateViewport() { renderedRows := make([]string, 0, len(m.rows)) + height := m.viewport.Height() // Render only rows from: m.cursor-m.viewport.Height to: m.cursor+m.viewport.Height // Constant runtime, independent of number of rows in a table. // Limits the number of renderedRows to a maximum of 2*m.viewport.Height if m.cursor >= 0 { - m.start = clamp(m.cursor-m.viewport.Height, 0, m.cursor) + m.start = clamp(m.cursor-height, 0, m.cursor) } else { m.start = 0 } - m.end = clamp(m.cursor+m.viewport.Height, m.cursor, len(m.rows)) + m.end = clamp(m.cursor+height, m.cursor, len(m.rows)) for i := m.start; i < m.end; i++ { renderedRows = append(renderedRows, m.renderRow(i)) } @@ -349,24 +351,24 @@ func (m *Model) SetColumns(c []Column) { // SetWidth sets the width of the viewport of the table. func (m *Model) SetWidth(w int) { - m.viewport.Width = w + m.viewport.SetWidth(w) m.UpdateViewport() } // SetHeight sets the height of the viewport of the table. func (m *Model) SetHeight(h int) { - m.viewport.Height = h - lipgloss.Height(m.headersView()) + m.viewport.SetHeight(h - lipgloss.Height(m.headersView())) m.UpdateViewport() } // Height returns the viewport height of the table. func (m Model) Height() int { - return m.viewport.Height + return m.viewport.Height() } // Width returns the viewport width of the table. func (m Model) Width() int { - return m.viewport.Width + return m.viewport.Width() } // Cursor returns the index of the selected row. @@ -395,13 +397,15 @@ func (m *Model) SetColumnCursor(n int) { // It can not go above the first row. func (m *Model) MoveUp(n int) { m.cursor = clamp(m.cursor-n, 0, len(m.rows)-1) + yOffset := m.viewport.YOffset() + height := m.viewport.Height() switch { case m.start == 0: - m.viewport.SetYOffset(clamp(m.viewport.YOffset, 0, m.cursor)) - case m.start < m.viewport.Height: - m.viewport.YOffset = (clamp(clamp(m.viewport.YOffset+n, 0, m.cursor), 0, m.viewport.Height)) - case m.viewport.YOffset >= 1: - m.viewport.YOffset = clamp(m.viewport.YOffset+n, 1, m.viewport.Height) + m.viewport.SetYOffset(clamp(yOffset, 0, m.cursor)) + case m.start < height: + m.viewport.SetYOffset(clamp(clamp(yOffset+n, 0, m.cursor), 0, height)) + case yOffset >= 1: + m.viewport.SetYOffset(clamp(yOffset+n, 1, height)) } m.UpdateViewport() } @@ -411,15 +415,17 @@ func (m *Model) MoveUp(n int) { func (m *Model) MoveDown(n int) { m.cursor = clamp(m.cursor+n, 0, len(m.rows)-1) m.UpdateViewport() + yOffset := m.viewport.YOffset() + height := m.viewport.Height() switch { - case m.end == len(m.rows) && m.viewport.YOffset > 0: - m.viewport.SetYOffset(clamp(m.viewport.YOffset-n, 1, m.viewport.Height)) - case m.cursor > (m.end-m.start)/2 && m.viewport.YOffset > 0: - m.viewport.SetYOffset(clamp(m.viewport.YOffset-n, 1, m.cursor)) - case m.viewport.YOffset > 1: - case m.cursor > m.viewport.YOffset+m.viewport.Height-1: - m.viewport.SetYOffset(clamp(m.viewport.YOffset+1, 0, 1)) + case m.end == len(m.rows) && yOffset > 0: + m.viewport.SetYOffset(clamp(yOffset-n, 1, height)) + case m.cursor > (m.end-m.start)/2 && yOffset > 0: + m.viewport.SetYOffset(clamp(yOffset-n, 1, m.cursor)) + case yOffset > 1: + case m.cursor > yOffset+height-1: + m.viewport.SetYOffset(clamp(yOffset+1, 0, 1)) } } @@ -529,7 +535,7 @@ func addSpacingStyled(cells []string, style lipgloss.Style) []string { spaced := make([]string, 0, len(cells)*2-1) for i, cell := range cells { if i > 0 { - spaced = append(spaced, style.Copy().Padding(0, 0).Render(" ")) + spaced = append(spaced, style.Padding(0, 0).Render(" ")) } spaced = append(spaced, cell) } |
