-
Notifications
You must be signed in to change notification settings - Fork 0
/
page_path.go
112 lines (99 loc) · 2.44 KB
/
page_path.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
package ui
import (
"github.com/charmbracelet/bubbles/key"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
"github.com/lusingander/topi/internal/topi"
)
type pathPageModel struct {
doc *topi.Document
list list.Model
delegateKeys pathPageDelegateKeyMap
width, height int
}
func newPathPageModel(doc *topi.Document) pathPageModel {
m := pathPageModel{
doc: doc,
}
m.delegateKeys = newPathPageDelegateKeyMap()
delegate := newPathPageListDelegate()
m.list = list.New(nil, delegate, 0, 0)
m.list.SetShowTitle(false)
m.list.SetShowHelp(false)
m.list.SetShowStatusBar(false)
m.list.SetShowFilter(false)
m.list.SetShowPagination(false)
m.list.KeyMap.Quit.Unbind()
return m
}
type pathPageDelegateKeyMap struct {
enter key.Binding
back key.Binding
}
func newPathPageDelegateKeyMap() pathPageDelegateKeyMap {
return pathPageDelegateKeyMap{
enter: key.NewBinding(
key.WithKeys("enter"),
key.WithHelp("enter", "select"),
),
back: key.NewBinding(
key.WithKeys("backspace", "ctrl+h"),
key.WithHelp("backspace", "back"),
),
}
}
func (m *pathPageModel) SetSize(w, h int) {
m.width, m.height = w, h
m.list.SetSize(w, h)
}
func (m *pathPageModel) updateList() {
m.list.ResetSelected()
items := make([]list.Item, 0)
for _, tag := range m.doc.Tags {
paths := m.doc.TagPathMap[tag.Name]
for _, path := range paths {
item := pathPageListItem{path}
items = append(items, item)
}
}
m.list.SetItems(items)
}
func (m *pathPageModel) reset() {
m.list.ResetSelected()
m.list.ResetFilter()
}
func (m pathPageModel) Init() tea.Cmd {
return nil
}
func (m pathPageModel) Update(msg tea.Msg) (pathPageModel, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch {
case key.Matches(msg, m.delegateKeys.back):
if m.list.FilterState() != list.Filtering {
return m, goBack
}
case key.Matches(msg, m.delegateKeys.enter):
if m.list.FilterState() != list.Filtering {
path := m.list.SelectedItem().(pathPageListItem).path
return m, selectOperation(path.OperationId)
}
}
case selectPathMenuMsg:
m.updateList()
m.reset()
return m, nil
}
var cmd tea.Cmd
m.list, cmd = m.list.Update(msg)
return m, cmd
}
func (m pathPageModel) View() string {
return m.list.View()
}
func (m pathPageModel) statusbarInfoString() string {
return listStatusbarInfoString(m.list)
}
func (m pathPageModel) statusMessageString() string {
return listStatusMessageString(m.list)
}