93 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								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}
							 | 
						||
| 
								 | 
							
								}
							 |