discordo/internal/picker/picker.go
2025-03-26 16:50:30 -04:00

57 lines
1 KiB
Go

package picker
import (
"github.com/rivo/tview"
"github.com/sahilm/fuzzy"
)
type Picker struct {
*tview.Flex
Input *tview.InputField
List *tview.List
app *tview.Application
items Items
}
func New(app *tview.Application, items Items) *Picker {
p := &Picker{
Flex: tview.NewFlex(),
Input: tview.NewInputField(),
List: tview.NewList(),
app: app,
items: items,
}
// Render all of the items initially.
p.changed("")
p.Input.SetChangedFunc(p.changed)
p.List.ShowSecondaryText(false).SetFocusFunc(func() {
app.SetFocus(p.Input)
})
p.Flex.
SetDirection(tview.FlexRow).
AddItem(p.Input, 3, 1, true).
AddItem(p.List, 0, 1, false)
return p
}
func (p *Picker) changed(text string) {
var fuzzied Items
if text == "" {
fuzzied = append(fuzzied, p.items...)
} else {
matches := fuzzy.FindFrom(text, p.items)
for _, match := range matches {
fuzzied = append(fuzzied, p.items[match.Index])
}
}
p.List.Clear()
for _, item := range fuzzied {
p.List.AddItem(item.text, "", 0, item.selected)
}
}