func DisplayDiscovering() { p := ui.NewPar("Discovering Pip-Boys") p.Width = 22 p.Height = 3 discoverUi := ui.NewGrid( ui.NewRow( ui.NewCol(4, 4, p), ), ) discoverUi.Width = ui.Body.Width discoverUi.Align() ui.Render(discoverUi) }
func (u Ui) refresh() { grid := termui.NewGrid( termui.NewRow( termui.NewCol(9, 0, u.headerWidget), termui.NewCol(3, 0, u.infoWidget), ), termui.NewRow( termui.NewCol(12, 0, u.feedsWidget), ), ) for _, widget := range u.activeDownloadWidgets { grid.AddRows( termui.NewRow( termui.NewCol(12, 0, widget), ), ) } grid.Width = u.gridWidth grid.Align() termui.Render(grid) }
// StartUI periodically refreshes the screen using recent data func StartUI( opts map[string]interface{}, statsCh chan *Stats, shutdownCh chan struct{}, ) { cleanStats := &Stats{ Varz: &gnatsd.Varz{}, Connz: &gnatsd.Connz{}, Rates: &Rates{}, } // Show empty values on first display text := generateParagraph(opts, cleanStats) par := ui.NewPar(text) par.Height = ui.TermHeight() par.Width = ui.TermWidth() par.HasBorder = false helpText := generateHelp() helpPar := ui.NewPar(helpText) helpPar.Height = ui.TermHeight() helpPar.Width = ui.TermWidth() helpPar.HasBorder = false // Top like view paraRow := ui.NewRow(ui.NewCol(ui.TermWidth(), 0, par)) // Help view helpParaRow := ui.NewRow(ui.NewCol(ui.TermWidth(), 0, helpPar)) // Create grids that we'll be using to toggle what to render topViewGrid := ui.NewGrid(paraRow) helpViewGrid := ui.NewGrid(helpParaRow) // Start with the topviewGrid by default ui.Body.Rows = topViewGrid.Rows ui.Body.Align() // Used to toggle back to previous mode viewMode := TopViewMode // Used for pinging the IU to refresh the screen with new values redraw := make(chan struct{}) update := func() { for { stats := <-statsCh // Update top view text text = generateParagraph(opts, stats) par.Text = text redraw <- struct{}{} } } // Flags for capturing options waitingSortOption := false waitingLimitOption := false displaySubscriptions := false optionBuf := "" refreshOptionHeader := func() { // Need to mask what was typed before clrline := "\033[1;1H\033[6;1H " clrline += " " for i := 0; i < len(optionBuf); i++ { clrline += " " } fmt.Printf(clrline) } evt := ui.EventCh() ui.Render(ui.Body) go update() for { select { case e := <-evt: if waitingSortOption { if e.Type == ui.EventKey && e.Key == ui.KeyEnter { sortOpt := gnatsd.SortOpt(optionBuf) switch sortOpt { case SortByCid, SortBySubs, SortByPending, SortByOutMsgs, SortByInMsgs, SortByOutBytes, SortByInBytes: opts["sort"] = sortOpt default: go func() { // Has to be at least of the same length as sort by header emptyPadding := " " fmt.Printf("\033[1;1H\033[6;1Hinvalid order: %s%s", optionBuf, emptyPadding) waitingSortOption = false time.Sleep(1 * time.Second) refreshOptionHeader() optionBuf = "" }() continue } refreshOptionHeader() waitingSortOption = false optionBuf = "" continue } // Handle backspace if e.Type == ui.EventKey && len(optionBuf) > 0 && (e.Key == ui.KeyBackspace || e.Key == ui.KeyBackspace2) { optionBuf = optionBuf[:len(optionBuf)-1] refreshOptionHeader() } else { optionBuf += string(e.Ch) } fmt.Printf("\033[1;1H\033[6;1Hsort by [%s]: %s", opts["sort"], optionBuf) } if waitingLimitOption { if e.Type == ui.EventKey && e.Key == ui.KeyEnter { var n int _, err := fmt.Sscanf(optionBuf, "%d", &n) if err == nil { opts["conns"] = n } waitingLimitOption = false optionBuf = "" refreshOptionHeader() continue } // Handle backspace if e.Type == ui.EventKey && len(optionBuf) > 0 && (e.Key == ui.KeyBackspace || e.Key == ui.KeyBackspace2) { optionBuf = optionBuf[:len(optionBuf)-1] refreshOptionHeader() } else { optionBuf += string(e.Ch) } fmt.Printf("\033[1;1H\033[6;1Hlimit [%d]: %s", opts["conns"], optionBuf) } if e.Type == ui.EventKey && (e.Ch == 'q' || e.Key == ui.KeyCtrlC) { close(shutdownCh) cleanExit() } if e.Type == ui.EventKey && e.Ch == 's' && !(waitingLimitOption || waitingSortOption) { if displaySubscriptions { displaySubscriptions = false opts["subs"] = false } else { displaySubscriptions = true opts["subs"] = true } } if e.Type == ui.EventKey && viewMode == HelpViewMode { ui.Body.Rows = topViewGrid.Rows viewMode = TopViewMode continue } if e.Type == ui.EventKey && e.Ch == 'o' && !waitingLimitOption && viewMode == TopViewMode { fmt.Printf("\033[1;1H\033[6;1Hsort by [%s]:", opts["sort"]) waitingSortOption = true } if e.Type == ui.EventKey && e.Ch == 'n' && !waitingSortOption && viewMode == TopViewMode { fmt.Printf("\033[1;1H\033[6;1Hlimit [%d]:", opts["conns"]) waitingLimitOption = true } if e.Type == ui.EventKey && (e.Ch == '?' || e.Ch == 'h') && !(waitingSortOption || waitingLimitOption) { if viewMode == TopViewMode { refreshOptionHeader() optionBuf = "" } ui.Body.Rows = helpViewGrid.Rows viewMode = HelpViewMode waitingLimitOption = false waitingSortOption = false } if e.Type == ui.EventResize { ui.Body.Width = ui.TermWidth() ui.Body.Align() go func() { redraw <- struct{}{} }() } case <-redraw: ui.Render(ui.Body) } } }