-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlist.go
127 lines (101 loc) · 2.61 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package mdtt
import (
"fmt"
"io"
"strings"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
var (
headerWidth = 30
)
type item string
type selectMsg struct {
idx int
}
func selectCmd(idx int) tea.Cmd {
return func() tea.Msg {
return selectMsg{idx: idx}
}
}
func (i item) FilterValue() string { return "" }
type itemDelegate struct{}
func (d itemDelegate) Height() int { return 1 }
func (d itemDelegate) Spacing() int { return 0 }
func (d itemDelegate) Update(_ tea.Msg, _ *list.Model) tea.Cmd { return nil }
func (d itemDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item) {
i, ok := listItem.(item)
if !ok {
return
}
str := string(i)
fn := listItemStyle.Render
if index == m.Index() {
fn = func(s ...string) string {
return listSelectedItemStyle.Render("> " +
strings.Replace(strings.Join(s, " "), "\n", "\n ", -1))
}
}
fmt.Fprint(w, fn(str))
}
type headerList struct {
list list.Model
}
func (m headerList) update(msg tea.Msg) (headerList, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.list.SetWidth(msg.Width)
return m, nil
case tea.KeyMsg:
switch keypress := msg.String(); keypress {
case "enter":
return m, selectCmd(m.list.Index())
}
}
var cmd tea.Cmd
m.list, cmd = m.list.Update(msg)
return m, cmd
}
func (m headerList) view() string {
return "\n" + m.list.View()
}
func NewHeaderList(opts ...func(*headerList)) headerList {
listItems := []list.Item{}
const defaultWidth = 20
l := list.New(listItems, itemDelegate{}, defaultWidth, 0)
l.Title = "Select a table:"
l.SetShowStatusBar(false)
l.SetFilteringEnabled(false)
l.SetShowFilter(false)
l.SetShowHelp(false)
l.SetShowTitle(false)
l.Styles.PaginationStyle = listPaginationStyle
l.Styles.HelpStyle = listHelpStyle
m := headerList{list: l}
for _, opt := range opts {
opt(&m)
}
m.list.SetHeight(len(m.list.Items()) * 2)
return m
}
func WithItems(items []list.Item) func(*headerList) {
return func(m *headerList) {
m.list.SetItems(items)
}
}
func WithTables(tables []TableModel) func(*headerList) {
return func(m *headerList) {
var items []list.Item
for _, t := range tables {
var headerCells []string
for _, c := range t.cols {
headerCells = append(headerCells, strings.Repeat(" ", 4)+c.title.value())
}
header := lipgloss.JoinHorizontal(lipgloss.Left, headerCells...)
header = padOrTruncate(header, headerWidth) + " …"
items = append(items, item(listHeaderStyle.Render(header)))
}
m.list.SetItems(items)
}
}