evcc-io/ui/colors.go
2026-05-24 11:13:05 +02:00

46 lines
1.1 KiB
Go

// Package ui persists UI-only state (color overrides, etc.).
package ui
import (
"maps"
"slices"
"strings"
"sync"
"github.com/evcc-io/evcc/core/keys"
"github.com/evcc-io/evcc/server/db/settings"
)
// DeviceColor is the MQTT-safe publish format (map keys would leak into topic segments).
type DeviceColor struct {
Title string `json:"title"`
Color string `json:"color"`
}
var colorsMu sync.RWMutex
func GetDeviceColors() map[string]string {
colorsMu.RLock()
defer colorsMu.RUnlock()
m := map[string]string{}
_ = settings.Json(keys.DeviceColors, &m)
return m
}
func SaveDeviceColors(m map[string]string) error {
colorsMu.Lock()
defer colorsMu.Unlock()
clean := make(map[string]string, len(m))
maps.Copy(clean, m)
return settings.SetJson(keys.DeviceColors, clean)
}
func DeviceColorList() []DeviceColor {
m := GetDeviceColors()
list := make([]DeviceColor, 0, len(m))
for title, color := range m {
list = append(list, DeviceColor{Title: title, Color: color})
}
slices.SortFunc(list, func(a, b DeviceColor) int { return strings.Compare(a.Title, b.Title) })
return list
}