First run at basic structure
This commit is contained in:
79
internal/status/status.go
Normal file
79
internal/status/status.go
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user