diff options
Diffstat (limited to 'internal/ui')
| -rw-r--r-- | internal/ui/table.go | 55 | ||||
| -rw-r--r-- | internal/ui/ui.go | 47 |
2 files changed, 55 insertions, 47 deletions
diff --git a/internal/ui/table.go b/internal/ui/table.go new file mode 100644 index 0000000..682a680 --- /dev/null +++ b/internal/ui/table.go @@ -0,0 +1,55 @@ +package ui + +import ( + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" +) + +// Model wraps a Bubble Tea table.Model to display tasks. +type Model struct{ tbl table.Model } + +// New creates a new UI model with the provided rows. +func New(rows []table.Row) Model { + cols := []table.Column{ + {Title: "ID", Width: 4}, + {Title: "Task", Width: 30}, + {Title: "Active", Width: 6}, + {Title: "Age", Width: 6}, + {Title: "Pri", Width: 4}, + {Title: "Tags", Width: 15}, + {Title: "Recur", Width: 6}, + {Title: "Due", Width: 10}, + {Title: "Urg", Width: 5}, + {Title: "Annotations", Width: 20}, + } + t := table.New( + table.WithColumns(cols), + table.WithRows(rows), + table.WithFocused(true), + ) + styles := table.DefaultStyles() + styles.Header = styles.Header.Foreground(lipgloss.Color("205")) + styles.Selected = styles.Selected.Foreground(lipgloss.Color("229")).Background(lipgloss.Color("57")) + styles.Cell = styles.Cell.Padding(0, 1) + t.SetStyles(styles) + return Model{tbl: t} +} + +// Init implements tea.Model. +func (m Model) Init() tea.Cmd { return nil } + +// Update handles key and window events. +func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.WindowSizeMsg: + m.tbl.SetWidth(msg.Width) + m.tbl.SetHeight(msg.Height - 2) + } + var cmd tea.Cmd + m.tbl, cmd = m.tbl.Update(msg) + return m, cmd +} + +// View renders the table UI. +func (m Model) View() string { return m.tbl.View() } diff --git a/internal/ui/ui.go b/internal/ui/ui.go deleted file mode 100644 index 244c191..0000000 --- a/internal/ui/ui.go +++ /dev/null @@ -1,47 +0,0 @@ -package ui - -import ( - "github.com/charmbracelet/bubbles/list" - tea "github.com/charmbracelet/bubbletea" -) - -// Model wraps a Bubble Tea list.Model to display tasks. -type Model struct { - list list.Model -} - -// New creates a new UI model with the provided Bubble Tea list. -func New(l list.Model) Model { - return Model{list: l} -} - -// Init implements tea.Model. -func (m Model) Init() tea.Cmd { return nil } - -// Update handles key and window events. -func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "j": - msg = tea.KeyMsg{Type: tea.KeyDown} - case "k": - msg = tea.KeyMsg{Type: tea.KeyUp} - } - return m.updateList(msg) - case tea.WindowSizeMsg: - m.list.SetSize(msg.Width, msg.Height-2) - } - return m.updateList(msg) -} - -func (m *Model) updateList(msg tea.Msg) (tea.Model, tea.Cmd) { - var cmd tea.Cmd - m.list, cmd = m.list.Update(msg) - return m, cmd -} - -// View renders the list UI. -func (m Model) View() string { - return m.list.View() -} |
