diff options
author | Reto Brunner <reto@labrat.space> | 2020-07-30 23:22:32 +0200 |
---|---|---|
committer | Reto Brunner <reto@labrat.space> | 2020-07-30 23:22:32 +0200 |
commit | 3d784c5d8c7d037e38159fc1753773a2e81aa43e (patch) | |
tree | 2c062c9f4b4641a59e3f4f3ff3317f636bfd49cf /widgets/selecter.go | |
parent | 6ee7b1c3fd40b0e2f93dcaa7ffb3b0bdd56ac285 (diff) | |
download | aerc-3d784c5d8c7d037e38159fc1753773a2e81aa43e.tar.gz |
Revert "Implement style configuration."
This reverts commit 1ff687ca2b0821c2cacc1fa725abb3302d2af9da.
Diffstat (limited to 'widgets/selecter.go')
-rw-r--r-- | widgets/selecter.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/widgets/selecter.go b/widgets/selecter.go new file mode 100644 index 00000000..7fae9cda --- /dev/null +++ b/widgets/selecter.go @@ -0,0 +1,103 @@ +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 +} |