ui: event handlers
This commit is contained in:
@@ -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 {
|
||||
|
Reference in New Issue
Block a user