aboutsummaryrefslogtreecommitdiffstats
path: root/examples/imageviewer/viewer.go
diff options
context:
space:
mode:
Diffstat (limited to 'examples/imageviewer/viewer.go')
-rw-r--r--examples/imageviewer/viewer.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/examples/imageviewer/viewer.go b/examples/imageviewer/viewer.go
new file mode 100644
index 0000000..e783d78
--- /dev/null
+++ b/examples/imageviewer/viewer.go
@@ -0,0 +1,65 @@
+package main
+
+import (
+ "image"
+ "image/draw"
+ "os"
+
+ "github.com/faiface/gui"
+
+ _ "image/gif"
+ _ "image/jpeg"
+ _ "image/png"
+
+ _ "golang.org/x/image/bmp"
+)
+
+func Viewer(env gui.Env, theme *Theme, view <-chan string) {
+ redraw := func(r image.Rectangle, img image.Image) func(draw.Image) image.Rectangle {
+ return func(drw draw.Image) image.Rectangle {
+ draw.Draw(drw, r, &image.Uniform{theme.Empty}, image.ZP, draw.Src)
+ DrawCentered(drw, r, img, draw.Over)
+ return r
+ }
+ }
+
+ invalid := DrawText("Invalid image", theme.Face, theme.Text)
+
+ var (
+ r image.Rectangle
+ img image.Image
+ )
+
+ for {
+ select {
+ case path := <-view:
+ func() {
+ f, err := os.Open(path)
+ if err != nil {
+ img = invalid
+ return
+ }
+ defer f.Close()
+ img, _, err = image.Decode(f)
+ if err != nil {
+ img = invalid
+ return
+ }
+ }()
+ env.Draw() <- redraw(r, img)
+
+ case e, ok := <-env.Events():
+ if !ok {
+ close(env.Draw())
+ return
+ }
+
+ var minX, minY, maxX, maxY int
+ switch {
+ case e.Matches("resize/%d/%d/%d/%d", &minX, &minY, &maxX, &maxY):
+ r = image.Rect(minX, minY, maxX, maxY)
+ env.Draw() <- redraw(r, img)
+ }
+ }
+ }
+}