Noah Petherbridge
c8620f871e
* Add new pkg/drawtool with utilities to abstract away drawing actions into Strokes and track undo/redo History for them. * The freehand Pencil tool in EditorMode has been refactored to create a Stroke of Shape=Freehand and queue up its world pixels there instead of directly modifying the level chunker in real time. When the mouse button is released, the freehand Stroke is committed to the level chunker and added to the UndoHistory. * UndoHistory is (temporarily) stored with the level.Level so it can survive trips to PlayScene and back, but is not stored as JSON on disk. * Ctrl-Z and Ctrl-Y in EditorMode for undo and redo, respectively.
93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
// Package events manages mouse and keyboard SDL events for Doodle.
|
|
package events
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// State keeps track of event states.
|
|
type State struct {
|
|
// Mouse buttons.
|
|
Button1 *BoolTick // left
|
|
Button2 *BoolTick // right
|
|
Button3 *BoolTick // middle
|
|
|
|
EscapeKey *BoolTick
|
|
EnterKey *BoolTick
|
|
ShiftActive *BoolTick
|
|
ControlActive *BoolTick
|
|
KeyName *StringTick
|
|
Up *BoolTick
|
|
Left *BoolTick
|
|
Right *BoolTick
|
|
Down *BoolTick
|
|
|
|
// Cursor positions.
|
|
CursorX *Int32Tick
|
|
CursorY *Int32Tick
|
|
|
|
// Window events: window has changed size.
|
|
Resized *BoolTick
|
|
}
|
|
|
|
// New creates a new event state manager.
|
|
func New() *State {
|
|
return &State{
|
|
Button1: &BoolTick{},
|
|
Button2: &BoolTick{},
|
|
Button3: &BoolTick{},
|
|
EscapeKey: &BoolTick{},
|
|
EnterKey: &BoolTick{},
|
|
ShiftActive: &BoolTick{},
|
|
ControlActive: &BoolTick{},
|
|
KeyName: &StringTick{},
|
|
Up: &BoolTick{},
|
|
Left: &BoolTick{},
|
|
Right: &BoolTick{},
|
|
Down: &BoolTick{},
|
|
CursorX: &Int32Tick{},
|
|
CursorY: &Int32Tick{},
|
|
Resized: &BoolTick{},
|
|
}
|
|
}
|
|
|
|
// ReadKey returns the normalized key symbol being pressed,
|
|
// taking the Shift key into account. QWERTY keyboard only, probably.
|
|
func (ev *State) ReadKey() string {
|
|
if key := ev.KeyName.Read(); key != "" {
|
|
if ev.ShiftActive.Pressed() {
|
|
if symbol, ok := shiftMap[key]; ok {
|
|
return symbol
|
|
}
|
|
return strings.ToUpper(key)
|
|
}
|
|
return key
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// shiftMap maps keys to their Shift versions.
|
|
var shiftMap = map[string]string{
|
|
"`": "~",
|
|
"1": "!",
|
|
"2": "@",
|
|
"3": "#",
|
|
"4": "$",
|
|
"5": "%",
|
|
"6": "^",
|
|
"7": "&",
|
|
"8": "*",
|
|
"9": "(",
|
|
"0": ")",
|
|
"-": "_",
|
|
"=": "+",
|
|
"[": "{",
|
|
"]": "}",
|
|
`\`: "|",
|
|
";": ":",
|
|
`'`: `"`,
|
|
",": "<",
|
|
".": ">",
|
|
"/": "?",
|
|
}
|