-
Notifications
You must be signed in to change notification settings - Fork 0
/
page_tag.go
111 lines (98 loc) · 2.37 KB
/
page_tag.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
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 tagPageModel struct {
doc *topi.Document
list list.Model
delegateKeys tagPageDelegateKeyMap
width, height int
}
func newTagPageModel(doc *topi.Document) tagPageModel {
m := tagPageModel{
doc: doc,
}
m.delegateKeys = newTagPageDelegateKeyMap()
delegate := newTagPageListDelegate()
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 tagPageDelegateKeyMap struct {
back key.Binding
enter key.Binding
}
func newTagPageDelegateKeyMap() tagPageDelegateKeyMap {
return tagPageDelegateKeyMap{
back: key.NewBinding(
key.WithKeys("backspace", "ctrl+h"),
key.WithHelp("backspace", "back"),
),
enter: key.NewBinding(
key.WithKeys("enter"),
key.WithHelp("enter", "select"),
),
}
}
func (m *tagPageModel) updateItems() {
tags := m.doc.Tags
items := make([]list.Item, 0)
for _, tag := range tags {
if len(m.doc.TagPathMap[tag.Name]) > 0 {
item := tagPageListItem{tag}
items = append(items, item)
}
}
m.list.SetItems(items)
}
func (m *tagPageModel) reset() {
m.list.ResetSelected()
m.list.ResetFilter()
}
func (m *tagPageModel) SetSize(w, h int) {
m.width, m.height = w, h
m.list.SetSize(w, h)
}
func (m tagPageModel) Init() tea.Cmd {
return nil
}
func (m tagPageModel) Update(msg tea.Msg) (tagPageModel, 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 {
tag := m.list.SelectedItem().(tagPageListItem).tag
return m, selectTag(tag.Name)
}
}
case selectTagMenuMsg:
m.updateItems()
m.reset()
return m, nil
}
var cmd tea.Cmd
m.list, cmd = m.list.Update(msg)
return m, cmd
}
func (m tagPageModel) View() string {
return m.list.View()
}
func (m tagPageModel) statusbarInfoString() string {
return listStatusbarInfoString(m.list)
}
func (m tagPageModel) statusMessageString() string {
return listStatusMessageString(m.list)
}