Skip to content

Commit

Permalink
Merge pull request #6 from navidys/sparkline
Browse files Browse the repository at this point in the history
new widget - sparkline
  • Loading branch information
navidys authored Dec 17, 2022
2 parents c359269 + 2fead11 commit 48560bc
Show file tree
Hide file tree
Showing 8 changed files with 363 additions and 46 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![PkgGoDev](https://pkg.go.dev/badge/github.com/navidys/tvxwidgets)](https://pkg.go.dev/github.com/navidys/tvxwidgets)
[![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/navidys/tvxwidgets)

tvxwidgets provides extra widgets for [tview](https://github.com/rivo/tview).
tvxwidgets provides extra widgets for [tview](https://github.com/rivo/tview).

![Screenshot](demo.gif)

Expand All @@ -17,6 +17,7 @@ tvxwidgets provides extra widgets for [tview](https://github.com/rivo/tview).
* [message dialog (info and error)](./demos/dialog/)
* [spinner](./demos/spinner/)
* [plot (linechart, scatter)](./demos/plot/)
* [sparkline](./demos/sparkline/)


## Example
Expand Down
Binary file modified demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
168 changes: 129 additions & 39 deletions demos/demo/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,14 @@ func main() {
}

spinnerRow := tview.NewFlex().SetDirection(tview.FlexColumn)
spinnerRow.SetBorder(true).SetTitle("Spinners")
spinnerRow.SetBorder(true).SetTitle("spinners")

for _, spinner := range spinners {
spinnerRow.AddItem(spinner, 0, 1, false)
}

// bar graph
barGraph := tvxwidgets.NewBarChart()
barGraph.SetBorder(true)
barGraph.SetTitle("bar chart")
barGraph.AddBar("eth0", 20, tcell.ColorBlue)
barGraph.AddBar("eth1", 60, tcell.ColorRed)
barGraph.AddBar("eth2", 80, tcell.ColorGreen)
barGraph.AddBar("eth3", 100, tcell.ColorOrange)
barGraph := newBarChart()
barGraph.SetMaxValue(100)

// activity mode gauge
Expand Down Expand Up @@ -91,6 +85,7 @@ func main() {
utilFlex.SetTitle("utilisation mode gauge")
utilFlex.SetBorder(true)

// plot (line charts)
sinData := func() [][]float64 {
n := 220
data := make([][]float64, 2)
Expand All @@ -103,26 +98,10 @@ func main() {
return data
}()

bmLineChart := tvxwidgets.NewPlot()
bmLineChart.SetBorder(true)
bmLineChart.SetTitle("line chart (braille mode)")
bmLineChart.SetLineColor([]tcell.Color{
tcell.ColorSteelBlue,
tcell.ColorGreen,
})
bmLineChart.SetMarker(tvxwidgets.PlotMarkerBraille)
bmLineChart := newBrailleModeLineChart()
bmLineChart.SetData(sinData)

dmLineChart := tvxwidgets.NewPlot()
dmLineChart.SetBorder(true)
dmLineChart.SetTitle("line chart (dot mode)")
dmLineChart.SetLineColor([]tcell.Color{
tcell.ColorDarkOrange,
})
dmLineChart.SetAxesLabelColor(tcell.ColorGold)
dmLineChart.SetAxesColor(tcell.ColorGold)
dmLineChart.SetMarker(tvxwidgets.PlotMarkerDot)
dmLineChart.SetDotMarkerRune('\u25c9')
dmLineChart := newDotModeLineChart()

sampleData1 := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sampleData2 := []float64{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
Expand All @@ -135,26 +114,93 @@ func main() {

dmLineChart.SetData(dotChartData)

firstCol := tview.NewFlex().SetDirection(tview.FlexRow)
firstCol.AddItem(barGraph, 11, 0, false)
firstCol.AddItem(bmLineChart, 15, 0, false)
firstCol.AddItem(spinnerRow, 3, 0, false)
// sparkline
iowaitSparkline := tvxwidgets.NewSparkline()
iowaitSparkline.SetBorder(false)
iowaitSparkline.SetDataTitle("Disk IO (iowait)")
iowaitSparkline.SetDataTitleColor(tcell.ColorDarkOrange)
iowaitSparkline.SetLineColor(tcell.ColorMediumPurple)

systemSparkline := tvxwidgets.NewSparkline()
systemSparkline.SetBorder(false)
systemSparkline.SetDataTitle("Disk IO (system)")
systemSparkline.SetDataTitleColor(tcell.ColorDarkOrange)
systemSparkline.SetLineColor(tcell.ColorSteelBlue)

iowaitData := []float64{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1, 7, 10, 10, 14, 13, 6}
systemData := []float64{0, 0, 1, 2, 9, 5, 3, 1, 2, 0, 6, 3, 2, 2, 6, 8, 5, 2, 1, 5, 8, 6, 1, 4, 1, 1, 4, 3, 6}

ioSparkLineData := func() []float64 {
for i := 0; i < 5; i++ {
iowaitData = append(iowaitData, iowaitData...)
}

return iowaitData
}()

systemSparklineData := func() []float64 {
for i := 0; i < 5; i++ {
systemData = append(systemData, systemData...)
}

return systemData
}()

iowaitSparkline.SetData(ioSparkLineData)
systemSparkline.SetData(systemSparklineData)

sparklineGroupLayout := tview.NewFlex().SetDirection(tview.FlexColumn)
sparklineGroupLayout.SetBorder(true)
sparklineGroupLayout.SetTitle("sparkline")
sparklineGroupLayout.AddItem(iowaitSparkline, 0, 1, false)
sparklineGroupLayout.AddItem(tview.NewBox(), 1, 0, false)
sparklineGroupLayout.AddItem(systemSparkline, 0, 1, false)

// first row layout
firstRowfirstCol := tview.NewFlex().SetDirection(tview.FlexRow)
firstRowfirstCol.AddItem(barGraph, 0, 1, false)

secondCol := tview.NewFlex().SetDirection(tview.FlexRow)
secondCol.AddItem(amGauge, 3, 0, false)
secondCol.AddItem(pmGauge, 3, 0, false)
secondCol.AddItem(utilFlex, 5, 0, false)
secondCol.AddItem(dmLineChart, 15, 0, false)
firstRowSecondCol := tview.NewFlex().SetDirection(tview.FlexRow)
firstRowSecondCol.AddItem(amGauge, 0, 3, false)
firstRowSecondCol.AddItem(pmGauge, 0, 3, false)
firstRowSecondCol.AddItem(utilFlex, 0, 5, false)

screenLayout := tview.NewFlex().SetDirection(tview.FlexColumn)
screenLayout.AddItem(firstCol, 50, 0, false)
screenLayout.AddItem(secondCol, 50, 0, false)
firstRow := tview.NewFlex().SetDirection(tview.FlexColumn)
firstRow.AddItem(firstRowfirstCol, 0, 1, false)
firstRow.AddItem(firstRowSecondCol, 0, 1, false)

// second row
plotRowLayout := tview.NewFlex().SetDirection(tview.FlexColumn)
plotRowLayout.AddItem(bmLineChart, 0, 1, false)
plotRowLayout.AddItem(dmLineChart, 0, 1, false)

screenLayout := tview.NewFlex().SetDirection(tview.FlexRow)
screenLayout.AddItem(firstRow, 11, 0, false)
screenLayout.AddItem(plotRowLayout, 15, 0, false)
screenLayout.AddItem(sparklineGroupLayout, 6, 0, false)
screenLayout.AddItem(spinnerRow, 3, 0, false)

screenLayout.SetRect(0, 0, 100, 40)

// upgrade datat functions
moveDotChartData := func() {
newData := append(dotChartData[0], dotChartData[0][0])
dotChartData[0] = newData[1:]
}

moveDiskIOData := func() ([]float64, []float64) {

newIOWaitData := ioSparkLineData[1:]
newIOWaitData = append(newIOWaitData, ioSparkLineData[0])
ioSparkLineData = newIOWaitData

newSystemData := systemSparklineData[1:]
newSystemData = append(newSystemData, systemSparklineData[0])
systemSparklineData = newSystemData

return newIOWaitData, newSystemData
}

moveSinData := func(data [][]float64) [][]float64 {
n := 220
newData := make([][]float64, 2)
Expand Down Expand Up @@ -184,12 +230,12 @@ func main() {
}
// update gauge
amGauge.Pulse()

app.Draw()
}
}
}

// update screen ticker
update := func() {
value := 0
maxValue := pmGauge.GetMaxValue()
Expand Down Expand Up @@ -228,6 +274,10 @@ func main() {
moveDotChartData()
dmLineChart.SetData(dotChartData)

d1, d2 := moveDiskIOData()
iowaitSparkline.SetData(d1)
systemSparkline.SetData(d2)

app.Draw()
}
}
Expand All @@ -240,3 +290,43 @@ func main() {
panic(err)
}
}

func newDotModeLineChart() *tvxwidgets.Plot {
dmLineChart := tvxwidgets.NewPlot()
dmLineChart.SetBorder(true)
dmLineChart.SetTitle("line chart (dot mode)")
dmLineChart.SetLineColor([]tcell.Color{
tcell.ColorDarkOrange,
})
dmLineChart.SetAxesLabelColor(tcell.ColorGold)
dmLineChart.SetAxesColor(tcell.ColorGold)
dmLineChart.SetMarker(tvxwidgets.PlotMarkerDot)
dmLineChart.SetDotMarkerRune('\u25c9')

return dmLineChart
}

func newBrailleModeLineChart() *tvxwidgets.Plot {
bmLineChart := tvxwidgets.NewPlot()
bmLineChart.SetBorder(true)
bmLineChart.SetTitle("line chart (braille mode)")
bmLineChart.SetLineColor([]tcell.Color{
tcell.ColorSteelBlue,
tcell.ColorGreen,
})
bmLineChart.SetMarker(tvxwidgets.PlotMarkerBraille)

return bmLineChart
}

func newBarChart() *tvxwidgets.BarChart {
barGraph := tvxwidgets.NewBarChart()
barGraph.SetBorder(true)
barGraph.SetTitle("bar chart")
barGraph.AddBar("eth0", 20, tcell.ColorBlue)
barGraph.AddBar("eth1", 60, tcell.ColorRed)
barGraph.AddBar("eth2", 80, tcell.ColorGreen)
barGraph.AddBar("eth3", 100, tcell.ColorOrange)

return barGraph
}
93 changes: 93 additions & 0 deletions demos/sparkline/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package main

import (
"time"

"github.com/gdamore/tcell/v2"
"github.com/navidys/tvxwidgets"
"github.com/rivo/tview"
)

func main() {
app := tview.NewApplication()
iowaitSparkline := tvxwidgets.NewSparkline()
iowaitSparkline.SetBorder(false)
iowaitSparkline.SetDataTitle("Disk I/O (iowait)")
iowaitSparkline.SetBorderColor(tcell.ColorDimGray)
iowaitSparkline.SetTitleColor(tcell.ColorDimGray)
iowaitSparkline.SetDataTitleColor(tcell.ColorDarkOrange)
iowaitSparkline.SetLineColor(tcell.ColorMediumPurple)

systemSparkline := tvxwidgets.NewSparkline()
systemSparkline.SetBorder(false)
systemSparkline.SetDataTitle("Disk I/O (system)")
systemSparkline.SetBorderColor(tcell.ColorDimGray)
systemSparkline.SetTitleColor(tcell.ColorDimGray)
systemSparkline.SetDataTitleColor(tcell.ColorDarkOrange)
systemSparkline.SetLineColor(tcell.ColorSteelBlue)

iowaitData := []float64{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1, 7, 10, 10, 14, 13, 6}
systemData := []float64{0, 0, 1, 2, 9, 5, 3, 1, 2, 0, 6, 3, 2, 2, 6, 8, 5, 2, 1, 5, 8, 6, 1, 4, 1, 1, 4, 3, 6}

ioSparkLineData := func() []float64 {
for i := 0; i < 5; i++ {
iowaitData = append(iowaitData, iowaitData...)
}

return iowaitData
}()

systemSparklineData := func() []float64 {
for i := 0; i < 5; i++ {
systemData = append(systemData, systemData...)
}

return systemData
}()

iowaitSparkline.SetData(ioSparkLineData)
systemSparkline.SetData(systemSparklineData)

sparklineGroupLayout := tview.NewFlex().SetDirection(tview.FlexRow)
sparklineGroupLayout.SetBorder(true)
sparklineGroupLayout.SetBorderColor(tcell.ColorDimGray)
sparklineGroupLayout.SetTitle("DISK IO")
sparklineGroupLayout.SetTitleColor(tcell.ColorDarkOrange)
sparklineGroupLayout.AddItem(iowaitSparkline, 0, 1, false)
sparklineGroupLayout.AddItem(tview.NewBox(), 1, 0, false)
sparklineGroupLayout.AddItem(systemSparkline, 0, 1, false)

moveData := func() ([]float64, []float64) {

newIOWaitData := ioSparkLineData[1:]
newIOWaitData = append(newIOWaitData, ioSparkLineData[0])
ioSparkLineData = newIOWaitData

newSystemData := systemSparklineData[1:]
newSystemData = append(newSystemData, systemSparklineData[0])
systemSparklineData = newSystemData

return newIOWaitData, newSystemData
}

update := func() {
tick := time.NewTicker(500 * time.Millisecond)

for {
select {
case <-tick.C:
d1, d2 := moveData()
iowaitSparkline.SetData(d1)
systemSparkline.SetData(d2)

app.Draw()
}
}
}

go update()

if err := app.SetRoot(sparklineGroupLayout, true).EnableMouse(true).Run(); err != nil {
panic(err)
}
}
1 change: 1 addition & 0 deletions demos/sparkline/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
![Screenshot](screenshot.png)
Binary file added demos/sparkline/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 48560bc

Please sign in to comment.