Small CLI monitoring tool to decode proprietary [...] protocol and display info in human readable representation
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ycli-mon/ui/table.go

98 lines
2.1 KiB

package ui
import (
"cli-mon/yabl"
"fmt"
"github.com/gdamore/tcell/v2"
tview "github.com/rivo/tview"
"reflect"
)
type table struct {
tview.Table
views map[key]*tview.TableCell
content []key
}
type key struct {
action yabl.AName
field yabl.FName
id uint
}
func (t *table) update(event *yabl.Event) {
if cell, ok := t.views[key{*event.ActionName, *event.Field, event.GetUnitId()}]; ok {
cell.SetText(fmt.Sprintf("%v", event.Value))
}
}
func (t *table) header(header string) *table {
t.SetTitle(header)
return t
}
func (t *table) columns(name string, cols int) *table {
for i := 1; i <= cols; i++ {
t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("%s %d", name, i)).SetExpansion(2)).SetBackgroundColor(tcell.ColorDefault)
}
return t
}
func (t *table) rows(name string, rows int) *table {
for i := 1; i <= rows; i++ {
t.SetCell(i, 0, tview.NewTableCell(fmt.Sprintf("%s %d", name, i))).SetBackgroundColor(tcell.ColorDefault) //.SetExpansion(2))
}
return t
}
func newTable(params []key, min, max int, invert bool, short bool) *table {
t := &table{}
t.Box = tview.NewBox()
//t.SetBorderColor(tview.Styles.GraphicsColor)
t.SetSeparator(' ')
t.SetContent(nil)
t.SetBorders(true)
t.SetBorder(true)
t.views = make(map[key]*tview.TableCell)
for _, param := range params {
for i := min; i <= max; i++ {
k := param
k.id = uint(i)
cell := tview.NewTableCell("").SetBackgroundColor(tcell.ColorDefault)
t.views[k] = cell
var col = i
if min == 0 {
col++
}
if !invert {
t.SetCell(int(param.id), col, cell)
} else {
t.SetCell(col, int(param.id), cell)
}
}
var desc string
if short {
desc = fmt.Sprintf("%s", param.field)
} else {
desc = fmt.Sprintf("%s.%s", param.action, param.field)
}
cell := tview.NewTableCell(desc).SetBackgroundColor(tcell.ColorDefault)
if !invert {
t.SetCell(int(param.id), 0, cell)
} else {
t.SetCell(0, int(param.id), cell)
}
}
return t
}
func getField(v yabl.Action, field yabl.FName) interface{} {
r := reflect.ValueOf(v)
f := reflect.Indirect(r).FieldByName(string(field))
return f.Interface()
}