tvxwidgets/sparkline.go

112 lines
2.4 KiB
Go
Raw Normal View History

package tvxwidgets
import (
"sync"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
// Spartline represents a sparkline widgets.
type Sparkline struct {
*tview.Box
data []float64
dataTitle string
dataTitlecolor tcell.Color
lineColor tcell.Color
mu sync.Mutex
}
// NewSparkline returns a new sparkline widget.
func NewSparkline() *Sparkline {
return &Sparkline{
Box: tview.NewBox(),
}
}
// Draw draws this primitive onto the screen.
func (sl *Sparkline) Draw(screen tcell.Screen) {
sl.Box.DrawForSubclass(screen, sl)
x, y, width, height := sl.Box.GetInnerRect()
barHeight := height
// print label
if sl.dataTitle != "" {
tview.Print(screen, sl.dataTitle, x, y, width, tview.AlignLeft, sl.dataTitlecolor)
barHeight--
}
maxVal := getMaxFloat64FromSlice(sl.data)
if maxVal == 0 {
return
}
// print lines
for i := 0; i < len(sl.data) && i+x < x+width; i++ {
data := sl.data[i]
dHeight := int((data / maxVal) * float64(barHeight))
sparkChar := barsRune[len(barsRune)-1]
style := tcell.StyleDefault.Background(sl.GetBackgroundColor()).Foreground(sl.lineColor)
for j := 0; j < dHeight; j++ {
tview.PrintJoinedSemigraphics(screen, i+x, y-1+height-j, sparkChar, style)
}
if dHeight == 0 {
sparkChar = barsRune[1]
tview.PrintJoinedSemigraphics(screen, i+x, y-1+height, sparkChar, style)
}
}
}
// SetRect sets rect for this primitive.
func (sl *Sparkline) SetRect(x, y, width, height int) {
sl.Box.SetRect(x, y, width, height)
}
// GetRect return primitive current rect.
func (sl *Sparkline) GetRect() (int, int, int, int) {
return sl.Box.GetRect()
}
// HasFocus returns whether or not this primitive has focus.
func (sl *Sparkline) HasFocus() bool {
return sl.Box.HasFocus()
}
// SetData sets sparkline data.
func (sl *Sparkline) SetData(data []float64) {
sl.mu.Lock()
defer sl.mu.Unlock()
sl.data = data
}
// SetDataTitle sets sparkline data title.
func (sl *Sparkline) SetDataTitle(title string) {
sl.mu.Lock()
defer sl.mu.Unlock()
sl.dataTitle = title
}
// SetDataTitleColor sets sparkline data title color.
func (sl *Sparkline) SetDataTitleColor(color tcell.Color) {
sl.mu.Lock()
defer sl.mu.Unlock()
sl.dataTitlecolor = color
}
// SetLineColor sets sparkline line color.
func (sl *Sparkline) SetLineColor(color tcell.Color) {
sl.mu.Lock()
defer sl.mu.Unlock()
sl.lineColor = color
}