apps/sipp/tui/list_model.go 1.9 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
var listIDStyle = sharedtui.ListIDStyle
10
11
type snippetItem struct {
12
	snippet Snippet
13
}
14
15
func (s snippetItem) Title() string {
16
	label := s.snippet.Name
17
	if label == "" {
18
		label = s.snippet.ShortID
19
		return label
20
	}
21
	return label + listIDStyle.Render(" "+s.snippet.ShortID)
22
}
23
func (s snippetItem) Description() string { return "" }
24
func (s snippetItem) FilterValue() string {
25
	if s.snippet.Name != "" {
26
		return s.snippet.Name + " " + s.snippet.ShortID
27
	}
28
	return s.snippet.ShortID
29
}
30
31
type listModel struct {
32
	inner list.Model
33
}
34
35
func newListModel(snippets []Snippet) listModel {
36
	items := make([]list.Item, 0, len(snippets))
37
	for _, s := range snippets {
38
		items = append(items, snippetItem{snippet: s})
39
	}
40
41
	l := list.New(items, sharedtui.ANSIListDelegate(), 0, 0)
42
	l.Title = "snippets"
43
	l.Styles = sharedtui.ANSIListStyles()
44
	l.SetShowStatusBar(false)
45
	l.SetShowPagination(false)
46
	l.SetShowHelp(false)
47
	l.SetFilteringEnabled(true)
48
	l.DisableQuitKeybindings()
49
50
	return listModel{inner: l}
51
}
52
53
func (l listModel) Update(msg tea.Msg) (listModel, tea.Cmd) {
54
	var cmd tea.Cmd
55
	l.inner, cmd = l.inner.Update(msg)
56
	return l, cmd
57
}
58
59
func (l listModel) View() string { return l.inner.View() }
60
61
func (l *listModel) SetSize(w, h int) { l.inner.SetSize(w, h) }
62
63
func (l *listModel) SetSnippets(snippets []Snippet) tea.Cmd {
64
	items := make([]list.Item, 0, len(snippets))
65
	for _, s := range snippets {
66
		items = append(items, snippetItem{snippet: s})
67
	}
68
	return l.inner.SetItems(items)
69
}
70
71
func (l listModel) Selected() (Snippet, bool) {
72
	it := l.inner.SelectedItem()
73
	if it == nil {
74
		return Snippet{}, false
75
	}
76
	s, ok := it.(snippetItem)
77
	if !ok {
78
		return Snippet{}, false
79
	}
80
	return s.snippet, true
81
}
82
83
func (l listModel) IsFiltering() bool {
84
	return l.inner.SettingFilter()
85
}