-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathui.go
124 lines (107 loc) · 1.9 KB
/
ui.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
package mdtt
import (
"fmt"
tea "github.com/charmbracelet/bubbletea"
)
var (
defaultHeight = 2
)
type Model struct {
preview bool
tables []TableModel
table TableModel
choose int
list headerList
fpath string
inplace bool
}
type Option func(*Model) error
func (m Model) Init() tea.Cmd { return nil }
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) {
case selectMsg:
m.preview = false
m.choose = msg.idx
m.table = m.tables[msg.idx]
case quitMsg:
if !m.preview {
Write(m)
}
return m, tea.Quit
}
if m.preview {
m.list, cmd = m.list.update(msg)
} else {
m.table, cmd = m.table.Update(msg)
}
return m, cmd
}
func (m Model) View() string {
if m.preview {
return m.list.view()
} else {
return m.table.View() + "\n"
}
}
func NewUI(opts ...Option) (Model, error) {
t := NewTableModel(
WithColumns(DefaultColumns()),
WithNaiveRows(DefaultRows()),
WithFocused(true),
WithHeight(defaultHeight),
WithStyles(defaultStyles()),
)
m := Model{table: t}
for _, opt := range opts {
err := opt(&m)
if err != nil {
return m, err
}
}
return m, nil
}
func WithMarkdown(b []byte) Option {
return func(m *Model) error {
tables := parse(b)
if len(tables) == 0 {
return fmt.Errorf("no tables found")
}
list := NewHeaderList(
WithTables(tables),
)
m.table = tables[0]
m.choose = 0
m.list = list
m.tables = tables
if len(tables) == 1 {
m.preview = false
} else {
m.preview = true
}
return nil
}
}
func WithFilePath(f string) Option {
return func(m *Model) error {
m.fpath = f
return nil
}
}
func WithInplace(i bool) Option {
return func(m *Model) error {
m.inplace = i
return nil
}
}
func DefaultRows() []naiveRow {
return []naiveRow{
{"", ""},
}
}
func DefaultColumns() []column {
return []column{
{title: NewCell(""), width: 4},
{title: NewCell(""), width: 4},
}
}