diff --git a/painter.go b/painter.go index d762e86..47c494f 100644 --- a/painter.go +++ b/painter.go @@ -38,7 +38,7 @@ type Painter struct { parent *Painter style Style previousStyle Style - theme *Theme + theme ColorPalette } type PainterOptions struct { @@ -92,7 +92,7 @@ func PainterStyleOption(style Style) PainterOption { } // PainterThemeOption sets the theme of draw painter -func PainterThemeOption(theme *Theme) PainterOption { +func PainterThemeOption(theme ColorPalette) PainterOption { return func(p *Painter) { if theme == nil { return @@ -194,6 +194,7 @@ func (p *Painter) SetTextStyle(style Style) { func (p *Painter) RestoreStyle() { p.style = p.previousStyle + p.style.WriteToRenderer(p.render) } // Bytes returns the data of draw canvas @@ -336,13 +337,7 @@ func (p *Painter) SetStrokeColor(color Color) { p.render.SetStrokeColor(color) } -func (p *Painter) LineStroke(points []Point, style LineStyle) { - s := style.Style() - if !s.ShouldDrawStroke() { - return - } - defer p.RestoreStyle() - p.SetDrawingStyle(s.GetStrokeOptions()) +func (p *Painter) LineStroke(points []Point) { for index, point := range points { x := point.X y := point.Y @@ -360,8 +355,9 @@ func (p *Painter) SetBackground(width, height int, color Color) { s := chart.Style{ FillColor: color, } - defer p.RestoreStyle() + // 背景色 p.SetStyle(s) + defer p.RestoreStyle() // 设置背景色不使用box,因此不直接使用Painter r.MoveTo(0, 0) r.LineTo(width, 0) @@ -396,13 +392,8 @@ func (p *Painter) Polygon(center Point, radius float64, sides int) { p.Stroke() } -func (p *Painter) FillArea(points []Point, s Style) { - if !s.ShouldDrawFill() { - return - } - defer p.RestoreStyle() +func (p *Painter) FillArea(points []Point) { var x, y int - p.SetDrawingStyle(s.GetFillOptions()) for index, point := range points { x = point.X y = point.Y diff --git a/painter_test.go b/painter_test.go index 1cc08be..34c0c05 100644 --- a/painter_test.go +++ b/painter_test.go @@ -99,6 +99,10 @@ func TestPainter(t *testing.T) { // line stroke { fn: func(p *Painter) { + p.SetDrawingStyle(Style{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + }) p.LineStroke([]Point{ { X: 1, @@ -108,9 +112,6 @@ func TestPainter(t *testing.T) { X: 3, Y: 4, }, - }, LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, }) }, result: "\\n", @@ -294,6 +295,14 @@ func TestPainter(t *testing.T) { // FillArea { fn: func(p *Painter) { + p.SetDrawingStyle(Style{ + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) p.FillArea([]Point{ { X: 0, @@ -311,13 +320,6 @@ func TestPainter(t *testing.T) { X: 0, Y: 0, }, - }, Style{ - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, }) }, result: "\\n", diff --git a/theme.go b/theme.go index 88c73df..bb05249 100644 --- a/theme.go +++ b/theme.go @@ -22,13 +22,20 @@ 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 ColorPalette interface { + IsDark() bool + GetAxisStrokeColor() Color + GetAxisSplitLineColor() Color + GetSeriesColor(int) Color + GetBackgroundColor() Color + GetTextColor() Color } type themeColorPalette struct { @@ -39,3 +46,190 @@ type themeColorPalette struct { textColor Color seriesColors []Color } + +var palettes = map[string]ColorPalette{} + +func init() { + echartSeriesColors := []Color{ + parseColor("#5470c6"), + parseColor("#91cc75"), + parseColor("#fac858"), + parseColor("#ee6666"), + parseColor("#73c0de"), + parseColor("#3ba272"), + parseColor("#fc8452"), + parseColor("#9a60b4"), + parseColor("#ea7ccc"), + } + grafanaSeriesColors := []Color{ + parseColor("#7EB26D"), + parseColor("#EAB839"), + parseColor("#6ED0E0"), + parseColor("#EF843C"), + parseColor("#E24D42"), + parseColor("#1F78C1"), + parseColor("#705DA0"), + parseColor("#508642"), + } + antSeriesColors := []Color{ + parseColor("#5b8ff9"), + parseColor("#5ad8a6"), + parseColor("#5d7092"), + parseColor("#f6bd16"), + parseColor("#6f5ef9"), + parseColor("#6dc8ec"), + parseColor("#945fb9"), + parseColor("#ff9845"), + } + AddTheme( + ThemeDark, + true, + Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + Color{ + R: 72, + G: 71, + B: 83, + A: 255, + }, + Color{ + R: 16, + G: 12, + B: 42, + A: 255, + }, + Color{ + R: 238, + G: 238, + B: 238, + A: 255, + }, + echartSeriesColors, + ) + + AddTheme( + ThemeLight, + false, + Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + 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, + Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + 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) ColorPalette { + p, ok := palettes[name] + if !ok { + p = palettes[ThemeLight] + } + return p +} + +func (t *themeColorPalette) IsDark() bool { + return t.isDarkMode +} + +func (t *themeColorPalette) GetAxisStrokeColor() Color { + return t.axisStrokeColor +} + +func (t *themeColorPalette) GetAxisSplitLineColor() Color { + return t.axisSplitLineColor +} + +func (t *themeColorPalette) GetSeriesColor(index int) Color { + colors := t.seriesColors + return colors[index%len(colors)] +} + +func (t *themeColorPalette) GetBackgroundColor() Color { + return t.backgroundColor +} + +func (t *themeColorPalette) GetTextColor() Color { + return t.textColor +}