zworld/plugins/system/input/mouse/handler.go
2024-01-14 22:56:06 +08:00

74 lines
1.6 KiB
Go

package mouse
import (
"github.com/go-gl/glfw/v3.3/glfw"
"zworld/plugins/system/input/keys"
"zworld/plugins/math/vec2"
)
type Callback func(Event)
type Handler interface {
MouseEvent(Event)
}
type MouseWrapper interface {
Button(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey)
Move(w *glfw.Window, x, y float64)
Scroll(w *glfw.Window, x, y float64)
}
type wrapper struct {
Handler
position vec2.T
}
func NewWrapper(handler Handler) MouseWrapper {
return &wrapper{
Handler: handler,
}
}
func (mw *wrapper) Button(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) {
mw.MouseEvent(&event{
action: Action(action),
button: Button(button),
mods: keys.Modifier(mod),
position: mw.position,
locked: locked,
})
}
func (mw *wrapper) Move(w *glfw.Window, x, y float64) {
// calculate framebuffer scale relative to window
width, _ := w.GetSize()
fwidth, fheight := w.GetFramebufferSize()
scale := float32(fwidth) / float32(width)
// calculate framebuffer position & mouse delta
pos := vec2.New(float32(x), float32(y)).Scaled(scale)
dt := pos.Sub(mw.position)
mw.position = pos
// discard events that occur outside of the window bounds
if pos.X < 0 || pos.Y < 0 || int(pos.X) > fwidth || int(pos.Y) > fheight {
return
}
// submit event to handler
mw.MouseEvent(&event{
action: Move,
position: pos,
delta: dt,
locked: locked,
})
}
func (mw *wrapper) Scroll(w *glfw.Window, x, y float64) {
mw.MouseEvent(&event{
action: Scroll,
scroll: vec2.New(float32(x), float32(y)),
locked: locked,
})
}