From 0a5a4c9062ebfb005e492f73189818a6ecd3f8ed Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Wed, 22 May 2019 17:38:01 +0000 Subject: [PATCH] add multi-line scrolling support, timestamps to error view --- connector/main.go | 2 +- grid.go | 5 +++-- widgets/error.go | 40 +++++++++++++++++++++++++++++++--------- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/connector/main.go b/connector/main.go index 61e3a13..0907a77 100644 --- a/connector/main.go +++ b/connector/main.go @@ -68,7 +68,7 @@ func (cs *ConnectorSuper) loop() { conn, err := cs.connFn() if err != nil { - cs.setError(fmt.Errorf("%s\n\nattempting to reconnect...", err)) + cs.setError(err) log.Errorf("failed to initialize connector: %s (%T)", err, err) log.Errorf("retrying in %ds", interval) time.Sleep(interval * time.Second) diff --git a/grid.go b/grid.go index 882d730..2e48c8b 100644 --- a/grid.go +++ b/grid.go @@ -12,7 +12,8 @@ func ShowConnError(err error) (exit bool) { defer ui.DefaultEvtStream.ResetHandlers() setErr := func(err error) { - errView.Text = err.Error() + errView.Append(err.Error()) + errView.Append("attempting to reconnect...") ui.Render(errView) } @@ -21,7 +22,7 @@ func ShowConnError(err error) (exit bool) { ui.StopLoop() }) - ui.Handle("/timer/1s", func(ui.Event) { + ui.Handle("/timer/2s", func(ui.Event) { _, err := cursor.RefreshContainers() if err == nil { ui.StopLoop() diff --git a/widgets/error.go b/widgets/error.go index 458ccaa..7f6a4a9 100644 --- a/widgets/error.go +++ b/widgets/error.go @@ -2,37 +2,59 @@ package widgets import ( "fmt" + "strings" + "time" + ui "github.com/gizak/termui" ) type ErrorView struct { *ui.Par + lines []string } func NewErrorView() *ErrorView { + const yPad = 1 + const xPad = 2 + p := ui.NewPar("") + p.X = xPad + p.Y = yPad p.Border = true p.Height = 10 p.Width = 20 - p.PaddingTop = 1 - p.PaddingBottom = 1 - p.PaddingLeft = 2 - p.PaddingRight = 2 + p.PaddingTop = yPad + p.PaddingBottom = yPad + p.PaddingLeft = xPad + p.PaddingRight = xPad + p.BorderLabel = " ctop - error " p.Bg = ui.ThemeAttr("bg") p.TextFgColor = ui.ThemeAttr("status.warn") p.TextBgColor = ui.ThemeAttr("menu.text.bg") p.BorderFg = ui.ThemeAttr("status.warn") p.BorderLabelFg = ui.ThemeAttr("status.warn") - return &ErrorView{p} + return &ErrorView{p, make([]string, 0, 50)} +} + +func (w *ErrorView) Append(s string) { + if len(w.lines)+2 >= cap(w.lines) { + w.lines = append(w.lines[:0], w.lines[2:]...) + } + ts := time.Now().Local().Format("15:04:05 MST") + w.lines = append(w.lines, fmt.Sprintf("[%s] %s", ts, s)) + w.lines = append(w.lines, "") } func (w *ErrorView) Buffer() ui.Buffer { - w.BorderLabel = fmt.Sprintf(" %s ", timeStr()) + offset := len(w.lines) - w.InnerHeight() + if offset < 0 { + offset = 0 + } + w.Text = strings.Join(w.lines[offset:len(w.lines)], "\n") return w.Par.Buffer() } func (w *ErrorView) Resize() { - w.SetX(ui.TermWidth() / 12) - w.SetY(ui.TermHeight() / 3) - w.SetWidth(w.X * 10) + w.Height = ui.TermHeight() - (w.PaddingTop + w.PaddingBottom) + w.SetWidth(ui.TermWidth() - (w.PaddingLeft + w.PaddingRight)) }