Sander Schobers
9641719579
Refactored event handling to be able to "handle" events so no other controls will handle the same event again.
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package tins2020
|
|
|
|
import "github.com/veandco/go-sdl2/sdl"
|
|
|
|
type Control interface {
|
|
Init(*Context) error
|
|
Arrange(*Context, Rectangle)
|
|
Handle(*Context, sdl.Event) bool
|
|
Render(*Context)
|
|
}
|
|
|
|
type EventContextFn func(*Context)
|
|
|
|
type EventFn func()
|
|
|
|
type EventInterfaceFn func(interface{})
|
|
|
|
func EmptyEvent(fn EventFn) EventContextFn {
|
|
return func(*Context) { fn() }
|
|
}
|
|
|
|
type ControlBase struct {
|
|
Bounds Rectangle
|
|
|
|
IsMouseOver bool
|
|
|
|
OnLeftMouseButtonClick EventContextFn
|
|
}
|
|
|
|
func (b *ControlBase) Arrange(ctx *Context, bounds Rectangle) { b.Bounds = bounds }
|
|
|
|
func (b *ControlBase) Init(*Context) error { return nil }
|
|
|
|
func (b *ControlBase) Handle(ctx *Context, event sdl.Event) bool {
|
|
b.HandleNoFeedback(ctx, event)
|
|
return false
|
|
}
|
|
|
|
func (b *ControlBase) HandleNoFeedback(ctx *Context, event sdl.Event) {
|
|
switch e := event.(type) {
|
|
case *sdl.MouseMotionEvent:
|
|
b.IsMouseOver = b.Bounds.IsPointInside(e.X, e.Y)
|
|
case *sdl.MouseButtonEvent:
|
|
if b.IsMouseOver && e.Button == sdl.BUTTON_LEFT && e.Type == sdl.MOUSEBUTTONDOWN {
|
|
b.Invoke(ctx, b.OnLeftMouseButtonClick)
|
|
}
|
|
case *sdl.WindowEvent:
|
|
if e.Event == sdl.WINDOWEVENT_LEAVE {
|
|
b.IsMouseOver = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func (b *ControlBase) Invoke(ctx *Context, fn EventContextFn) {
|
|
if fn == nil {
|
|
return
|
|
}
|
|
fn(ctx)
|
|
}
|
|
|
|
func (b *ControlBase) Render(*Context) {}
|