aerc/widgets/selecter.go
Greg Anders 4bdef7d860 Add UI options to save/pipe messages with unsupported mimetypes
Adds a message indicating the user's ability to :save or :pipe a message
with an unsupported mimetype and also adds a selector widget (similar to
the tutorial).

The selector widget was previously defined in the account wizard module,
so this commit breaks it out into its own module to allow for re-use.

Further, modify the BeginExLine() function to take an argument that
pre-populates the command line, allowing functions to initiate an ex
command without executing it.

Closes #95.
2019-11-17 13:19:13 -05:00

103 lines
1.9 KiB
Go

package widgets
import (
"github.com/gdamore/tcell"
"git.sr.ht/~sircmpwn/aerc/lib/ui"
)
type Selecter struct {
ui.Invalidatable
chooser bool
focused bool
focus int
options []string
onChoose func(option string)
onSelect func(option string)
}
func NewSelecter(options []string, focus int) *Selecter {
return &Selecter{
focus: focus,
options: options,
}
}
func (sel *Selecter) Chooser(chooser bool) *Selecter {
sel.chooser = chooser
return sel
}
func (sel *Selecter) Invalidate() {
sel.DoInvalidate(sel)
}
func (sel *Selecter) Draw(ctx *ui.Context) {
ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
x := 2
for i, option := range sel.options {
style := tcell.StyleDefault
if sel.focus == i {
if sel.focused {
style = style.Reverse(true)
} else if sel.chooser {
style = style.Bold(true)
}
}
x += ctx.Printf(x, 1, style, "[%s]", option)
x += 5
}
}
func (sel *Selecter) OnChoose(fn func(option string)) *Selecter {
sel.onChoose = fn
return sel
}
func (sel *Selecter) OnSelect(fn func(option string)) *Selecter {
sel.onSelect = fn
return sel
}
func (sel *Selecter) Selected() string {
return sel.options[sel.focus]
}
func (sel *Selecter) Focus(focus bool) {
sel.focused = focus
sel.Invalidate()
}
func (sel *Selecter) Event(event tcell.Event) bool {
switch event := event.(type) {
case *tcell.EventKey:
switch event.Key() {
case tcell.KeyCtrlH:
fallthrough
case tcell.KeyLeft:
if sel.focus > 0 {
sel.focus--
sel.Invalidate()
}
if sel.onSelect != nil {
sel.onSelect(sel.Selected())
}
case tcell.KeyCtrlL:
fallthrough
case tcell.KeyRight:
if sel.focus < len(sel.options)-1 {
sel.focus++
sel.Invalidate()
}
if sel.onSelect != nil {
sel.onSelect(sel.Selected())
}
case tcell.KeyEnter:
if sel.onChoose != nil {
sel.onChoose(sel.Selected())
}
}
}
return false
}