summaryrefslogtreecommitdiff
path: root/internal/atable
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-05 19:24:09 +0200
committerPaul Buetow <paul@buetow.org>2026-03-05 19:24:09 +0200
commit30c955ef113e5e0c99c147ee4e7c8c20b0a7f273 (patch)
treef872b7c44e62609a455dbed356fcc28ab3b53531 /internal/atable
parent33064821d637aeef94fe6ee96edbac7a503c0692 (diff)
Migrate UI stack to Bubble Tea v2
Diffstat (limited to 'internal/atable')
-rw-r--r--internal/atable/table.go70
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)
}