go-charts/theme.go
2022-02-28 20:42:25 +08:00

234 lines
4.6 KiB
Go

// MIT License
// Copyright (c) 2022 Tree Xie
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
package charts
import (
"github.com/wcharczuk/go-chart/v2/drawing"
)
const ThemeDark = "dark"
const ThemeLight = "light"
const ThemeGrafana = "grafana"
const ThemeAnt = "ant"
type Theme struct {
palette *themeColorPalette
}
type themeColorPalette struct {
isDarkMode bool
axisStrokeColor drawing.Color
axisSplitLineColor drawing.Color
backgroundColor drawing.Color
textColor drawing.Color
seriesColors []drawing.Color
}
var palettes = map[string]*themeColorPalette{}
func init() {
echartSeriesColors := []drawing.Color{
parseColor("#5470c6"),
parseColor("#91cc75"),
parseColor("#fac858"),
parseColor("#ee6666"),
parseColor("#73c0de"),
parseColor("#3ba272"),
parseColor("#fc8452"),
parseColor("#9a60b4"),
parseColor("#ea7ccc"),
}
grafanaSeriesColors := []drawing.Color{
parseColor("#7EB26D"),
parseColor("#EAB839"),
parseColor("#6ED0E0"),
parseColor("#EF843C"),
parseColor("#E24D42"),
parseColor("#1F78C1"),
parseColor("#705DA0"),
parseColor("#508642"),
}
antSeriesColors := []drawing.Color{
parseColor("#5b8ff9"),
parseColor("#5ad8a6"),
parseColor("#5d7092"),
parseColor("#f6bd16"),
parseColor("#6f5ef9"),
parseColor("#6dc8ec"),
parseColor("#945fb9"),
parseColor("#ff9845"),
}
AddTheme(
ThemeDark,
true,
drawing.Color{
R: 185,
G: 184,
B: 206,
A: 255,
},
drawing.Color{
R: 72,
G: 71,
B: 83,
A: 255,
},
drawing.Color{
R: 16,
G: 12,
B: 42,
A: 255,
},
drawing.Color{
R: 238,
G: 238,
B: 238,
A: 255,
},
echartSeriesColors,
)
AddTheme(
ThemeLight,
false,
drawing.Color{
R: 110,
G: 112,
B: 121,
A: 255,
},
drawing.Color{
R: 224,
G: 230,
B: 242,
A: 255,
},
drawing.ColorWhite,
drawing.Color{
R: 70,
G: 70,
B: 70,
A: 255,
},
echartSeriesColors,
)
AddTheme(
ThemeAnt,
false,
drawing.Color{
R: 110,
G: 112,
B: 121,
A: 255,
},
drawing.Color{
R: 224,
G: 230,
B: 242,
A: 255,
},
drawing.ColorWhite,
drawing.Color{
R: 70,
G: 70,
B: 70,
A: 255,
},
antSeriesColors,
)
AddTheme(
ThemeGrafana,
true,
drawing.Color{
R: 185,
G: 184,
B: 206,
A: 255,
},
drawing.Color{
R: 68,
G: 67,
B: 67,
A: 255,
},
drawing.Color{
R: 31,
G: 29,
B: 29,
A: 255,
},
drawing.Color{
R: 216,
G: 217,
B: 218,
A: 255,
},
grafanaSeriesColors,
)
}
func AddTheme(name string, isDarkMode bool, axisStrokeColor, axisSplitLineColor, backgroundColor, textColor drawing.Color, seriesColors []drawing.Color) {
palettes[name] = &themeColorPalette{
isDarkMode: isDarkMode,
axisStrokeColor: axisStrokeColor,
axisSplitLineColor: axisSplitLineColor,
backgroundColor: backgroundColor,
textColor: textColor,
seriesColors: seriesColors,
}
}
func NewTheme(name string) *Theme {
p, ok := palettes[name]
if !ok {
p = palettes[ThemeLight]
}
return &Theme{
palette: p,
}
}
func (t *Theme) IsDark() bool {
return t.palette.isDarkMode
}
func (t *Theme) GetAxisStrokeColor() drawing.Color {
return t.palette.axisStrokeColor
}
func (t *Theme) GetAxisSplitLineColor() drawing.Color {
return t.palette.axisSplitLineColor
}
func (t *Theme) GetSeriesColor(index int) drawing.Color {
colors := t.palette.seriesColors
return colors[index%len(colors)]
}
func (t *Theme) GetBackgroundColor() drawing.Color {
return t.palette.backgroundColor
}
func (t *Theme) GetTextColor() drawing.Color {
return t.palette.textColor
}