Noah Petherbridge
5c803f6a88
* Refactor the events used in lib/render/sdl to be more general-purpose to make librender a stand-alone library separate from Doodle.
110 lines
1.8 KiB
Go
110 lines
1.8 KiB
Go
package event
|
|
|
|
import "strings"
|
|
|
|
// State holds the current state of key/mouse events.
|
|
type State struct {
|
|
// Mouse buttons.
|
|
Button1 bool // Left
|
|
Button2 bool // Middle
|
|
Button3 bool // Right
|
|
|
|
// Special keys
|
|
Escape bool
|
|
Enter bool
|
|
Shift bool
|
|
Ctrl bool
|
|
Alt bool
|
|
Up bool
|
|
Left bool
|
|
Right bool
|
|
Down bool
|
|
|
|
// Pressed keys.
|
|
keydown map[string]interface{}
|
|
|
|
// Cursor position
|
|
CursorX int
|
|
CursorY int
|
|
|
|
// Window resized
|
|
WindowResized bool
|
|
}
|
|
|
|
// NewState creates a new event.State.
|
|
func NewState() *State {
|
|
return &State{
|
|
keydown: map[string]interface{}{},
|
|
}
|
|
}
|
|
|
|
// SetKeyDown sets that a named key is pressed down.
|
|
func (s *State) SetKeyDown(name string, down bool) {
|
|
if down {
|
|
s.keydown[name] = nil
|
|
} else {
|
|
delete(s.keydown, name)
|
|
}
|
|
}
|
|
|
|
// KeyDown returns whether a named key is currently pressed.
|
|
func (s *State) KeyDown(name string) bool {
|
|
_, ok := s.keydown[name]
|
|
return ok
|
|
}
|
|
|
|
// KeysDown returns a list of all key names currently pressed down.
|
|
// Set shifted to True to return the key symbols correctly shifted
|
|
// (uppercase, or symbols on number keys, etc.)
|
|
func (s *State) KeysDown(shifted bool) []string {
|
|
var (
|
|
result = make([]string, len(s.keydown))
|
|
i = 0
|
|
)
|
|
|
|
for key := range s.keydown {
|
|
if shifted && s.Shift {
|
|
if symbol, ok := shiftMap[key]; ok {
|
|
result[i] = symbol
|
|
} else {
|
|
result[i] = strings.ToUpper(key)
|
|
}
|
|
} else {
|
|
result[i] = key
|
|
}
|
|
|
|
i++
|
|
}
|
|
return result
|
|
}
|
|
|
|
// ResetKeyDown clears all key-down states.
|
|
func (s *State) ResetKeyDown() {
|
|
s.keydown = map[string]interface{}{}
|
|
}
|
|
|
|
// shiftMap maps keys to their Shift versions.
|
|
var shiftMap = map[string]string{
|
|
"`": "~",
|
|
"1": "!",
|
|
"2": "@",
|
|
"3": "#",
|
|
"4": "$",
|
|
"5": "%",
|
|
"6": "^",
|
|
"7": "&",
|
|
"8": "*",
|
|
"9": "(",
|
|
"0": ")",
|
|
"-": "_",
|
|
"=": "+",
|
|
"[": "{",
|
|
"]": "}",
|
|
`\`: "|",
|
|
";": ":",
|
|
`'`: `"`,
|
|
",": "<",
|
|
".": ">",
|
|
"/": "?",
|
|
}
|