zworld/plugins/system/input/mouse/event.go

93 lines
2.0 KiB
Go
Raw Permalink Normal View History

2024-01-14 22:56:06 +08:00
package mouse
import (
"fmt"
"zworld/plugins/system/input/keys"
"zworld/plugins/math/vec2"
)
type Event interface {
Action() Action
Button() Button
Position() vec2.T
Delta() vec2.T
Scroll() vec2.T
Modifier() keys.Modifier
Project(vec2.T) Event
Locked() bool
Handled() bool
Consume()
}
type event struct {
action Action
button Button
position vec2.T
delta vec2.T
scroll vec2.T
mods keys.Modifier
handled bool
locked bool
}
func (e event) Action() Action { return e.action }
func (e event) Button() Button { return e.button }
func (e event) Position() vec2.T { return e.position }
func (e event) Delta() vec2.T { return e.delta }
func (e event) Scroll() vec2.T { return e.scroll }
func (e event) Modifier() keys.Modifier { return e.mods }
func (e event) Handled() bool { return e.handled }
func (e event) Locked() bool { return e.locked }
func (e *event) Consume() {
e.handled = true
}
func (e *event) Project(relativePos vec2.T) Event {
projected := *e
projected.position = projected.position.Sub(relativePos)
return &projected
}
func (e event) String() string {
switch e.action {
case Move:
return fmt.Sprintf("MouseEvent: Moved to %.0f,%.0f (delta %.0f,%.0f)",
e.position.X, e.position.Y,
e.delta.X, e.delta.Y)
case Press:
return fmt.Sprintf("MouseEvent: Press %s at %.0f,%.0f", e.button, e.position.X, e.position.Y)
case Release:
return fmt.Sprintf("MouseEvent: Release %s at %.0f,%.0f", e.button, e.position.X, e.position.Y)
}
return "MouseEvent: Invalid"
}
func NewButtonEvent(button Button, action Action, pos vec2.T, mod keys.Modifier, locked bool) Event {
return &event{
action: action,
button: button,
mods: mod,
position: pos,
locked: locked,
}
}
func NewMouseEnterEvent() Event {
return &event{
action: Enter,
}
}
func NewMouseLeaveEvent() Event {
return &event{
action: Leave,
}
}
func NopEvent() Event {
return &event{action: -1}
}