From 61a63fec579f88766c6be0d392bb4eaed3b8564a Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sun, 12 May 2024 17:14:30 -0400 Subject: button widget --- gui/widget/button.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gui/widget/tree.go | 1 - 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 gui/widget/button.go diff --git a/gui/widget/button.go b/gui/widget/button.go new file mode 100644 index 0000000..fe2f30b --- /dev/null +++ b/gui/widget/button.go @@ -0,0 +1,62 @@ +package widget + +import ( + "image" + "image/draw" + "sync" + + "volute/gui" + "volute/gui/text" + "volute/gui/win" +) + +func Button[T any]( + signal chan<- T, + val T, + label string, + r image.Rectangle, + focus FocusSlave, + env gui.Env, + wg *sync.WaitGroup, +) { + defer wg.Done() + defer close(signal) + + focused := false + env.Draw() <- buttonDraw(label, focused, r) + for { + select { + case _, ok := <-focus.gain: + if !ok { + return + } + focused = true + env.Draw() <- buttonDraw(label, focused, r) + case dir, ok := <-focus.lose: + if !ok { + return + } + focus.yield <- dir + focused = false + env.Draw() <- buttonDraw(label, focused, r) + case event, ok := <-env.Events(): + if !ok { + return + } + if event, ok := event.(win.KbDown); ok && focused && event.Key == win.KeyEnter { + signal <- val + } + } + } +} + +func buttonDraw(label string, focused bool, r image.Rectangle) func(drw draw.Image) image.Rectangle { + return func(drw draw.Image) image.Rectangle { + if focused { + text.Draw(label, drw, r, BLACK, FOCUS_COLOR, text.ALIGN_LEFT) + } else { + text.Draw(label, drw, r, BLACK, WHITE, text.ALIGN_LEFT) + } + return r + } +} diff --git a/gui/widget/tree.go b/gui/widget/tree.go index 9e4af13..ff4d139 100644 --- a/gui/widget/tree.go +++ b/gui/widget/tree.go @@ -54,7 +54,6 @@ func flatten[T any](root Node[T], depth int) []string { make([]rune, depth), '─')) nodes := []string{indent + root.Label} - root.expanded = true // TODO: remove me if root.expanded { for _, c := range root.Children { nodes = append(nodes, flatten(c, depth+1)...) -- cgit v1.2.3