package tins2020 import "github.com/veandco/go-sdl2/sdl" type Control interface { Init(*Context) error Arrange(*Context, Rectangle) Handle(*Context, sdl.Event) 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) { 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) {}