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
}
|