03650474e2
Also update to the tcell v2 PaletteColor api, which should keep the chosen theme of the user intact. Note, that if $TRUECOLOR is defined and a truecolor given, aerc will now stop clipping the value to one of the theme colors. Generally this is desired behaviour though.
107 lines
2.1 KiB
Go
107 lines
2.1 KiB
Go
package widgets
|
|
|
|
import (
|
|
"github.com/gdamore/tcell/v2"
|
|
|
|
"git.sr.ht/~sircmpwn/aerc/config"
|
|
"git.sr.ht/~sircmpwn/aerc/lib/ui"
|
|
)
|
|
|
|
type Selector struct {
|
|
ui.Invalidatable
|
|
chooser bool
|
|
focused bool
|
|
focus int
|
|
options []string
|
|
uiConfig config.UIConfig
|
|
|
|
onChoose func(option string)
|
|
onSelect func(option string)
|
|
}
|
|
|
|
func NewSelector(options []string, focus int, uiConfig config.UIConfig) *Selector {
|
|
return &Selector{
|
|
focus: focus,
|
|
options: options,
|
|
uiConfig: uiConfig,
|
|
}
|
|
}
|
|
|
|
func (sel *Selector) Chooser(chooser bool) *Selector {
|
|
sel.chooser = chooser
|
|
return sel
|
|
}
|
|
|
|
func (sel *Selector) Invalidate() {
|
|
sel.DoInvalidate(sel)
|
|
}
|
|
|
|
func (sel *Selector) Draw(ctx *ui.Context) {
|
|
ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ',
|
|
sel.uiConfig.GetStyle(config.STYLE_SELECTOR_DEFAULT))
|
|
x := 2
|
|
for i, option := range sel.options {
|
|
style := sel.uiConfig.GetStyle(config.STYLE_SELECTOR_DEFAULT)
|
|
if sel.focus == i {
|
|
if sel.focused {
|
|
style = sel.uiConfig.GetStyle(config.STYLE_SELECTOR_FOCUSED)
|
|
} else if sel.chooser {
|
|
style = sel.uiConfig.GetStyle(config.STYLE_SELECTOR_CHOOSER)
|
|
}
|
|
}
|
|
x += ctx.Printf(x, 1, style, "[%s]", option)
|
|
x += 5
|
|
}
|
|
}
|
|
|
|
func (sel *Selector) OnChoose(fn func(option string)) *Selector {
|
|
sel.onChoose = fn
|
|
return sel
|
|
}
|
|
|
|
func (sel *Selector) OnSelect(fn func(option string)) *Selector {
|
|
sel.onSelect = fn
|
|
return sel
|
|
}
|
|
|
|
func (sel *Selector) Selected() string {
|
|
return sel.options[sel.focus]
|
|
}
|
|
|
|
func (sel *Selector) Focus(focus bool) {
|
|
sel.focused = focus
|
|
sel.Invalidate()
|
|
}
|
|
|
|
func (sel *Selector) 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
|
|
}
|