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 }