ui: event handlers

This commit is contained in:
2019-12-29 17:30:21 +00:00
parent 6f605aa502
commit d1a1c50afc
2 changed files with 76 additions and 60 deletions

View File

@@ -4,6 +4,7 @@ import (
"flag"
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/inpututil"
)
var (
@@ -12,8 +13,9 @@ var (
)
type Window struct {
Title string
KeyEventHandlers map[ebiten.Key][]func()
Title string
KeyUpHandlers map[ebiten.Key]func()
MouseWheelHandler func(float64, float64)
// User-provided update actions
updateFn func() error
@@ -25,13 +27,18 @@ type Window struct {
// ebiten assumes a single window, so only call this once...
func NewWindow(title string) (*Window, error) {
return &Window{
Title: title,
KeyEventHandlers: make(map[ebiten.Key][]func()),
Title: title,
KeyUpHandlers: make(map[ebiten.Key]func()),
}, nil
}
// TODO: multiple handlers for the same key?
func (w *Window) OnKeyUp(key ebiten.Key, f func()) {
w.KeyUpHandlers[key] = f
}
func (w *Window) OnMouseWheel(f func(x, y float64)) {
w.MouseWheelHandler = f
}
func (w *Window) run(screen *ebiten.Image) error {
@@ -40,6 +47,20 @@ func (w *Window) run(screen *ebiten.Image) error {
}
// Process keys
// TODO: efficient set operations
for key, cb := range w.KeyUpHandlers {
if inpututil.IsKeyJustReleased(key) {
cb()
}
}
if w.MouseWheelHandler != nil {
x, y := ebiten.Wheel()
if x != 0 || y != 0 {
w.MouseWheelHandler(x, y)
}
}
if !ebiten.IsDrawingSkipped() {
if err := w.drawFn(screen); err != nil {