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.
139 lines
2.5 KiB
139 lines
2.5 KiB
package ui
|
|
|
|
import (
|
|
"cli-mon/yabl"
|
|
"fmt"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
"reflect"
|
|
)
|
|
|
|
const (
|
|
connectors_page = "Connectors"
|
|
)
|
|
|
|
type page struct {
|
|
left string
|
|
right string
|
|
primitive tview.Primitive
|
|
}
|
|
|
|
type UI interface {
|
|
Consume(event *yabl.Event)
|
|
Start()
|
|
Stop()
|
|
}
|
|
|
|
type gui struct {
|
|
app *tview.Application
|
|
pages *tview.Pages
|
|
connPage *cTable
|
|
page2 tview.Primitive
|
|
}
|
|
|
|
type log struct {
|
|
}
|
|
|
|
func (g *gui) Consume(event *yabl.Event) {
|
|
switch obj := event.Object.(type) {
|
|
case *yabl.PuPresentEnergy:
|
|
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
|
|
case *yabl.PuPeriphery:
|
|
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
|
|
case *yabl.PuDebug:
|
|
g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value)
|
|
case *yabl.PuErrors:
|
|
g.connPage.updatePuErrors(obj)
|
|
}
|
|
g.app.Draw()
|
|
}
|
|
|
|
func NewUI() UI {
|
|
g := &gui{}
|
|
|
|
g.app = tview.NewApplication()
|
|
g.pages = tview.NewPages()
|
|
|
|
var active page
|
|
var layout map[string]page
|
|
|
|
g.connPage = newConnectorsGrid()
|
|
g.page2 = tview.NewBox().SetBorder(true).SetTitle("Bbbbbb")
|
|
|
|
layout = map[string]page{
|
|
connectors_page: {
|
|
left: "Page2",
|
|
right: "Page2",
|
|
primitive: g.connPage,
|
|
},
|
|
"Page2": {
|
|
left: connectors_page,
|
|
right: connectors_page,
|
|
primitive: g.page2,
|
|
},
|
|
}
|
|
|
|
for k, p := range layout {
|
|
g.pages.AddPage(k, p.primitive, true, true)
|
|
}
|
|
|
|
active = layout[connectors_page]
|
|
g.pages.SwitchToPage(connectors_page)
|
|
|
|
g.app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
switch event.Key() {
|
|
case tcell.KeyRight:
|
|
g.pages.SwitchToPage(active.right)
|
|
active = layout[active.right]
|
|
return nil
|
|
case tcell.KeyLeft:
|
|
g.pages.SwitchToPage(active.left)
|
|
active = layout[active.left]
|
|
return nil
|
|
case tcell.KeyCtrlC:
|
|
g.app.Stop()
|
|
}
|
|
return event
|
|
})
|
|
|
|
return g
|
|
}
|
|
|
|
func (g *gui) Start() {
|
|
go func() {
|
|
if err := g.app.SetRoot(g.pages, true).EnableMouse(true).Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func (g *gui) Stop() {
|
|
g.app.Stop()
|
|
}
|
|
|
|
func NewLog() UI {
|
|
return &log{}
|
|
|
|
}
|
|
|
|
func (l log) Consume(event *yabl.Event) {
|
|
fmt.Printf(
|
|
"%v %v.%v [%d] %v\n",
|
|
event.Updated.Format("Jan _2 15:04:05.000"),
|
|
event.ActionName,
|
|
event.Field,
|
|
event.GetUnitId(),
|
|
event.Value)
|
|
}
|
|
|
|
func (l log) Start() {
|
|
}
|
|
|
|
func (l log) Stop() {
|
|
}
|
|
|
|
func getField(v yabl.Action, field yabl.FName) interface{} {
|
|
r := reflect.ValueOf(v)
|
|
f := reflect.Indirect(r).FieldByName(string(field))
|
|
return f.Interface()
|
|
}
|
|
|