80 lines
1.3 KiB
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
|
|
}
|