Noah Petherbridge
b4a366baa9
The uix.Canvas widget now maintains a selected Tool which configures how the mouse interacts with the (editable) Canvas widget. The default Tool is the PencilTool and implements the old behavior: it draws pixels when clicked and dragged based on your currently selected Color Swatch. This tool automatically becomes active when you toggle the Palette tab in the editor mode. A new Tool is the ActorTool which becomes active when you select the Doodads tab. In the ActorTool you can't draw pixels on the level, but when you mouse over a Doodad instance (Actor) in your level, you may pick it up and drag it someplace else. Left-click an Actor to pick it up and drag it somewhere else. Right-click to delete it completely. You can also delete an Actor by dragging it OFF of the Canvas, like back onto the palette drawer or onto the menu bar.
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package level
|
|
|
|
import (
|
|
"git.kirsle.net/apps/doodle/render"
|
|
uuid "github.com/satori/go.uuid"
|
|
)
|
|
|
|
// ActorMap holds the doodad information by their ID in the level data.
|
|
type ActorMap map[string]*Actor
|
|
|
|
// Inflate assigns each actor its ID from the hash map for their self reference.
|
|
func (m ActorMap) Inflate() {
|
|
for id, actor := range m {
|
|
actor.id = id
|
|
}
|
|
}
|
|
|
|
// Add a new Actor to the map. If it doesn't already have an ID it will be
|
|
// given a random UUIDv4 ID.
|
|
func (m ActorMap) Add(a *Actor) {
|
|
if a.id == "" {
|
|
a.id = uuid.Must(uuid.NewV4()).String()
|
|
}
|
|
m[a.id] = a
|
|
}
|
|
|
|
// Remove an Actor from the map. The ID must be set at the very least, so to
|
|
// remove by ID just create an Actor{id: x}
|
|
func (m ActorMap) Remove(a *Actor) bool {
|
|
if _, ok := m[a.id]; ok {
|
|
delete(m, a.id)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Actor is an instance of a Doodad in the level.
|
|
type Actor struct {
|
|
id string // NOTE: read only, use ID() to access.
|
|
Filename string `json:"filename"` // like "exit.doodad"
|
|
Point render.Point `json:"point"`
|
|
}
|
|
|
|
// ID returns the actor's ID.
|
|
func (a *Actor) ID() string {
|
|
return a.id
|
|
}
|