summaryrefslogtreecommitdiffstats
path: root/termui/linegraph.go
diff options
context:
space:
mode:
Diffstat (limited to 'termui/linegraph.go')
-rw-r--r--termui/linegraph.go86
1 files changed, 76 insertions, 10 deletions
diff --git a/termui/linegraph.go b/termui/linegraph.go
index fa8a3ae..941183f 100644
--- a/termui/linegraph.go
+++ b/termui/linegraph.go
@@ -3,6 +3,8 @@ package termui
import (
"image"
"sort"
+ "strconv"
+ "unicode"
. "github.com/gizak/termui/v3"
drawille "github.com/xxxserxxx/gotop/v4/termui/drawille-go"
@@ -27,6 +29,8 @@ type LineGraph struct {
LineColors map[string]Color
LabelStyles map[string]Modifier
DefaultLineColor Color
+
+ seriesList numbered
}
func NewLineGraph() *LineGraph {
@@ -54,18 +58,20 @@ func (self *LineGraph) Draw(buf *Buffer) {
colors[i] = make([]Color, self.Inner.Dy()+2)
}
- // sort the series so that overlapping data will overlap the same way each time
- seriesList := make([]string, len(self.Data))
- i := 0
- for seriesName := range self.Data {
- seriesList[i] = seriesName
- i++
+ if len(self.seriesList) != len(self.Data) {
+ // sort the series so that overlapping data will overlap the same way each time
+ self.seriesList = make(numbered, len(self.Data))
+ i := 0
+ for seriesName := range self.Data {
+ self.seriesList[i] = seriesName
+ i++
+ }
+ sort.Sort(self.seriesList)
}
- sort.Strings(seriesList)
// draw lines in reverse order so that the first color defined in the colorscheme is on top
- for i := len(seriesList) - 1; i >= 0; i-- {
- seriesName := seriesList[i]
+ for i := len(self.seriesList) - 1; i >= 0; i-- {
+ seriesName := self.seriesList[i]
seriesData := self.Data[seriesName]
seriesLineColor, ok := self.LineColors[seriesName]
if !ok {
@@ -128,7 +134,7 @@ func (self *LineGraph) Draw(buf *Buffer) {
maxWid := 0
xoff := 0 // X offset for additional columns of text
yoff := 0 // Y offset for resetting column to top of widget
- for i, seriesName := range seriesList {
+ for i, seriesName := range self.seriesList {
if yoff+i+2 > self.Inner.Dy() {
xoff += maxWid + 2
yoff = -i
@@ -159,3 +165,63 @@ func (self *LineGraph) Draw(buf *Buffer) {
}
}
+
+// A string containing an integer
+type numbered []string
+
+func (n numbered) Len() int { return len(n) }
+func (n numbered) Swap(i, j int) { n[i], n[j] = n[j], n[i] }
+func (n numbered) Less(i, j int) bool {
+ a := n[i]
+ b := n[j]
+ for i := 0; i < len(a); i++ {
+ ac := a[i]
+ if unicode.IsDigit(rune(ac)) {
+ j := i + 1
+ for ; j < len(a); j++ {
+ if !unicode.IsDigit(rune(a[j])) {
+ break
+ }
+ if j >= len(b) {
+ return false
+ }
+ if !unicode.IsDigit(rune(b[j])) {
+ return false
+ }
+ }
+ an, err := strconv.Atoi(a[i:j])
+ if err != nil {
+ return true
+ }
+ if j > len(b) {
+ return false
+ }
+ for ; j < len(b); j++ {
+ if !unicode.IsDigit(rune(b[j])) {
+ break
+ }
+ }
+ bn, err := strconv.Atoi(b[i:j])
+ if err != nil {
+ return true
+ }
+ if an < bn {
+ return true
+ } else if bn < an {
+ return false
+ }
+ i = j
+ }
+ if i >= len(a) {
+ return true
+ } else if i >= len(b) {
+ return false
+ }
+ if ac < b[i] {
+ return true
+ } else if b[i] < ac {
+ return false
+ }
+ }
+ return true
+}