-
Notifications
You must be signed in to change notification settings - Fork 0
/
fuzzy.go
98 lines (88 loc) · 2.61 KB
/
fuzzy.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
package gui
import (
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
"github.com/sahilm/fuzzy"
)
func FuzzyFind(inputField *tview.InputField, focusedList *tview.List, listItems []string, b *tview.List, f *tview.List, p *tview.TextView) {
inputField.SetChangedFunc(func(text string) {
results := fuzzy.Find(text, listItems)
focusedList.Clear()
for _, val := range results {
focusedList.AddItem(val.Str, "", 0, nil)
}
})
inputField.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Key() == tcell.KeyBackspace || event.Key() == tcell.KeyBackspace2 {
text := inputField.GetText()
if len(text) < 2 {
focusedList.Clear()
for _, val := range listItems {
focusedList.AddItem(val, "", 0, nil)
}
} else {
results := fuzzy.Find(text, listItems)
focusedList.Clear()
for _, val := range results {
focusedList.AddItem(val.Str, "", 0, nil)
}
}
} else if event.Key() == tcell.KeyDown {
ScrollDown(focusedList)
} else if event.Key() == tcell.KeyUp {
ScrollUp(focusedList)
} else if event.Key() == tcell.KeyEnter {
if focusedList.GetItemCount() == 0 {
for _, val := range listItems {
focusedList.AddItem(val, "", 0, nil)
}
footer := createDefaultFooter(envName)
grid := CreateDefaultGrid(b, f, p, footer)
app.SetRoot(grid, true).SetFocus(focusedList)
return event
}
text, _ := focusedList.GetItemText(focusedList.GetCurrentItem())
focusedList.Clear()
for _, val := range listItems {
focusedList.AddItem(val, "", 0, nil)
}
targetIndex = -1
for i := 0; i < focusedList.GetItemCount(); i++ {
mainText, _ := focusedList.GetItemText(i)
if mainText == text {
targetIndex = i
focusedList.SetCurrentItem(targetIndex)
break
}
}
footer := createDefaultFooter(envName)
grid := CreateDefaultGrid(b, f, p, footer)
app.SetRoot(grid, true).SetFocus(focusedList)
if targetIndex != -1 {
focusedList.SetCurrentItem(targetIndex)
app.QueueEvent(tcell.NewEventKey(tcell.KeyEnter, 0, tcell.ModNone))
}
} else if event.Key() == tcell.KeyEscape {
focusedList.Clear()
for _, val := range listItems {
focusedList.AddItem(val, "", 0, nil)
}
footer := createDefaultFooter(envName)
grid := CreateDefaultGrid(b, f, p, footer)
app.SetRoot(grid, true).SetFocus(focusedList)
}
return event
})
}
func ScrollDown(l *tview.List) {
count := l.GetItemCount()
index := l.GetCurrentItem()
index += 1
l.SetCurrentItem(index % count)
}
func ScrollUp(l *tview.List) {
count := l.GetItemCount()
index := l.GetCurrentItem()
index -= 1
l.SetCurrentItem(index % count)
}