termdash/widgets/barchart/options.go

165 lines
4.9 KiB
Go

// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package barchart
// options.go contains configurable options for BarChart.
import (
"fmt"
"github.com/mum4k/termdash/cell"
"github.com/mum4k/termdash/private/draw"
)
// Option is used to provide options.
type Option interface {
// set sets the provided option.
set(*options)
}
// option implements Option.
type option func(*options)
// set implements Option.set.
func (o option) set(opts *options) {
o(opts)
}
// options holds the provided options.
type options struct {
barChar rune
barWidth int
barGap int
showValues bool
barColors []cell.Color
labelColors []cell.Color
valueColors []cell.Color
labels []string
}
// validate validates the provided options.
func (o *options) validate() error {
if got, min := o.barWidth, 0; got < min {
return fmt.Errorf("invalid BarWidth %d, must be %d <= BarWidth", got, min)
}
if got, min := o.barGap, 0; got < min {
return fmt.Errorf("invalid BarGap %d, must be %d <= BarGap", got, min)
}
return nil
}
// newOptions returns options with the default values set.
func newOptions() *options {
return &options{
barChar: DefaultChar,
barGap: DefaultBarGap,
}
}
// DefaultChar is the default value for the Char option.
const DefaultChar = draw.DefaultRectChar
// Char sets the rune that is used when drawing the rectangle representing the
// bars.
func Char(ch rune) Option {
return option(func(opts *options) {
opts.barChar = ch
})
}
// BarWidth sets the width of the bars. If not set, or set to zero, the bars
// use all the space available to the widget. Must be a positive or zero
// integer.
func BarWidth(width int) Option {
return option(func(opts *options) {
opts.barWidth = width
})
}
// DefaultBarGap is the default value for the BarGap option.
const DefaultBarGap = 1
// BarGap sets the width of the space between the bars.
// Must be a positive or zero integer.
// Defaults to DefaultBarGap.
func BarGap(width int) Option {
return option(func(opts *options) {
opts.barGap = width
})
}
// ShowValues tells the bar chart to display the actual values inside each of the bars.
func ShowValues() Option {
return option(func(opts *options) {
opts.showValues = true
})
}
// DefaultBarColor is the default color of a bar, unless specified otherwise
// via the BarColors option.
const DefaultBarColor = cell.ColorRed
// BarColors sets the colors of each of the bars.
// Bars are created on a call to Values(), each value ends up in its own Bar.
// The first supplied color applies to the bar displaying the first value.
// Any bars that don't have a color specified use the DefaultBarColor.
func BarColors(colors []cell.Color) Option {
return option(func(opts *options) {
opts.barColors = colors
})
}
// DefaultLabelColor is the default color of a bar label, unless specified
// otherwise via the LabelColors option.
const DefaultLabelColor = cell.ColorGreen
// LabelColors sets the colors of each of the labels under the bars.
// Bars are created on a call to Values(), each value ends up in its own Bar.
// The first supplied color applies to the label of the bar displaying the
// first value. Any labels that don't have a color specified use the
// DefaultLabelColor.
func LabelColors(colors []cell.Color) Option {
return option(func(opts *options) {
opts.labelColors = colors
})
}
// Labels sets the labels displayed under each bar,
// Bars are created on a call to Values(), each value ends up in its own Bar.
// The first supplied label applies to the bar displaying the first value.
// If not specified, the corresponding bar (or all the bars) don't have a
// label.
func Labels(labels []string) Option {
return option(func(opts *options) {
// Copy to avoid external modifications. See #174.
opts.labels = make([]string, len(labels))
copy(opts.labels, labels)
})
}
// DefaultValueColor is the default color of a bar value, unless specified
// otherwise via the ValueColors option.
const DefaultValueColor = cell.ColorYellow
// ValueColors sets the colors of each of the values in the bars. Bars are
// created on a call to Values(), each value ends up in its own Bar. The first
// supplied color applies to the bar displaying the first value. Any values
// that don't have a color specified use the DefaultValueColor.
func ValueColors(colors []cell.Color) Option {
return option(func(opts *options) {
opts.valueColors = colors
})
}