in pkg/display/graph/dashboard/global.go [237:304]
func Display(ctx context.Context, data *dashboard.GlobalData) error {
t, err := termbox.New(termbox.ColorMode(terminalapi.ColorMode256))
if err != nil {
return err
}
defer t.Close()
c, err := container.New(
t,
container.Border(linestyle.Light),
container.BorderTitle("[Global Dashboard]-PRESS Q TO QUIT"),
container.ID(rootID))
if err != nil {
return err
}
te, err := dashboard.LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
if err != nil {
return err
}
template = te
// Initialization
allWidgets = &widgets{
gauges: nil,
linears: nil,
heatmap: nil,
buttons: nil,
}
err = newWidgets(data)
if err != nil {
return err
}
lb, err := newLayoutButtons(c)
if err != nil {
return err
}
allWidgets.buttons = lb
gridOpts, err := gridLayout(layoutMetrics)
if err != nil {
return err
}
if e := c.Update(rootID, gridOpts...); e != nil {
return e
}
var cancel context.CancelFunc
ctx, cancel = context.WithCancel(ctx)
quitter := func(keyboard *terminalapi.Keyboard) {
if strings.EqualFold(keyboard.Key.String(), "q") {
cancel()
}
}
refreshInterval := time.Duration(ctx.Value(contextkey.DashboardRefreshInterval{}).(int)) * time.Second
dt := ctx.Value(contextkey.DurationType{}).(utils.DurationType)
// Only when users use the relative time, the duration will be adjusted to refresh.
if dt != utils.BothPresent {
go refresh(ctx, refreshInterval)
}
err = termdash.Run(ctx, t, c, termdash.KeyboardSubscriber(quitter), termdash.RedrawInterval(refreshInterval))
return err
}