From 14e76190759d754d5443f7fe012cf2f9fd29d986 Mon Sep 17 00:00:00 2001 From: Sean Smith Date: Tue, 27 Aug 2019 21:51:37 -0400 Subject: [PATCH] Renormalize the redraw function Have all instances take a function Update the remaining modules to take this into account Numerous smaller refactors to make some widgets work more or less the same --- modules/bamboohr/widget.go | 2 +- modules/circleci/widget.go | 2 +- modules/clocks/display.go | 37 +++++++------- modules/cmdrunner/widget.go | 2 +- modules/cryptoexchanges/bittrex/display.go | 2 +- modules/cryptoexchanges/blockfolio/widget.go | 2 +- modules/cryptoexchanges/cryptolive/widget.go | 2 +- modules/datadog/widget.go | 4 +- modules/feedreader/widget.go | 26 ++++++---- modules/gcal/display.go | 2 +- modules/gerrit/display.go | 2 +- modules/gerrit/widget.go | 4 +- modules/git/display.go | 2 +- modules/github/display.go | 2 +- modules/gitlab/display.go | 2 +- modules/gitter/widget.go | 8 ++-- modules/googleanalytics/widget.go | 2 +- modules/gspreadsheets/widget.go | 16 ++++--- modules/hackernews/widget.go | 4 +- modules/hibp/widget.go | 30 ++++++------ modules/ipaddresses/ipapi/widget.go | 2 +- modules/ipaddresses/ipinfo/widget.go | 2 +- modules/jenkins/widget.go | 16 ++++--- modules/jira/widget.go | 27 ++++++----- modules/kubernetes/widget.go | 8 ++-- modules/logger/widget.go | 17 ++++--- modules/mercurial/display.go | 2 +- modules/nbascore/widget.go | 2 +- modules/newrelic/widget.go | 2 +- modules/opsgenie/widget.go | 2 +- modules/pagerduty/widget.go | 2 +- modules/power/widget.go | 2 +- modules/rollbar/widget.go | 22 +++++---- modules/security/widget.go | 2 +- modules/spotify/widget.go | 2 +- modules/spotifyweb/widget.go | 2 +- modules/status/widget.go | 2 +- modules/system/widget.go | 2 +- modules/textfile/widget.go | 2 +- modules/todo/display.go | 2 +- modules/todoist/display.go | 2 +- modules/transmission/display.go | 11 ++++- modules/transmission/widget.go | 12 +++-- modules/travisci/widget.go | 48 ++++++++++--------- modules/trello/widget.go | 2 +- modules/twitter/widget.go | 2 +- modules/unknown/widget.go | 2 +- modules/victorops/widget.go | 18 +++++-- .../weatherservices/prettyweather/widget.go | 2 +- modules/weatherservices/weather/display.go | 2 +- modules/zendesk/widget.go | 2 +- view/scrollable_widget.go | 4 +- view/text_widget.go | 11 +---- 53 files changed, 209 insertions(+), 182 deletions(-) diff --git a/modules/bamboohr/widget.go b/modules/bamboohr/widget.go index b4762273..22b7acf4 100644 --- a/modules/bamboohr/widget.go +++ b/modules/bamboohr/widget.go @@ -44,7 +44,7 @@ func (widget *Widget) Refresh() { time.Now().Local().Format(wtf.DateFormat), ) - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/circleci/widget.go b/modules/circleci/widget.go index e6d619e8..a703c3f1 100644 --- a/modules/circleci/widget.go +++ b/modules/circleci/widget.go @@ -32,7 +32,7 @@ func (widget *Widget) Refresh() { return } - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/clocks/display.go b/modules/clocks/display.go index 3b5c7c89..9f61fdf8 100644 --- a/modules/clocks/display.go +++ b/modules/clocks/display.go @@ -5,28 +5,27 @@ import ( ) func (widget *Widget) display(clocks []Clock, dateFormat string, timeFormat string) { - if len(clocks) == 0 { - title := fmt.Sprintf("\n%s", " no timezone data available") - widget.Redraw(widget.CommonSettings().Title, title, true) - return - } - str := "" - for idx, clock := range clocks { - rowColor := widget.settings.colors.rows.odd + if len(clocks) == 0 { + str = fmt.Sprintf("\n%s", " no timezone data available") + } else { - if idx%2 == 0 { - rowColor = widget.settings.colors.rows.even + for idx, clock := range clocks { + rowColor := widget.settings.colors.rows.odd + + if idx%2 == 0 { + rowColor = widget.settings.colors.rows.even + } + + str += fmt.Sprintf( + " [%s]%-12s %-10s %7s[white]\n", + rowColor, + clock.Label, + clock.Time(timeFormat), + clock.Date(dateFormat), + ) } - - str += fmt.Sprintf( - " [%s]%-12s %-10s %7s[white]\n", - rowColor, - clock.Label, - clock.Time(timeFormat), - clock.Date(dateFormat), - ) } - widget.Redraw(widget.CommonSettings().Title, str, false) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, str, true }) } diff --git a/modules/cmdrunner/widget.go b/modules/cmdrunner/widget.go index 41daa412..d74921d5 100644 --- a/modules/cmdrunner/widget.go +++ b/modules/cmdrunner/widget.go @@ -47,7 +47,7 @@ func (widget *Widget) content() (string, string, bool) { // Refresh executes the command and updates the view with the results func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } // String returns the string representation of the widget diff --git a/modules/cryptoexchanges/bittrex/display.go b/modules/cryptoexchanges/bittrex/display.go index 256df503..7058542e 100644 --- a/modules/cryptoexchanges/bittrex/display.go +++ b/modules/cryptoexchanges/bittrex/display.go @@ -8,7 +8,7 @@ import ( func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/cryptoexchanges/blockfolio/widget.go b/modules/cryptoexchanges/blockfolio/widget.go index 4ad5e1cf..fec9359c 100644 --- a/modules/cryptoexchanges/blockfolio/widget.go +++ b/modules/cryptoexchanges/blockfolio/widget.go @@ -33,7 +33,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/cryptoexchanges/cryptolive/widget.go b/modules/cryptoexchanges/cryptolive/widget.go index 98691d1d..201278e4 100644 --- a/modules/cryptoexchanges/cryptolive/widget.go +++ b/modules/cryptoexchanges/cryptolive/widget.go @@ -46,7 +46,7 @@ func (widget *Widget) Refresh() { widget.toplistWidget.Refresh(&wg) wg.Wait() - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/datadog/widget.go b/modules/datadog/widget.go index e3619802..8c202bcd 100644 --- a/modules/datadog/widget.go +++ b/modules/datadog/widget.go @@ -42,7 +42,7 @@ func (widget *Widget) Refresh() { if monitorErr != nil { widget.monitors = nil widget.SetItemCount(0) - widget.Redraw(widget.CommonSettings().Title, monitorErr.Error(), true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, monitorErr.Error(), true }) return } triggeredMonitors := []datadog.Monitor{} @@ -60,7 +60,7 @@ func (widget *Widget) Refresh() { } func (widget *Widget) Render() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) HelpText() string { diff --git a/modules/feedreader/widget.go b/modules/feedreader/widget.go index b700d517..164ee9db 100644 --- a/modules/feedreader/widget.go +++ b/modules/feedreader/widget.go @@ -29,6 +29,7 @@ type Widget struct { stories []*FeedItem parser *gofeed.Parser settings *Settings + err error } // NewWidget creates a new instance of a widget @@ -76,22 +77,21 @@ func (widget *Widget) Fetch(feedURLs []string) ([]*FeedItem, error) { func (widget *Widget) Refresh() { feedItems, err := widget.Fetch(widget.settings.feeds) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.err = err + widget.stories = nil + widget.SetItemCount(0) + } else { + widget.err = nil + widget.stories = feedItems + widget.SetItemCount(len(feedItems)) } - widget.stories = feedItems - widget.SetItemCount(len(feedItems)) - widget.Render() } // Render sets up the widget data for redrawing to the screen func (widget *Widget) Render() { - if widget.stories == nil { - return - } - - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ @@ -123,8 +123,14 @@ func (widget *Widget) fetchForFeed(feedURL string) ([]*FeedItem, error) { } func (widget *Widget) content() (string, string, bool) { - data := widget.stories title := widget.CommonSettings().Title + if widget.err != nil { + return title, widget.err.Error(), true + } + data := widget.stories + if data == nil || len(data) == 0 { + return title, "No data", false + } var str string for idx, feedItem := range data { diff --git a/modules/gcal/display.go b/modules/gcal/display.go index 85874c9e..39cdd756 100644 --- a/modules/gcal/display.go +++ b/modules/gcal/display.go @@ -25,7 +25,7 @@ func (widget *Widget) sortedEvents() ([]*CalEvent, []*CalEvent) { } func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/gerrit/display.go b/modules/gerrit/display.go index e7ba5161..461a3aad 100644 --- a/modules/gerrit/display.go +++ b/modules/gerrit/display.go @@ -5,7 +5,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/gerrit/widget.go b/modules/gerrit/widget.go index d7f8baa1..7cd6c604 100644 --- a/modules/gerrit/widget.go +++ b/modules/gerrit/widget.go @@ -76,9 +76,7 @@ func (widget *Widget) Refresh() { } gerrit, err := glb.NewClient(gerritUrl, httpClient) if err != nil { - widget.View.SetWrap(true) - - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, err.Error(), true }) return } widget.gerrit = gerrit diff --git a/modules/git/display.go b/modules/git/display.go index f7d9a30e..14c983ce 100644 --- a/modules/git/display.go +++ b/modules/git/display.go @@ -7,7 +7,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/github/display.go b/modules/github/display.go index 94634648..2f890c3a 100644 --- a/modules/github/display.go +++ b/modules/github/display.go @@ -7,7 +7,7 @@ import ( ) func (widget *Widget) display() { - widget.TextWidget.RedrawFunc(widget.content) + widget.TextWidget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/gitlab/display.go b/modules/gitlab/display.go index 11b8d98d..f0dd2c6f 100644 --- a/modules/gitlab/display.go +++ b/modules/gitlab/display.go @@ -5,7 +5,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/gitter/widget.go b/modules/gitter/widget.go index 38624819..18099f0a 100644 --- a/modules/gitter/widget.go +++ b/modules/gitter/widget.go @@ -44,19 +44,19 @@ func (widget *Widget) Refresh() { room, err := GetRoom(widget.settings.roomURI, widget.settings.apiToken) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, err.Error(), true }) return } if room == nil { - widget.Redraw(widget.CommonSettings().Title, "No room", true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, "No room", true }) return } messages, err := GetMessages(room.ID, widget.settings.numberOfMessages, widget.settings.apiToken) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, err.Error(), true }) return } widget.messages = messages @@ -72,7 +72,7 @@ func (widget *Widget) HelpText() string { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/googleanalytics/widget.go b/modules/googleanalytics/widget.go index d74dbc0c..426baf37 100644 --- a/modules/googleanalytics/widget.go +++ b/modules/googleanalytics/widget.go @@ -25,5 +25,5 @@ func (widget *Widget) Refresh() { websiteReports := widget.Fetch() contentTable := widget.createTable(websiteReports) - widget.Redraw(widget.CommonSettings().Title, contentTable, false) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, contentTable, false }) } diff --git a/modules/gspreadsheets/widget.go b/modules/gspreadsheets/widget.go index 5915ad99..b63b40e7 100644 --- a/modules/gspreadsheets/widget.go +++ b/modules/gspreadsheets/widget.go @@ -13,6 +13,7 @@ type Widget struct { view.TextWidget settings *Settings + cells []*sheets.ValueRange } func NewWidget(app *tview.Application, settings *Settings) *Widget { @@ -29,23 +30,24 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { cells, _ := widget.Fetch() + widget.cells = cells - widget.Redraw(widget.CommonSettings().Title, widget.contentFrom(cells), false) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ -func (widget *Widget) contentFrom(valueRanges []*sheets.ValueRange) string { - if valueRanges == nil { - return "error 1" +func (widget *Widget) content() (string, string, bool) { + if widget.cells == nil { + return widget.CommonSettings().Title, "error 1", false } res := "" cells := utils.ToStrs(widget.settings.cellNames) - for i := 0; i < len(valueRanges); i++ { - res += fmt.Sprintf("%s\t[%s]%s\n", cells[i], widget.settings.colors.values, valueRanges[i].Values[0][0]) + for i := 0; i < len(widget.cells); i++ { + res += fmt.Sprintf("%s\t[%s]%s\n", cells[i], widget.settings.colors.values, widget.cells[i].Values[0][0]) } - return res + return widget.CommonSettings().Title, res, false } diff --git a/modules/hackernews/widget.go b/modules/hackernews/widget.go index c49fafe3..885d9c22 100644 --- a/modules/hackernews/widget.go +++ b/modules/hackernews/widget.go @@ -48,7 +48,7 @@ func (widget *Widget) Refresh() { } if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, err.Error(), true }) return } var stories []Story @@ -67,7 +67,7 @@ func (widget *Widget) Refresh() { // Render sets up the widget data for redrawing to the screen func (widget *Widget) Render() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/hibp/widget.go b/modules/hibp/widget.go index 8a7ee1f9..9f57b601 100644 --- a/modules/hibp/widget.go +++ b/modules/hibp/widget.go @@ -11,8 +11,9 @@ import ( type Widget struct { view.TextWidget - accounts []string settings *Settings + data []*Status + err error } // NewWidget creates a new instance of a widget @@ -48,29 +49,28 @@ func (widget *Widget) Fetch(accounts []string) ([]*Status, error) { func (widget *Widget) Refresh() { data, err := widget.Fetch(widget.settings.accounts) - title := widget.CommonSettings().Title - title = title + widget.sinceDateForTitle() - - var wrap bool - var content string - if err != nil { - wrap = true - content = err.Error() + widget.err = err + widget.data = nil } else { - wrap = false - content = widget.contentFrom(data) + widget.err = nil + widget.data = data } - widget.Redraw(title, content, wrap) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ -func (widget *Widget) contentFrom(data []*Status) string { +func (widget *Widget) content() (string, string, bool) { + title := widget.CommonSettings().Title + if widget.err != nil { + return title, widget.err.Error(), true + } + title = title + widget.sinceDateForTitle() str := "" - for _, stat := range data { + for _, stat := range widget.data { color := widget.settings.colors.ok if stat.HasBeenCompromised() { color = widget.settings.colors.pwned @@ -79,7 +79,7 @@ func (widget *Widget) contentFrom(data []*Status) string { str += fmt.Sprintf(" [%s]%s[white]\n", color, stat.Account) } - return str + return title, str, false } func (widget *Widget) sinceDateForTitle() string { diff --git a/modules/ipaddresses/ipapi/widget.go b/modules/ipaddresses/ipapi/widget.go index d25b4c01..63fcdb49 100644 --- a/modules/ipaddresses/ipapi/widget.go +++ b/modules/ipaddresses/ipapi/widget.go @@ -52,7 +52,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { widget.ipinfo() - widget.RedrawFunc(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) } //this method reads the config and calls ipinfo for ip information diff --git a/modules/ipaddresses/ipinfo/widget.go b/modules/ipaddresses/ipinfo/widget.go index d6797cd5..0184e82d 100644 --- a/modules/ipaddresses/ipinfo/widget.go +++ b/modules/ipaddresses/ipinfo/widget.go @@ -44,7 +44,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { widget.ipinfo() - widget.RedrawFunc(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) } //this method reads the config and calls ipinfo for ip information diff --git a/modules/jenkins/widget.go b/modules/jenkins/widget.go index 334d3957..1310ef3e 100644 --- a/modules/jenkins/widget.go +++ b/modules/jenkins/widget.go @@ -13,6 +13,7 @@ type Widget struct { settings *Settings view *View + err error } func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { @@ -47,24 +48,27 @@ func (widget *Widget) Refresh() { widget.view = view if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) - return + widget.err = err + widget.SetItemCount(0) + } else { + widget.SetItemCount(len(widget.view.Jobs)) } - widget.SetItemCount(len(widget.view.Jobs)) - widget.Render() } /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) Render() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { title := fmt.Sprintf("%s: [red]%s", widget.CommonSettings().Title, widget.view.Name) - if widget.view == nil { + if widget.err != nil { + return title, widget.err.Error(), true + } + if widget.view == nil || len(widget.view.Jobs) == 0 { return title, "No content to display", false } diff --git a/modules/jira/widget.go b/modules/jira/widget.go index 002158ee..1c4dbf9f 100644 --- a/modules/jira/widget.go +++ b/modules/jira/widget.go @@ -14,6 +14,7 @@ type Widget struct { result *SearchResult settings *Settings + err error } func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { @@ -43,23 +44,18 @@ func (widget *Widget) Refresh() { ) if err != nil { + widget.err = err widget.result = nil - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) return } + widget.err = nil widget.result = searchResult widget.SetItemCount(len(searchResult.Issues)) widget.Render() } func (widget *Widget) Render() { - if widget.result == nil { - return - } - - str := fmt.Sprintf("%s- [green]%s[white]", widget.CommonSettings().Title, widget.settings.projects) - - widget.Redraw(str, widget.contentFrom(widget.result), false) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ @@ -72,10 +68,19 @@ func (widget *Widget) openItem() { } } -func (widget *Widget) contentFrom(searchResult *SearchResult) string { +func (widget *Widget) content() (string, string, bool) { + if widget.err != nil { + return widget.CommonSettings().Title, widget.err.Error(), true + } + + title := fmt.Sprintf("%s- [green]%s[white]", widget.CommonSettings().Title, widget.settings.projects) str := " [red]Assigned Issues[white]\n" - for idx, issue := range searchResult.Issues { + if widget.result == nil || len(widget.result.Issues) == 0 { + return title, "No results to display", false + } + + for idx, issue := range widget.result.Issues { row := fmt.Sprintf( `[%s] [%s]%-6s[white] [green]%-10s[white] [yellow][%s][white] [%s]%s`, widget.RowColor(idx), @@ -90,7 +95,7 @@ func (widget *Widget) contentFrom(searchResult *SearchResult) string { str += utils.HighlightableHelper(widget.View, row, idx, len(issue.IssueFields.Summary)) } - return str + return title, str, false } func (widget *Widget) issueTypeColor(issue *Issue) string { diff --git a/modules/kubernetes/widget.go b/modules/kubernetes/widget.go index 198ba1f4..a52865e3 100644 --- a/modules/kubernetes/widget.go +++ b/modules/kubernetes/widget.go @@ -48,7 +48,7 @@ func (widget *Widget) Refresh() { if utils.Includes(widget.objects, "nodes") { nodeList, nodeError := client.getNodes() if nodeError != nil { - widget.Redraw(title, "[red] Error getting node data [white]\n", true) + widget.Redraw(func() (string, string, bool) { return title, "[red] Error getting node data [white]\n", true }) return } content += "[red]Nodes[white]\n" @@ -61,7 +61,7 @@ func (widget *Widget) Refresh() { if utils.Includes(widget.objects, "deployments") { deploymentList, deploymentError := client.getDeployments(widget.namespaces) if deploymentError != nil { - widget.Redraw(title, "[red] Error getting deployment data [white]\n", true) + widget.Redraw(func() (string, string, bool) { return title, "[red] Error getting deployment data [white]\n", true }) return } content += "[red]Deployments[white]\n" @@ -74,7 +74,7 @@ func (widget *Widget) Refresh() { if utils.Includes(widget.objects, "pods") { podList, podError := client.getPods(widget.namespaces) if podError != nil { - widget.Redraw(title, "[red] Error getting pod data [white]\n", false) + widget.Redraw(func() (string, string, bool) { return title, "[red] Error getting pod data [white]\n", false }) return } content += "[red]Pods[white]\n" @@ -84,7 +84,7 @@ func (widget *Widget) Refresh() { content += "\n" } - widget.Redraw(title, content, false) + widget.Redraw(func() (string, string, bool) { return title, content, false }) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/logger/widget.go b/modules/logger/widget.go index 049bd31e..7757266c 100644 --- a/modules/logger/widget.go +++ b/modules/logger/widget.go @@ -34,18 +34,17 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { // Refresh updates the onscreen contents of the widget func (widget *Widget) Refresh() { - if log.LogFileMissing() { - return - } - - logLines := widget.tailFile() - - widget.Redraw(widget.CommonSettings().Title, widget.contentFrom(logLines), false) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ -func (widget *Widget) contentFrom(logLines []string) string { +func (widget *Widget) content() (string, string, bool) { + if log.LogFileMissing() { + return widget.CommonSettings().Title, "File missing", false + } + + logLines := widget.tailFile() str := "" for _, line := range logLines { @@ -61,7 +60,7 @@ func (widget *Widget) contentFrom(logLines []string) string { } } - return str + return widget.CommonSettings().Title, str, false } func (widget *Widget) tailFile() []string { diff --git a/modules/mercurial/display.go b/modules/mercurial/display.go index 28ffdc7e..8107c377 100644 --- a/modules/mercurial/display.go +++ b/modules/mercurial/display.go @@ -7,7 +7,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/nbascore/widget.go b/modules/nbascore/widget.go index b01b5750..42159c64 100644 --- a/modules/nbascore/widget.go +++ b/modules/nbascore/widget.go @@ -45,7 +45,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * } func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.nbascore) + widget.Redraw(widget.nbascore) } func (widget *Widget) HelpText() string { diff --git a/modules/newrelic/widget.go b/modules/newrelic/widget.go index 210e82e3..4c757168 100644 --- a/modules/newrelic/widget.go +++ b/modules/newrelic/widget.go @@ -31,7 +31,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/opsgenie/widget.go b/modules/opsgenie/widget.go index ef0ca66f..cda2f034 100644 --- a/modules/opsgenie/widget.go +++ b/modules/opsgenie/widget.go @@ -28,7 +28,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/pagerduty/widget.go b/modules/pagerduty/widget.go index 9fb93a99..1f021621 100644 --- a/modules/pagerduty/widget.go +++ b/modules/pagerduty/widget.go @@ -59,7 +59,7 @@ func (widget *Widget) Refresh() { content = widget.contentFrom(onCalls, incidents) } - widget.Redraw(widget.CommonSettings().Title, content, wrap) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, content, wrap }) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/power/widget.go b/modules/power/widget.go index 15d0bd5b..0d8da597 100644 --- a/modules/power/widget.go +++ b/modules/power/widget.go @@ -38,5 +38,5 @@ func (widget *Widget) content() (string, string, bool) { func (widget *Widget) Refresh() { widget.Battery.Refresh() - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } diff --git a/modules/rollbar/widget.go b/modules/rollbar/widget.go index 700a3442..c7341c7d 100644 --- a/modules/rollbar/widget.go +++ b/modules/rollbar/widget.go @@ -15,6 +15,7 @@ type Widget struct { items *Result settings *Settings + err error } // NewWidget creates a new instance of a widget @@ -49,11 +50,13 @@ func (widget *Widget) Refresh() { ) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) - return + widget.err = err + widget.items = nil + widget.SetItemCount(0) + } else { + widget.items = &items.Results + widget.SetItemCount(len(widget.items.Items)) } - widget.items = &items.Results - widget.SetItemCount(len(widget.items.Items)) widget.Render() } @@ -61,17 +64,16 @@ func (widget *Widget) Refresh() { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) Render() { - if widget.items == nil { - return - } - - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { title := fmt.Sprintf("%s - %s", widget.CommonSettings().Title, widget.settings.projectName) + if widget.err != nil { + return widget.CommonSettings().Title, widget.err.Error(), true + } result := widget.items - if result == nil { + if result == nil || len(result.Items) == 0 { return title, "No results", false } var str string diff --git a/modules/security/widget.go b/modules/security/widget.go index ed18f2e3..62337916 100644 --- a/modules/security/widget.go +++ b/modules/security/widget.go @@ -32,7 +32,7 @@ func (widget *Widget) Refresh() { return } - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/spotify/widget.go b/modules/spotify/widget.go index afaa5aa8..84173fc9 100644 --- a/modules/spotify/widget.go +++ b/modules/spotify/widget.go @@ -51,7 +51,7 @@ func (w *Widget) refreshSpotifyInfos() error { } func (w *Widget) Refresh() { - w.RedrawFunc(w.createOutput) + w.Redraw(w.createOutput) } func (widget *Widget) HelpText() string { diff --git a/modules/spotifyweb/widget.go b/modules/spotifyweb/widget.go index f707cd9a..b0d7c830 100644 --- a/modules/spotifyweb/widget.go +++ b/modules/spotifyweb/widget.go @@ -154,7 +154,7 @@ func (w *Widget) refreshSpotifyInfos() error { // Refresh refreshes the current view of the widget func (w *Widget) Refresh() { - w.RedrawFunc(w.createOutput) + w.Redraw(w.createOutput) } func (widget *Widget) HelpText() string { diff --git a/modules/status/widget.go b/modules/status/widget.go index f5cc1bc8..fd4e734e 100644 --- a/modules/status/widget.go +++ b/modules/status/widget.go @@ -28,7 +28,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.animation) + widget.Redraw(widget.animation) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/system/widget.go b/modules/system/widget.go index 8258e070..033a54e4 100644 --- a/modules/system/widget.go +++ b/modules/system/widget.go @@ -51,7 +51,7 @@ func (widget *Widget) display() (string, string, bool) { } func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.display) + widget.Redraw(widget.display) } func (widget *Widget) prettyDate() string { diff --git a/modules/textfile/widget.go b/modules/textfile/widget.go index ebcfc62d..367a873f 100644 --- a/modules/textfile/widget.go +++ b/modules/textfile/widget.go @@ -71,7 +71,7 @@ func (widget *Widget) HelpText() string { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/todo/display.go b/modules/todo/display.go index 8cef871d..8132ad91 100644 --- a/modules/todo/display.go +++ b/modules/todo/display.go @@ -9,7 +9,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/todoist/display.go b/modules/todoist/display.go index e5ed4d7a..8ceac803 100644 --- a/modules/todoist/display.go +++ b/modules/todoist/display.go @@ -32,5 +32,5 @@ func (widget *Widget) content() (string, string, bool) { } func (widget *Widget) display() { - widget.ScrollableWidget.RedrawFunc(widget.content) + widget.ScrollableWidget.Redraw(widget.content) } diff --git a/modules/transmission/display.go b/modules/transmission/display.go index a8c0234b..1e0f2589 100644 --- a/modules/transmission/display.go +++ b/modules/transmission/display.go @@ -10,7 +10,14 @@ import ( ) func (widget *Widget) content() (string, string, bool) { + title := widget.CommonSettings().Title + if widget.err != nil { + return title, widget.err.Error(), true + } data := widget.torrents + if data == nil || len(data) == 0 { + return title, "No data", false + } str := "" for idx, torrent := range data { @@ -28,11 +35,11 @@ func (widget *Widget) content() (string, string, bool) { str += utils.HighlightableHelper(widget.View, row, idx, len(torrName)) } - return widget.CommonSettings().Title, str, false + return title, str, false } func (widget *Widget) display() { - widget.ScrollableWidget.RedrawFunc(widget.content) + widget.ScrollableWidget.Redraw(widget.content) } func (widget *Widget) prettyTorrentName(name string) string { diff --git a/modules/transmission/widget.go b/modules/transmission/widget.go index e6c457cd..599aba68 100644 --- a/modules/transmission/widget.go +++ b/modules/transmission/widget.go @@ -16,6 +16,7 @@ type Widget struct { client *transmissionrpc.Client settings *Settings torrents []*transmissionrpc.Torrent + err error } // NewWidget creates a new instance of a widget @@ -63,14 +64,15 @@ func (widget *Widget) Fetch() ([]*transmissionrpc.Torrent, error) { func (widget *Widget) Refresh() { torrents, err := widget.Fetch() if err != nil { + widget.err = err + widget.torrents = nil widget.SetItemCount(0) - widget.ScrollableWidget.Redraw(widget.CommonSettings().Title, err.Error(), false) - return + } else { + widget.err = nil + widget.torrents = torrents + widget.SetItemCount(len(torrents)) } - widget.torrents = torrents - widget.SetItemCount(len(torrents)) - widget.display() } diff --git a/modules/travisci/widget.go b/modules/travisci/widget.go index a878dc9e..3edf6a92 100644 --- a/modules/travisci/widget.go +++ b/modules/travisci/widget.go @@ -15,6 +15,7 @@ type Widget struct { builds *Builds settings *Settings + err error } func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { @@ -44,41 +45,44 @@ func (widget *Widget) Refresh() { builds, err := BuildsFor(widget.settings.apiKey, widget.settings.pro) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) - return + widget.err = err + widget.builds = nil + widget.SetItemCount(0) + } else { + widget.err = nil + widget.builds = builds + widget.SetItemCount(len(builds.Builds)) } - widget.builds = builds - widget.SetItemCount(len(builds.Builds)) widget.Render() } /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) Render() { - if widget.builds == nil { - return - } - - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { title := fmt.Sprintf("%s - Builds", widget.CommonSettings().Title) var str string - for idx, build := range widget.builds.Builds { + if widget.err != nil { + str = widget.err.Error() + } else { + for idx, build := range widget.builds.Builds { - row := fmt.Sprintf( - "[%s] [%s] %s-%s (%s) [%s]%s - [blue]%s\n", - widget.RowColor(idx), - buildColor(&build), - build.Repository.Name, - build.Number, - build.Branch.Name, - widget.RowColor(idx), - strings.Split(build.Commit.Message, "\n")[0], - build.CreatedBy.Login, - ) - str += utils.HighlightableHelper(widget.View, row, idx, len(build.Branch.Name)) + row := fmt.Sprintf( + "[%s] [%s] %s-%s (%s) [%s]%s - [blue]%s\n", + widget.RowColor(idx), + buildColor(&build), + build.Repository.Name, + build.Number, + build.Branch.Name, + widget.RowColor(idx), + strings.Split(build.Commit.Message, "\n")[0], + build.CreatedBy.Login, + ) + str += utils.HighlightableHelper(widget.View, row, idx, len(build.Branch.Name)) + } } return title, str, false diff --git a/modules/trello/widget.go b/modules/trello/widget.go index 3ee2e436..d78a65eb 100644 --- a/modules/trello/widget.go +++ b/modules/trello/widget.go @@ -27,7 +27,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/twitter/widget.go b/modules/twitter/widget.go index 69c3ca77..b1fe0743 100644 --- a/modules/twitter/widget.go +++ b/modules/twitter/widget.go @@ -62,7 +62,7 @@ func (widget *Widget) HelpText() string { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/unknown/widget.go b/modules/unknown/widget.go index c09fd733..7ba221ac 100644 --- a/modules/unknown/widget.go +++ b/modules/unknown/widget.go @@ -27,5 +27,5 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { content := fmt.Sprintf("Widget %s and/or type %s does not exist", widget.Name(), widget.CommonSettings().Module.Type) - widget.RedrawFunc(func() (string, string, bool) { return widget.CommonSettings().Title, content, true }) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, content, true }) } diff --git a/modules/victorops/widget.go b/modules/victorops/widget.go index a1ad09a5..56e85919 100644 --- a/modules/victorops/widget.go +++ b/modules/victorops/widget.go @@ -13,6 +13,7 @@ type Widget struct { teams []OnCallTeam settings *Settings + err error } // NewWidget creates a new widget @@ -36,18 +37,25 @@ func (widget *Widget) Refresh() { teams, err := Fetch(widget.settings.apiID, widget.settings.apiKey) if err != nil { - widget.Redraw(widget.CommonSettings().Title, err.Error(), true) + widget.err = err + widget.teams = nil } else { + widget.err = nil widget.teams = teams - widget.Redraw(widget.CommonSettings().Title, widget.contentFrom(widget.teams), true) } + widget.Redraw(widget.content) } -func (widget *Widget) contentFrom(teams []OnCallTeam) string { +func (widget *Widget) content() (string, string, bool) { + title := widget.CommonSettings().Title + if widget.err != nil { + return title, widget.err.Error(), true + } + teams := widget.teams var str string if teams == nil || len(teams) == 0 { - return "No teams specified" + return title, "No teams specified", false } for _, team := range teams { @@ -69,5 +77,5 @@ func (widget *Widget) contentFrom(teams []OnCallTeam) string { if len(str) == 0 { str = "Could not find any teams to display" } - return str + return title, str, false } diff --git a/modules/weatherservices/prettyweather/widget.go b/modules/weatherservices/prettyweather/widget.go index 5a8f639c..4c9fe6c2 100644 --- a/modules/weatherservices/prettyweather/widget.go +++ b/modules/weatherservices/prettyweather/widget.go @@ -30,7 +30,7 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { func (widget *Widget) Refresh() { widget.prettyWeather() - widget.RedrawFunc(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) + widget.Redraw(func() (string, string, bool) { return widget.CommonSettings().Title, widget.result, false }) } //this method reads the config and calls wttr.in for pretty weather diff --git a/modules/weatherservices/weather/display.go b/modules/weatherservices/weather/display.go index 613fc609..4ba1d1d5 100644 --- a/modules/weatherservices/weather/display.go +++ b/modules/weatherservices/weather/display.go @@ -9,7 +9,7 @@ import ( ) func (widget *Widget) display() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/modules/zendesk/widget.go b/modules/zendesk/widget.go index eb12a759..8555b69f 100644 --- a/modules/zendesk/widget.go +++ b/modules/zendesk/widget.go @@ -53,7 +53,7 @@ func (widget *Widget) Refresh() { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) Render() { - widget.RedrawFunc(widget.content) + widget.Redraw(widget.content) } func (widget *Widget) content() (string, string, bool) { diff --git a/view/scrollable_widget.go b/view/scrollable_widget.go index 0bf588ab..e981b666 100644 --- a/view/scrollable_widget.go +++ b/view/scrollable_widget.go @@ -72,8 +72,8 @@ func (widget *ScrollableWidget) Unselect() { } } -func (widget *ScrollableWidget) Redraw(title, content string, wrap bool) { - widget.TextWidget.Redraw(title, content, wrap) +func (widget *ScrollableWidget) Redraw(data func() (string, string, bool)) { + widget.TextWidget.Redraw(data) widget.app.QueueUpdateDraw(func() { widget.View.Highlight(strconv.Itoa(widget.Selected)).ScrollToHighlight() }) diff --git a/view/text_widget.go b/view/text_widget.go index 9b32f500..911657cc 100644 --- a/view/text_widget.go +++ b/view/text_widget.go @@ -29,16 +29,7 @@ func (widget *TextWidget) TextView() *tview.TextView { return widget.View } -func (widget *TextWidget) Redraw(title, text string, wrap bool) { - widget.app.QueueUpdateDraw(func() { - widget.View.Clear() - widget.View.SetWrap(wrap) - widget.View.SetTitle(widget.ContextualTitle(title)) - widget.View.SetText(text) - }) -} - -func (widget *TextWidget) RedrawFunc(data func() (string, string, bool)) { +func (widget *TextWidget) Redraw(data func() (string, string, bool)) { widget.app.QueueUpdateDraw(func() { title, content, wrap := data() widget.View.Clear()