apps/jotts/tui/list_model.go 1.5 K raw
1
package tui
2
3
import (
4
	"charm.land/bubbles/v2/list"
5
	tea "charm.land/bubbletea/v2"
6
	sharedtui "github.com/stevedylandev/andromeda/pkg/tui"
7
)
8
9
type noteItem struct {
10
	note Note
11
}
12
13
func (n noteItem) Title() string       { return n.note.Title }
14
func (n noteItem) Description() string { return "" }
15
func (n noteItem) FilterValue() string { return n.note.Title }
16
17
type listModel struct {
18
	inner list.Model
19
}
20
21
func newListModel(notes []Note) listModel {
22
	items := make([]list.Item, 0, len(notes))
23
	for _, n := range notes {
24
		items = append(items, noteItem{note: n})
25
	}
26
27
	l := list.New(items, sharedtui.ANSIListDelegate(), 0, 0)
28
	l.Title = "notes"
29
	l.Styles = sharedtui.ANSIListStyles()
30
	l.SetShowStatusBar(false)
31
	l.SetShowPagination(false)
32
	l.SetShowHelp(false)
33
	l.SetFilteringEnabled(true)
34
	l.DisableQuitKeybindings()
35
36
	return listModel{inner: l}
37
}
38
39
func (l listModel) Update(msg tea.Msg) (listModel, tea.Cmd) {
40
	var cmd tea.Cmd
41
	l.inner, cmd = l.inner.Update(msg)
42
	return l, cmd
43
}
44
45
func (l listModel) View() string { return l.inner.View() }
46
47
func (l *listModel) SetSize(w, h int) { l.inner.SetSize(w, h) }
48
49
func (l *listModel) SetNotes(notes []Note) tea.Cmd {
50
	items := make([]list.Item, 0, len(notes))
51
	for _, n := range notes {
52
		items = append(items, noteItem{note: n})
53
	}
54
	return l.inner.SetItems(items)
55
}
56
57
func (l listModel) Selected() (Note, bool) {
58
	it := l.inner.SelectedItem()
59
	if it == nil {
60
		return Note{}, false
61
	}
62
	n, ok := it.(noteItem)
63
	if !ok {
64
		return Note{}, false
65
	}
66
	return n.note, true
67
}
68
69
func (l listModel) IsFiltering() bool {
70
	return l.inner.SettingFilter()
71
}