refactor: adjust theme of chart

This commit is contained in:
vicanso 2022-02-01 10:08:59 +08:00
parent 910e2dc422
commit 3a9897f9ad
5 changed files with 79 additions and 44 deletions

View file

@ -59,7 +59,8 @@ type ChartOption struct {
BackgroundColor drawing.Color BackgroundColor drawing.Color
} }
func (o *ChartOption) FillDefault(t *Theme) { func (o *ChartOption) FillDefault(theme string) {
t := NewTheme(theme)
f, _ := chart.GetDefaultFont() f, _ := chart.GetDefaultFont()
if o.BackgroundColor.IsZero() { if o.BackgroundColor.IsZero() {
o.BackgroundColor = t.GetBackgroundColor() o.BackgroundColor = t.GetBackgroundColor()
@ -91,6 +92,9 @@ func (o *ChartOption) FillDefault(t *Theme) {
if o.Legend.Style.FontColor.IsZero() { if o.Legend.Style.FontColor.IsZero() {
o.Legend.Style.FontColor = t.GetTextColor() o.Legend.Style.FontColor = t.GetTextColor()
} }
if o.XAxis.Theme == "" {
o.XAxis.Theme = theme
}
} }
func (o *ChartOption) getWidth() int { func (o *ChartOption) getWidth() int {
@ -139,3 +143,60 @@ func (r Range) Values() []string {
} }
return values return values
} }
type basicRenderResult struct {
xRange *Range
yRange *Range
d *Draw
titleBox chart.Box
}
func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) {
d, err := NewDraw(
DrawOption{
Parent: opt.Parent,
Width: opt.getWidth(),
Height: opt.getHeight(),
},
PaddingOption(opt.Padding),
)
if err != nil {
return nil, err
}
opt.FillDefault(opt.Theme)
if opt.Parent == nil {
d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor)
}
// 标题
titleBox, err := drawTitle(d, &opt.Title)
if err != nil {
return nil, err
}
_, err = NewLegend(d, opt.Legend).Render()
if err != nil {
return nil, err
}
// xAxis
xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis)
if err != nil {
return nil, err
}
// 暂时仅支持单一yaxis
yRange, err := drawYAxis(d, opt, xAxisHeight, chart.Box{
Top: titleBox.Height(),
})
if err != nil {
return nil, err
}
return &basicRenderResult{
xRange: xRange,
yRange: yRange,
d: d,
titleBox: titleBox,
}, nil
}

View file

@ -32,60 +32,25 @@ type LineChartOption struct {
} }
func NewLineChart(opt LineChartOption) (*Draw, error) { func NewLineChart(opt LineChartOption) (*Draw, error) {
d, err := NewDraw( result, err := chartBasicRender(&opt.ChartOption)
DrawOption{
Parent: opt.Parent,
Width: opt.getWidth(),
Height: opt.getHeight(),
},
PaddingOption(opt.Padding),
)
if err != nil { if err != nil {
return nil, err return nil, err
} }
theme := Theme{ d := result.d
mode: opt.Theme, theme := NewTheme(opt.Theme)
}
opt.FillDefault(&theme)
if opt.Parent == nil {
d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor)
}
// 标题
titleBox, err := drawTitle(d, &opt.Title)
if err != nil {
return nil, err
}
_, err = NewLegend(d, opt.Legend).Render()
if err != nil {
return nil, err
}
// xAxis
xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis, &theme)
if err != nil {
return nil, err
}
// 暂时仅支持单一yaxis
yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight, chart.Box{
Top: titleBox.Height(),
})
if err != nil {
return nil, err
}
sd, err := NewDraw(DrawOption{ sd, err := NewDraw(DrawOption{
Parent: d, Parent: d,
}, PaddingOption(chart.Box{ }, PaddingOption(chart.Box{
Top: titleBox.Height(), Top: result.titleBox.Height(),
Left: YAxisWidth, Left: YAxisWidth,
})) }))
if err != nil { if err != nil {
return nil, err return nil, err
} }
yRange := result.yRange
xRange := result.xRange
for i, series := range opt.SeriesList { for i, series := range opt.SeriesList {
points := make([]Point, 0) points := make([]Point, 0)
for j, item := range series.Data { for j, item := range series.Data {

View file

@ -31,6 +31,12 @@ type Theme struct {
mode string mode string
} }
func NewTheme(mode string) *Theme {
return &Theme{
mode: mode,
}
}
func (t *Theme) IsDark() bool { func (t *Theme) IsDark() bool {
return t.mode == ThemeDark return t.mode == ThemeDark
} }

View file

@ -27,11 +27,12 @@ import "github.com/wcharczuk/go-chart/v2"
type XAxisOption struct { type XAxisOption struct {
BoundaryGap *bool BoundaryGap *bool
Data []string Data []string
Theme string
// TODO split number // TODO split number
} }
// drawXAxis draws x axis, and returns the height, range of if. // drawXAxis draws x axis, and returns the height, range of if.
func drawXAxis(p *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) {
dXAxis, err := NewDraw( dXAxis, err := NewDraw(
DrawOption{ DrawOption{
Parent: p, Parent: p,
@ -43,6 +44,7 @@ func drawXAxis(p *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) {
if err != nil { if err != nil {
return 0, nil, err return 0, nil, err
} }
theme := NewTheme(opt.Theme)
data := NewAxisDataListFromStringList(opt.Data) data := NewAxisDataListFromStringList(opt.Data)
style := AxisStyle{ style := AxisStyle{
BoundaryGap: opt.BoundaryGap, BoundaryGap: opt.BoundaryGap,

View file

@ -28,7 +28,8 @@ import (
const YAxisWidth = 40 const YAxisWidth = 40
func drawYAxis(p *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding chart.Box) (*Range, error) { func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (*Range, error) {
theme := NewTheme(opt.Theme)
yRange := opt.getYRange(0) yRange := opt.getYRange(0)
data := NewAxisDataListFromStringList(yRange.Values()) data := NewAxisDataListFromStringList(yRange.Values())
style := AxisStyle{ style := AxisStyle{