package ui import ( "cli-mon/yabl" ui "github.com/gizak/termui/v3" "github.com/gizak/termui/v3/widgets" "log" "time" ) const headerHeight int = 4 const contactorsCount = 18 const connectorsCount = 6 func InitCliApp(events <-chan yabl.Packet) { if err := ui.Init(); err != nil { log.Fatalf("failed to initialize termui: %v", err) } defer ui.Close() var connectorsTab *ui.Grid //var contactorsErr *widgets.Paragraph var contactorsStateTab *ui.Grid var header *widgets.Paragraph tabpane := widgets.NewTabPane("Connectors", "Contactors States", "Contactors Errors") tabpane.SetRect(0, 1, 150, 4) tabpane.Border = true header = newHeader() connectorsTab = newConnectorsView() contactorsStateTab = newContactorsView() contactorsErr = newContactorsErrView() renderTab := func() { switch tabpane.ActiveTabIndex { case 0: termWidth, termHeight := ui.TerminalDimensions() connectorsTab.SetRect(0, headerHeight, termWidth, termHeight) ui.Render(connectorsTab) case 1: termWidth, termHeight := ui.TerminalDimensions() contactorsStateTab.SetRect(0, headerHeight, termWidth, termHeight) ui.Render(contactorsStateTab) case 2: ui.Render(contactorsErr) } } ui.Render(header, tabpane, connectorsTab) uiEvents := ui.PollEvents() ticker := time.NewTicker(2 * time.Second).C for { select { case e := <-uiEvents: switch e.ID { // event string/identifier case "q", "": // press 'q' or 'C-c' to quit return case "": //payload := e.Payload.(ui.Mouse) //x, y := payload.X, payload.Y //p.Text = fmt.Sprintf("X = %d, Y = %d", x, y) case "": tabpane.FocusLeft() ui.Clear() ui.Render(header, tabpane) renderTab() case "": tabpane.FocusRight() ui.Clear() ui.Render(header, tabpane) renderTab() } switch e.Type { case ui.KeyboardEvent: // handle all key presses //eventID := e.ID // keypress string //p.Text = eventID } // use Go's built-in tickers for updating and drawing data case <-ticker: renderTab() case message := <-events: process(message) } } }