Files
LilGuy/internal/status/status.go

80 lines
1.3 KiB
Go

package status
import (
"fmt"
"image/color"
)
// HUD resource entry.
type Meter struct {
Label string
Base float64
Level float64
Color color.NRGBA
}
// Meter template values.
type Config struct {
Label string
Base float64
Color color.NRGBA
}
// Collection of meters.
type Manager struct {
meters []Meter
}
// Builds meters from configs.
func NewManager(cfgs []Config) *Manager {
meters := make([]Meter, len(cfgs))
for i, cfg := range cfgs {
meters[i] = Meter{
Label: safeLabel(cfg.Label, i),
Base: clamp(cfg.Base, 0, 100),
Level: clamp(cfg.Base, 0, 100),
Color: nonTransparent(cfg.Color),
}
}
return &Manager{meters: meters}
}
// Resets levels to base.
func (m *Manager) Update() {
for i := range m.meters {
m.meters[i].Level = m.meters[i].Base
}
}
// Meters exposes a copy of the internal slice to prevent mutation.
func (m *Manager) Meters() []Meter {
out := make([]Meter, len(m.meters))
copy(out, m.meters)
return out
}
func clamp(value, min, max float64) float64 {
if value < min {
return min
}
if value > max {
return max
}
return value
}
func safeLabel(label string, fallback int) string {
if label == "" {
return fmt.Sprintf("Meter %d", fallback+1)
}
return label
}
func nonTransparent(c color.NRGBA) color.NRGBA {
if c.A == 0 {
c.A = 255
}
return c
}