doodle/pkg/cursor/cursor.go

92 lines
1.8 KiB
Go

// Package cursor handles custom mouse cursor sprite images.
package cursor
import (
"git.kirsle.net/SketchyMaze/doodle/pkg/balance"
"git.kirsle.net/SketchyMaze/doodle/pkg/log"
"git.kirsle.net/SketchyMaze/doodle/pkg/native"
"git.kirsle.net/SketchyMaze/doodle/pkg/shmem"
"git.kirsle.net/SketchyMaze/doodle/pkg/sprites"
"git.kirsle.net/go/render"
"git.kirsle.net/go/ui"
)
type Cursor struct {
Filename string
Sprite *ui.Image
Offset render.Point
}
// Current selected cursor to draw on screen.
var Current *Cursor
// NoCursor hides the cursor entirely.
var NoCursor = &Cursor{}
// Draw the cursor on screen. NOTE: Does not draw on touchscreen devices.
func Draw(e render.Engine) {
if native.IsTouchScreenMode {
return
}
if Current == nil {
Current = NewPointer(e)
}
if Current.Sprite != nil {
Current.Sprite.Present(e, shmem.Cursor)
}
}
// NewPointer initializes the default pointer cursor.
func NewPointer(e render.Engine) *Cursor {
if pointer != nil {
return pointer
}
img, err := sprites.LoadImage(e, balance.CursorIcon)
if err != nil {
log.Error("NewPointer: %s", err)
}
return &Cursor{
Filename: balance.CursorIcon,
Sprite: img,
}
}
// NewPencil initializes the pencil cursor.
func NewPencil(e render.Engine) *Cursor {
if pencil != nil {
return pencil
}
img, err := sprites.LoadImage(e, balance.PencilIcon)
if err != nil {
log.Error("NewPencil: %s", err)
}
return &Cursor{
Filename: balance.PencilIcon,
Sprite: img,
}
}
// NewFlood initializes the Flood cursor.
func NewFlood(e render.Engine) *Cursor {
if pencil != nil {
return pencil
}
img, err := sprites.LoadImage(e, balance.FloodCursor)
if err != nil {
log.Error("NewFlood: %s", err)
}
return &Cursor{
Filename: balance.FloodCursor,
Sprite: img,
}
}
// Cached singletons of the cursors.
var (
pointer *Cursor
pencil *Cursor
flood *Cursor
)