diff options
Diffstat (limited to 'intercepter.go')
| -rw-r--r-- | intercepter.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/intercepter.go b/intercepter.go new file mode 100644 index 0000000..95df3c6 --- /dev/null +++ b/intercepter.go @@ -0,0 +1,35 @@ +package gui + +import ( + "image" + "image/draw" +) + +// 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(Env) Env +} + +// 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) +} + +func (ri RedrawIntercepter) Intercept(parent Env) Env { + return newEnv(parent, + func(e Event, c chan<- Event) { + c <- e + if resize, ok := e.(Resize); ok { + parent.Draw() <- func(drw draw.Image) image.Rectangle { + ri.Redraw(drw, resize.Rectangle) + return resize.Rectangle + } + } + }, + send, // forward draw functions un-modified + func() {}) +} |