aboutsummaryrefslogtreecommitdiffstats
path: root/gui/layout/intercepter.go
blob: d25d57818d00a8f63030ce417d222b28a03c59aa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package layout

import (
	"image"
	"image/draw"

	"volute/gui"
)

// Intercepter represents an element that can interact with Envs.
// An Intercepter can modify Events, stop them or emit arbitrary ones.
// It can also put itself in the draw pipeline, for throttling very
// expensive draw calls for example.
type Intercepter interface {
	Intercept(gui.Env) gui.Env
}

var _ Intercepter = RedrawIntercepter{}

// RedrawIntercepter is a basic Intercepter, it is meant for use in simple Layouts
// that only need to redraw themselves.
type RedrawIntercepter struct {
	Redraw func(draw.Image, image.Rectangle)
}

// Intercept implements Intercepter
func (ri RedrawIntercepter) Intercept(env gui.Env) gui.Env {
	out, in := gui.MakeEventsChan()
	go func() {
		for e := range env.Events() {
			in <- e
			if resize, ok := e.(gui.Resize); ok {
				env.Draw() <- func(drw draw.Image) image.Rectangle {
					bounds := resize.Rectangle
					ri.Redraw(drw, bounds)
					return bounds
				}
			}
		}
	}()
	ret := &muxEnv{out, env.Draw()}
	return ret
}