diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-01-17 17:14:28 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-01-17 17:14:28 -0500 |
| commit | b039cf83c33630396f245fbcba79383e0b2db383 (patch) | |
| tree | ef54c5ebad1f2d577676c571d5a8c505456b85cb | |
| parent | bd9bce9f1278743e961a18cab688fdb09876560c (diff) | |
| download | volute-b039cf83c33630396f245fbcba79383e0b2db383.zip | |
add output widget
| -rw-r--r-- | gui/widget/widget.go | 51 | ||||
| -rw-r--r-- | main.go | 38 |
2 files changed, 70 insertions, 19 deletions
diff --git a/gui/widget/widget.go b/gui/widget/widget.go index 82738bd..216b146 100644 --- a/gui/widget/widget.go +++ b/gui/widget/widget.go @@ -28,7 +28,7 @@ func Label(text string, r image.Rectangle, env gui.Env) { close(env.Draw()) } -func Input(val chan<- float64, r image.Rectangle, env gui.Env) { +func Input(val chan<- uint, r image.Rectangle, env gui.Env) { redraw := func(text []byte) func(draw.Image) image.Rectangle { return func(drw draw.Image) image.Rectangle { drawText(text, drw, r) @@ -51,17 +51,44 @@ func Input(val chan<- float64, r image.Rectangle, env gui.Env) { focus = true } case win.KbType: - if !focus || - (!isDigit(event.Rune) && event.Rune != '.') || - (event.Rune == '.' && contains(text, '.')) { - continue + if focus && isDigit(event.Rune) { + text = fmt.Appendf(text, "%c", event.Rune) + env.Draw() <- redraw(text) + val <- atoi(text) } - text = fmt.Appendf(text, "%c", event.Rune) - env.Draw() <- redraw(text) case win.KbDown: - if event.Key == win.KeyBackspace && focus && len(text) > 0 { + if focus && event.Key == win.KeyBackspace && len(text) > 0 { text = text[:len(text)-1] env.Draw() <- redraw(text) + val <- atoi(text) + } + } + } + close(env.Draw()) +} + +func Output(val <-chan uint, r image.Rectangle, env gui.Env) { + redraw := func(n uint) func(draw.Image) image.Rectangle { + return func(drw draw.Image) image.Rectangle { + drawText([]byte(fmt.Sprint(n)), drw, r) + return r + } + } + + var n uint = 0 + env.Draw() <- redraw(n) + +Loop: + for { + select { + case n = <-val: + env.Draw() <- redraw(n) + case event, ok := <-env.Events(): + if !ok { // channel closed + break Loop + } + if event, ok := event.(win.WiFocus); ok && event.Focused { + env.Draw() <- redraw(n) } } } @@ -80,3 +107,11 @@ func contains[T cmp.Ordered](slc []T, v T) bool { } return false } + +func atoi(s []byte) uint { + var n uint = 0 + for _, d := range s { + n = n*10 + uint(d-'0') + } + return n +} @@ -18,7 +18,10 @@ func run() { mux, env := gui.NewMux(w) var ( - displacementChan = make(chan float64) + displacementChan = make(chan uint) + output = make(chan uint) + + displacement uint = 0 ) pad := 10 @@ -36,23 +39,36 @@ func run() { ) go widget.Label("cc", r, mux.MakeEnv()) + r = image.Rect( + pad, + r.Max.Y+pad, + pad+widget.TextWidth(6), + r.Max.Y+pad+widget.TextHeight(), + ) + go widget.Output(output, r, mux.MakeEnv()) + Loop: - for event := range env.Events() { - switch event := event.(type) { - case win.WiClose: - break Loop - case win.KbType: - if event.Rune == 'q' { + for { + select { + case displacement = <-displacementChan: + output <- displacement + case event, ok := <-env.Events(): + if !ok { // channel closed break Loop } - } - select { - case _ = <-displacementChan: - default: + switch event := event.(type) { + case win.WiClose: + break Loop + case win.KbType: + if event.Rune == 'q' { + break Loop + } + } } } close(env.Draw()) close(displacementChan) + close(output) } func main() { |