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() }