From 815b8ca9d246cfa4dba1ff6439c6cacaa9a5e9ee Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Thu, 8 Feb 2024 16:15:59 -0500 Subject: add image widget --- gui/widget/widget.go | 29 +++++++++++++++++++++++++++++ main.go | 11 +++++++++++ 2 files changed, 40 insertions(+) diff --git a/gui/widget/widget.go b/gui/widget/widget.go index 61ba760..ae09160 100644 --- a/gui/widget/widget.go +++ b/gui/widget/widget.go @@ -5,6 +5,7 @@ import ( "fmt" "sync" + xdraw "golang.org/x/image/draw" "image" "image/color" "image/draw" @@ -119,6 +120,34 @@ Loop: } } +func Image(imChan <-chan image.Image, r image.Rectangle, env gui.Env, wg *sync.WaitGroup) { + defer wg.Done() + defer close(env.Draw()) + + interp := xdraw.ApproxBiLinear + redraw := func(im image.Image) func(draw.Image) image.Rectangle { + return func(drw draw.Image) image.Rectangle { + interp.Scale(drw, r, im, im.Bounds(), draw.Src, nil) + return r + } + } + var im image.Image = image.NewGray(r) + + for { + select { + case im = <-imChan: + env.Draw() <- redraw(im) + case event, ok := <-env.Events(): + if !ok { + return + } + if event, ok := event.(win.WiFocus); ok && event.Focused { + env.Draw() <- redraw(im) + } + } + } +} + func isDigit(r rune) bool { return '0' <= r && r <= '9' } diff --git a/main.go b/main.go index edd76fe..656f749 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "image" "os" "sync" @@ -62,6 +63,16 @@ func run() { wg, ) + imChan := make(chan image.Image) + defer close(imChan) + wg.Add(1) + go widget.Image( + imChan, + image.Rect(0, 200, 100, 300), + mux.MakeEnv(), + wg, + ) + for i := 0; i < POINTS; i++ { wg.Add(1) go calculateFlow( -- cgit v1.2.3