diff --git a/app/app_manager.go b/app/app_manager.go new file mode 100644 index 00000000..50e89954 --- /dev/null +++ b/app/app_manager.go @@ -0,0 +1,71 @@ +package app + +import ( + "errors" + + "github.com/olebedev/config" + "github.com/rivo/tview" +) + +// WtfAppManager handles the instances of WtfApp, ensuring that they're displayed as requested +type WtfAppManager struct { + WtfApps []*WtfApp + + selected int +} + +// NewAppManager creates and returns an instance of AppManager +func NewAppManager() WtfAppManager { + appMan := WtfAppManager{ + WtfApps: []*WtfApp{}, + } + + return appMan +} + +// MakeNewWtfApp creates and starts a new instance of WtfApp from a set of configuration params +func (appMan *WtfAppManager) MakeNewWtfApp(config *config.Config, configFilePath string) { + wtfApp := NewWtfApp(tview.NewApplication(), config, configFilePath) + appMan.Add(wtfApp) + + wtfApp.Start() +} + +// Add adds a WtfApp to the collection of apps that the AppManager manages. +// This app is then available for display onscreen. +func (appMan *WtfAppManager) Add(wtfApp *WtfApp) { + appMan.WtfApps = append(appMan.WtfApps, wtfApp) +} + +// Current returns the currently-displaying instance of WtfApp +func (appMan *WtfAppManager) Current() (*WtfApp, error) { + if appMan.selected < 0 || appMan.selected >= len(appMan.WtfApps) { + return nil, errors.New("invalid app index selected") + } + + return appMan.WtfApps[appMan.selected], nil +} + +// Next cycles the WtfApps forward by one, making the next one in the list +// the current one. If there are none after the current one, it wraps around. +func (appMan *WtfAppManager) Next() (*WtfApp, error) { + appMan.selected++ + + if appMan.selected >= len(appMan.WtfApps) { + appMan.selected = 0 + } + + return appMan.Current() +} + +// Prev cycles the WtfApps backwards by one, making the previous one in the +// list the current one. If there are none before the current one, it wraps around. +func (appMan *WtfAppManager) Prev() (*WtfApp, error) { + appMan.selected-- + + if appMan.selected < 0 { + appMan.selected = len(appMan.WtfApps) - 1 + } + + return appMan.Current() +} diff --git a/app/exit_message.go b/app/exit_message.go index 6dcd3e05..f68779ff 100644 --- a/app/exit_message.go +++ b/app/exit_message.go @@ -84,14 +84,14 @@ func readGitHubAPIKey(cfg *config.Config) string { func (wtfApp *WtfApp) contributorThankYouMessage() string { str := " On behalf of all the users of WTF, thank you for contributing to the source code." - str += fmt.Sprintf(" %s", aurora.Green("You rock.")) + str += fmt.Sprintf(" %s", aurora.Green("\n\n You rock.")) return str } func (wtfApp *WtfApp) sponsorThankYouMessage() string { str := " Your sponsorship of WTF makes a difference. Thank you for sponsoring and supporting WTF." - str += fmt.Sprintf(" %s", aurora.Green("You're awesome.")) + str += fmt.Sprintf(" %s", aurora.Green("\n\n You're awesome.")) return str } diff --git a/app/focus_tracker.go b/app/focus_tracker.go index 1a2c1c27..75140484 100644 --- a/app/focus_tracker.go +++ b/app/focus_tracker.go @@ -9,6 +9,7 @@ import ( "github.com/wtfutil/wtf/wtf" ) +// FocusState is a custom type that differentiates focusable scopes type FocusState int const ( @@ -20,17 +21,18 @@ const ( // FocusTracker is used by the app to track which onscreen widget currently has focus, // and to move focus between widgets. type FocusTracker struct { - App *tview.Application Idx int IsFocused bool Widgets []wtf.Wtfable - config *config.Config + config *config.Config + tviewApp *tview.Application } -func NewFocusTracker(app *tview.Application, widgets []wtf.Wtfable, config *config.Config) FocusTracker { +// NewFocusTracker creates and returns an instance of FocusTracker +func NewFocusTracker(tviewApp *tview.Application, widgets []wtf.Wtfable, config *config.Config) FocusTracker { focusTracker := FocusTracker{ - App: app, + tviewApp: tviewApp, Idx: -1, IsFocused: false, Widgets: widgets, @@ -45,6 +47,7 @@ func NewFocusTracker(app *tview.Application, widgets []wtf.Wtfable, config *conf /* -------------------- Exported Functions -------------------- */ +// FocusOn puts the focus on the item that belongs to the focus character passed in func (tracker *FocusTracker) FocusOn(char string) bool { if !tracker.useNavShortcuts() { return false @@ -108,6 +111,7 @@ func (tracker *FocusTracker) Prev() { tracker.IsFocused = true } +// Refocus forces the focus back to the currently-selected item func (tracker *FocusTracker) Refocus() { tracker.focus(tracker.Idx) } @@ -196,7 +200,7 @@ func (tracker *FocusTracker) focus(idx int) { widget.CommonSettings().Colors.BorderTheme.Focused, ), ) - tracker.App.SetFocus(view) + tracker.tviewApp.SetFocus(view) } func (tracker *FocusTracker) focusables() []wtf.Wtfable { @@ -239,7 +243,7 @@ func (tracker *FocusTracker) focusState() FocusState { } for _, widget := range tracker.Widgets { - if widget.TextView() == tracker.App.GetFocus() { + if widget.TextView() == tracker.tviewApp.GetFocus() { return widgetFocused } } diff --git a/app/module_validator.go b/app/module_validator.go index cee8bce2..aa20079d 100644 --- a/app/module_validator.go +++ b/app/module_validator.go @@ -9,6 +9,7 @@ import ( "github.com/wtfutil/wtf/wtf" ) +// ModuleValidator is responsible for validating the state of a module's configuration type ModuleValidator struct{} type widgetError struct { @@ -16,6 +17,7 @@ type widgetError struct { validationErrors []cfg.Validatable } +// NewModuleValidator creates and returns an instance of ModuleValidator func NewModuleValidator() *ModuleValidator { return &ModuleValidator{} } diff --git a/app/widget_maker.go b/app/widget_maker.go index fc86484f..784111ec 100644 --- a/app/widget_maker.go +++ b/app/widget_maker.go @@ -80,7 +80,7 @@ import ( // MakeWidget creates and returns instances of widgets func MakeWidget( - app *tview.Application, + tviewApp *tview.Application, pages *tview.Pages, moduleName string, config *config.Config, @@ -103,239 +103,239 @@ func MakeWidget( switch moduleConfig.UString("type", moduleName) { case "arpansagovau": settings := arpansagovau.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = arpansagovau.NewWidget(app, settings) + widget = arpansagovau.NewWidget(tviewApp, settings) case "azuredevops": settings := azuredevops.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = azuredevops.NewWidget(app, pages, settings) + widget = azuredevops.NewWidget(tviewApp, pages, settings) case "bamboohr": settings := bamboohr.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = bamboohr.NewWidget(app, settings) + widget = bamboohr.NewWidget(tviewApp, settings) case "bargraph": settings := bargraph.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = bargraph.NewWidget(app, settings) + widget = bargraph.NewWidget(tviewApp, settings) case "bittrex": settings := bittrex.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = bittrex.NewWidget(app, settings) + widget = bittrex.NewWidget(tviewApp, settings) case "blockfolio": settings := blockfolio.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = blockfolio.NewWidget(app, settings) + widget = blockfolio.NewWidget(tviewApp, settings) case "buildkite": settings := buildkite.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = buildkite.NewWidget(app, pages, settings) + widget = buildkite.NewWidget(tviewApp, pages, settings) case "cdsFavorites": settings := cdsfavorites.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = cdsfavorites.NewWidget(app, pages, settings) + widget = cdsfavorites.NewWidget(tviewApp, pages, settings) case "cdsQueue": settings := cdsqueue.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = cdsqueue.NewWidget(app, pages, settings) + widget = cdsqueue.NewWidget(tviewApp, pages, settings) case "cdsStatus": settings := cdsstatus.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = cdsstatus.NewWidget(app, pages, settings) + widget = cdsstatus.NewWidget(tviewApp, pages, settings) case "circleci": settings := circleci.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = circleci.NewWidget(app, settings) + widget = circleci.NewWidget(tviewApp, settings) case "clocks": settings := clocks.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = clocks.NewWidget(app, settings) + widget = clocks.NewWidget(tviewApp, settings) case "cmdrunner": settings := cmdrunner.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = cmdrunner.NewWidget(app, settings) + widget = cmdrunner.NewWidget(tviewApp, settings) case "cryptolive": settings := cryptolive.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = cryptolive.NewWidget(app, settings) + widget = cryptolive.NewWidget(tviewApp, settings) case "datadog": settings := datadog.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = datadog.NewWidget(app, pages, settings) + widget = datadog.NewWidget(tviewApp, pages, settings) case "devto": settings := devto.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = devto.NewWidget(app, pages, settings) + widget = devto.NewWidget(tviewApp, pages, settings) case "digitalclock": settings := digitalclock.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = digitalclock.NewWidget(app, settings) + widget = digitalclock.NewWidget(tviewApp, settings) case "digitalocean": settings := digitalocean.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = digitalocean.NewWidget(app, pages, settings) + widget = digitalocean.NewWidget(tviewApp, pages, settings) case "docker": settings := docker.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = docker.NewWidget(app, pages, settings) + widget = docker.NewWidget(tviewApp, pages, settings) case "feedreader": settings := feedreader.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = feedreader.NewWidget(app, pages, settings) + widget = feedreader.NewWidget(tviewApp, pages, settings) case "football": settings := football.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = football.NewWidget(app, pages, settings) + widget = football.NewWidget(tviewApp, pages, settings) case "gcal": settings := gcal.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gcal.NewWidget(app, settings) + widget = gcal.NewWidget(tviewApp, settings) case "gerrit": settings := gerrit.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gerrit.NewWidget(app, pages, settings) + widget = gerrit.NewWidget(tviewApp, pages, settings) case "git": settings := git.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = git.NewWidget(app, pages, settings) + widget = git.NewWidget(tviewApp, pages, settings) case "github": settings := github.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = github.NewWidget(app, pages, settings) + widget = github.NewWidget(tviewApp, pages, settings) case "gitlab": settings := gitlab.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gitlab.NewWidget(app, pages, settings) + widget = gitlab.NewWidget(tviewApp, pages, settings) case "gitlabtodo": settings := gitlabtodo.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gitlabtodo.NewWidget(app, pages, settings) + widget = gitlabtodo.NewWidget(tviewApp, pages, settings) case "gitter": settings := gitter.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gitter.NewWidget(app, pages, settings) + widget = gitter.NewWidget(tviewApp, pages, settings) case "googleanalytics": settings := googleanalytics.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = googleanalytics.NewWidget(app, settings) + widget = googleanalytics.NewWidget(tviewApp, settings) case "gspreadsheets": settings := gspreadsheets.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = gspreadsheets.NewWidget(app, settings) + widget = gspreadsheets.NewWidget(tviewApp, settings) case "grafana": settings := grafana.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = grafana.NewWidget(app, pages, settings) + widget = grafana.NewWidget(tviewApp, pages, settings) case "hackernews": settings := hackernews.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = hackernews.NewWidget(app, pages, settings) + widget = hackernews.NewWidget(tviewApp, pages, settings) case "hibp": settings := hibp.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = hibp.NewWidget(app, settings) + widget = hibp.NewWidget(tviewApp, settings) case "ipapi": settings := ipapi.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = ipapi.NewWidget(app, settings) + widget = ipapi.NewWidget(tviewApp, settings) case "ipinfo": settings := ipinfo.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = ipinfo.NewWidget(app, settings) + widget = ipinfo.NewWidget(tviewApp, settings) case "jenkins": settings := jenkins.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = jenkins.NewWidget(app, pages, settings) + widget = jenkins.NewWidget(tviewApp, pages, settings) case "jira": settings := jira.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = jira.NewWidget(app, pages, settings) + widget = jira.NewWidget(tviewApp, pages, settings) case "kubernetes": settings := kubernetes.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = kubernetes.NewWidget(app, settings) + widget = kubernetes.NewWidget(tviewApp, settings) case "krisinformation": settings := krisinformation.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = krisinformation.NewWidget(app, settings) + widget = krisinformation.NewWidget(tviewApp, settings) case "logger": settings := logger.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = logger.NewWidget(app, settings) + widget = logger.NewWidget(tviewApp, settings) case "mercurial": settings := mercurial.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = mercurial.NewWidget(app, pages, settings) + widget = mercurial.NewWidget(tviewApp, pages, settings) case "nbascore": settings := nbascore.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = nbascore.NewWidget(app, pages, settings) + widget = nbascore.NewWidget(tviewApp, pages, settings) case "newrelic": settings := newrelic.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = newrelic.NewWidget(app, pages, settings) + widget = newrelic.NewWidget(tviewApp, pages, settings) case "opsgenie": settings := opsgenie.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = opsgenie.NewWidget(app, settings) + widget = opsgenie.NewWidget(tviewApp, settings) case "pagerduty": settings := pagerduty.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = pagerduty.NewWidget(app, settings) + widget = pagerduty.NewWidget(tviewApp, settings) case "pihole": settings := pihole.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = pihole.NewWidget(app, pages, settings) + widget = pihole.NewWidget(tviewApp, pages, settings) case "power": settings := power.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = power.NewWidget(app, settings) + widget = power.NewWidget(tviewApp, settings) case "prettyweather": settings := prettyweather.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = prettyweather.NewWidget(app, settings) + widget = prettyweather.NewWidget(tviewApp, settings) case "pocket": settings := pocket.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = pocket.NewWidget(app, pages, settings) + widget = pocket.NewWidget(tviewApp, pages, settings) case "resourceusage": settings := resourceusage.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = resourceusage.NewWidget(app, settings) + widget = resourceusage.NewWidget(tviewApp, settings) case "rollbar": settings := rollbar.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = rollbar.NewWidget(app, pages, settings) + widget = rollbar.NewWidget(tviewApp, pages, settings) case "security": settings := security.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = security.NewWidget(app, settings) + widget = security.NewWidget(tviewApp, settings) case "spacex": settings := spacex.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = spacex.NewWidget(app, settings) + widget = spacex.NewWidget(tviewApp, settings) case "spotify": settings := spotify.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = spotify.NewWidget(app, pages, settings) + widget = spotify.NewWidget(tviewApp, pages, settings) case "spotifyweb": settings := spotifyweb.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = spotifyweb.NewWidget(app, pages, settings) + widget = spotifyweb.NewWidget(tviewApp, pages, settings) case "status": settings := status.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = status.NewWidget(app, settings) + widget = status.NewWidget(tviewApp, settings) case "subreddit": settings := subreddit.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = subreddit.NewWidget(app, pages, settings) + widget = subreddit.NewWidget(tviewApp, pages, settings) case "textfile": settings := textfile.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = textfile.NewWidget(app, pages, settings) + widget = textfile.NewWidget(tviewApp, pages, settings) case "todo": settings := todo.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = todo.NewWidget(app, pages, settings) + widget = todo.NewWidget(tviewApp, pages, settings) case "todo_plus": settings := todo_plus.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = todo_plus.NewWidget(app, pages, settings) + widget = todo_plus.NewWidget(tviewApp, pages, settings) case "todoist": settings := todo_plus.FromTodoist(moduleName, moduleConfig, config) - widget = todo_plus.NewWidget(app, pages, settings) + widget = todo_plus.NewWidget(tviewApp, pages, settings) case "transmission": settings := transmission.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = transmission.NewWidget(app, pages, settings) + widget = transmission.NewWidget(tviewApp, pages, settings) case "travisci": settings := travisci.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = travisci.NewWidget(app, pages, settings) + widget = travisci.NewWidget(tviewApp, pages, settings) case "trello": settings := todo_plus.FromTrello(moduleName, moduleConfig, config) - widget = todo_plus.NewWidget(app, pages, settings) + widget = todo_plus.NewWidget(tviewApp, pages, settings) case "twitch": settings := twitch.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = twitch.NewWidget(app, pages, settings) + widget = twitch.NewWidget(tviewApp, pages, settings) case "twitter": settings := twitter.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = twitter.NewWidget(app, pages, settings) + widget = twitter.NewWidget(tviewApp, pages, settings) case "twitterstats": settings := twitterstats.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = twitterstats.NewWidget(app, pages, settings) + widget = twitterstats.NewWidget(tviewApp, pages, settings) case "uptimerobot": settings := uptimerobot.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = uptimerobot.NewWidget(app, pages, settings) + widget = uptimerobot.NewWidget(tviewApp, pages, settings) case "victorops": settings := victorops.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = victorops.NewWidget(app, settings) + widget = victorops.NewWidget(tviewApp, settings) case "weather": settings := weather.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = weather.NewWidget(app, pages, settings) + widget = weather.NewWidget(tviewApp, pages, settings) case "zendesk": settings := zendesk.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = zendesk.NewWidget(app, pages, settings) + widget = zendesk.NewWidget(tviewApp, pages, settings) case "exchangerates": settings := exchangerates.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = exchangerates.NewWidget(app, pages, settings) + widget = exchangerates.NewWidget(tviewApp, pages, settings) case "finnhub": settings := finnhub.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = finnhub.NewWidget(app, settings) + widget = finnhub.NewWidget(tviewApp, settings) default: settings := unknown.NewSettingsFromYAML(moduleName, moduleConfig, config) - widget = unknown.NewWidget(app, settings) + widget = unknown.NewWidget(tviewApp, settings) } return widget } // MakeWidgets creates and returns a collection of enabled widgets -func MakeWidgets(app *tview.Application, pages *tview.Pages, config *config.Config) []wtf.Wtfable { +func MakeWidgets(tviewApp *tview.Application, pages *tview.Pages, config *config.Config) []wtf.Wtfable { widgets := []wtf.Wtfable{} moduleNames, _ := config.Map("wtf.mods") for moduleName := range moduleNames { - widget := MakeWidget(app, pages, moduleName, config) + widget := MakeWidget(tviewApp, pages, moduleName, config) if widget != nil { widgets = append(widgets, widget) diff --git a/app/wtf_app.go b/app/wtf_app.go index 53e5c96b..67bb3ff9 100644 --- a/app/wtf_app.go +++ b/app/wtf_app.go @@ -1,11 +1,14 @@ package app import ( + "fmt" "log" + "os" "time" "github.com/gdamore/tcell" _ "github.com/gdamore/tcell/terminfo/extended" + "github.com/logrusorgru/aurora" "github.com/olebedev/config" "github.com/radovskyb/watcher" "github.com/rivo/tview" @@ -18,7 +21,8 @@ import ( // WtfApp is the container for a collection of widgets that are all constructed from a single // configuration file and displayed together type WtfApp struct { - app *tview.Application + TViewApp *tview.Application + config *config.Config configFilePath string display *Display @@ -30,32 +34,29 @@ type WtfApp struct { } // NewWtfApp creates and returns an instance of WtfApp -func NewWtfApp(app *tview.Application, config *config.Config, configFilePath string) *WtfApp { - wtfApp := WtfApp{ - app: app, +func NewWtfApp(tviewApp *tview.Application, config *config.Config, configFilePath string) *WtfApp { + wtfApp := &WtfApp{ + TViewApp: tviewApp, + config: config, configFilePath: configFilePath, pages: tview.NewPages(), } - wtfApp.app.SetBeforeDrawFunc(func(s tcell.Screen) bool { + wtfApp.TViewApp.SetBeforeDrawFunc(func(s tcell.Screen) bool { s.Clear() return false }) - wtfApp.app.SetInputCapture(wtfApp.keyboardIntercept) - - wtfApp.widgets = MakeWidgets(wtfApp.app, wtfApp.pages, wtfApp.config) + wtfApp.widgets = MakeWidgets(wtfApp.TViewApp, wtfApp.pages, wtfApp.config) wtfApp.display = NewDisplay(wtfApp.widgets, wtfApp.config) - wtfApp.focusTracker = NewFocusTracker(wtfApp.app, wtfApp.widgets, wtfApp.config) + wtfApp.focusTracker = NewFocusTracker(wtfApp.TViewApp, wtfApp.widgets, wtfApp.config) + wtfApp.validator = NewModuleValidator() githubAPIKey := readGitHubAPIKey(wtfApp.config) wtfApp.ghUser = support.NewGitHubUser(githubAPIKey) - wtfApp.validator = NewModuleValidator() - wtfApp.pages.AddPage("grid", wtfApp.display.Grid, true, true) - wtfApp.app.SetRoot(wtfApp.pages, true) wtfApp.validator.Validate(wtfApp.widgets) @@ -66,17 +67,28 @@ func NewWtfApp(app *tview.Application, config *config.Config, configFilePath str ), ) - return &wtfApp + wtfApp.TViewApp.SetInputCapture(wtfApp.keyboardIntercept) + wtfApp.TViewApp.SetRoot(wtfApp.pages, true) + + return wtfApp } /* -------------------- Exported Functions -------------------- */ +// Run starts the underlying tview app +func (wtfApp *WtfApp) Run() { + if err := wtfApp.TViewApp.Run(); err != nil { + fmt.Printf("\n%s %v\n", aurora.Red("ERROR"), err) + os.Exit(1) + } +} + // Start initializes the app func (wtfApp *WtfApp) Start() { go wtfApp.scheduleWidgets() - go wtfApp.watchForConfigChanges() + // FIXME: This should be moved to the AppManager go func() { _ = wtfApp.ghUser.Load() }() } @@ -98,11 +110,16 @@ func (wtfApp *WtfApp) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyCtrlC: wtfApp.Stop() - wtfApp.app.Stop() + wtfApp.TViewApp.Stop() wtfApp.DisplayExitMessage() case tcell.KeyCtrlR: wtfApp.refreshAllWidgets() return nil + case tcell.KeyCtrlSpace: + // FIXME: This can't reside in the app, the app doesn't know about + // the AppManager. The AppManager needs to catch this one + fmt.Println("Next app") + return nil case tcell.KeyTab: wtfApp.focusTracker.Next() case tcell.KeyBacktab: @@ -154,7 +171,7 @@ func (wtfApp *WtfApp) watchForConfigChanges() { wtfApp.Stop() config := cfg.LoadWtfConfigFile(wtfApp.configFilePath) - newApp := NewWtfApp(wtfApp.app, config, wtfApp.configFilePath) + newApp := NewWtfApp(wtfApp.TViewApp, config, wtfApp.configFilePath) openURLUtil := utils.ToStrs(config.UList("wtf.openUrlUtil", []interface{}{})) utils.Init(config.UString("wtf.openFileUtil", "open"), openURLUtil) diff --git a/generator/textwidget.tpl b/generator/textwidget.tpl index 0ebc2a19..121586e0 100644 --- a/generator/textwidget.tpl +++ b/generator/textwidget.tpl @@ -9,16 +9,14 @@ import ( type Widget struct { view.TextWidget - app *tview.Application settings *Settings } // NewWidget creates and returns an instance of Widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, settings.common), + TextWidget: view.NewTextWidget(tviewApp, settings.common), - app: app, settings: settings, } diff --git a/main.go b/main.go index 314ff711..b95cd667 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,5 @@ package main -// Generators -// To generate the skeleton for a new TextWidget use 'WTF_WIDGET_NAME=MySuperAwesomeWidget go generate -run=text -//go:generate -command text go run generator/textwidget.go -//go:generate text - import ( "fmt" "log" @@ -17,34 +12,20 @@ import ( _ "time/tzdata" "github.com/logrusorgru/aurora" - "github.com/olebedev/config" "github.com/pkg/profile" - "github.com/rivo/tview" "github.com/wtfutil/wtf/app" "github.com/wtfutil/wtf/cfg" "github.com/wtfutil/wtf/flags" "github.com/wtfutil/wtf/utils" + "github.com/wtfutil/wtf/wtf" ) -var tviewApp *tview.Application - var ( date = "dev" version = "dev" ) -/* -------------------- Functions -------------------- */ - -func setTerm(config *config.Config) { - term := config.UString("wtf.term", os.Getenv("TERM")) - err := os.Setenv("TERM", term) - if err != nil { - fmt.Printf("\n%s Failed to set $TERM to %s.\n", aurora.Red("ERROR"), aurora.Yellow(term)) - os.Exit(1) - } -} - /* -------------------- Main -------------------- */ func main() { @@ -54,11 +35,12 @@ func main() { flags := flags.NewFlags() flags.Parse() - hasCustom := flags.HasCustomConfig() - cfg.Initialize(hasCustom) - // Load the configuration file + cfg.Initialize(flags.HasCustomConfig()) config := cfg.LoadWtfConfigFile(flags.ConfigFilePath()) + + wtf.SetTerminal(config) + flags.RenderIf(version, date, config) if flags.Profile { @@ -69,15 +51,15 @@ func main() { openURLUtil := utils.ToStrs(config.UList("wtf.openUrlUtil", []interface{}{})) utils.Init(openFileUtil, openURLUtil) - setTerm(config) + /* Initialize the App Manager */ + appMan := app.NewAppManager() + appMan.MakeNewWtfApp(config, flags.Config) - // Build the application - tviewApp = tview.NewApplication() - wtfApp := app.NewWtfApp(tviewApp, config, flags.Config) - wtfApp.Start() - - if err := tviewApp.Run(); err != nil { + currentApp, err := appMan.Current() + if err != nil { fmt.Printf("\n%s %v\n", aurora.Red("ERROR"), err) os.Exit(1) } + + currentApp.Run() } diff --git a/modules/azuredevops/widget.go b/modules/azuredevops/widget.go index 89ff3dd7..270f20db 100644 --- a/modules/azuredevops/widget.go +++ b/modules/azuredevops/widget.go @@ -19,9 +19,9 @@ type Widget struct { ctx context.Context } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/bamboohr/widget.go b/modules/bamboohr/widget.go index dc42f1ad..4463d461 100644 --- a/modules/bamboohr/widget.go +++ b/modules/bamboohr/widget.go @@ -19,9 +19,9 @@ type Widget struct { items []Item } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/bargraph/widget.go b/modules/bargraph/widget.go index 6eb691f7..3d57f1c0 100644 --- a/modules/bargraph/widget.go +++ b/modules/bargraph/widget.go @@ -17,15 +17,15 @@ import ( type Widget struct { view.BarGraph - app *tview.Application + tviewApp *tview.Application } // NewWidget Make new instance of widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - BarGraph: view.NewBarGraph(app, "Sample Bar Graph", settings.Common), + BarGraph: view.NewBarGraph(tviewApp, "Sample Bar Graph", settings.Common), - app: app, + tviewApp: tviewApp, } widget.View.SetWrap(true) @@ -69,7 +69,7 @@ func (widget *Widget) Refresh() { widget.View.Clear() - widget.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { display(widget) }) diff --git a/modules/buildkite/keyboard.go b/modules/buildkite/keyboard.go index 6f7282e1..7448eeb8 100644 --- a/modules/buildkite/keyboard.go +++ b/modules/buildkite/keyboard.go @@ -1,5 +1,6 @@ package buildkite func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) } diff --git a/modules/buildkite/widget.go b/modules/buildkite/widget.go index 48949226..6fb35634 100644 --- a/modules/buildkite/widget.go +++ b/modules/buildkite/widget.go @@ -15,9 +15,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/cds/favorites/keyboard.go b/modules/cds/favorites/keyboard.go index 1ce418c2..d00a4182 100644 --- a/modules/cds/favorites/keyboard.go +++ b/modules/cds/favorites/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next workflow") diff --git a/modules/cds/favorites/widget.go b/modules/cds/favorites/widget.go index 1da6b9ef..ec3fcc40 100644 --- a/modules/cds/favorites/widget.go +++ b/modules/cds/favorites/widget.go @@ -27,10 +27,10 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "workflow", "workflows"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/cds/queue/keyboard.go b/modules/cds/queue/keyboard.go index 3aeab60b..073eac34 100644 --- a/modules/cds/queue/keyboard.go +++ b/modules/cds/queue/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next workflow") diff --git a/modules/cds/queue/widget.go b/modules/cds/queue/widget.go index 9328c997..23c67b83 100644 --- a/modules/cds/queue/widget.go +++ b/modules/cds/queue/widget.go @@ -27,10 +27,10 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "workflow", "workflows"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/cds/status/keyboard.go b/modules/cds/status/keyboard.go index bf6cb900..ef73235a 100644 --- a/modules/cds/status/keyboard.go +++ b/modules/cds/status/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next line") diff --git a/modules/cds/status/widget.go b/modules/cds/status/widget.go index 2f3223c2..94f8a777 100644 --- a/modules/cds/status/widget.go +++ b/modules/cds/status/widget.go @@ -27,10 +27,10 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "workflow", "workflows"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/circleci/widget.go b/modules/circleci/widget.go index 902fbeac..1fb6a403 100644 --- a/modules/circleci/widget.go +++ b/modules/circleci/widget.go @@ -14,9 +14,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), Client: NewClient(settings.apiKey), settings: settings, diff --git a/modules/clocks/widget.go b/modules/clocks/widget.go index d41316ac..49fd4302 100644 --- a/modules/clocks/widget.go +++ b/modules/clocks/widget.go @@ -8,18 +8,16 @@ import ( type Widget struct { view.TextWidget - app *tview.Application clockColl ClockCollection dateFormat string timeFormat string settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), - app: app, settings: settings, dateFormat: settings.dateFormat, timeFormat: settings.timeFormat, @@ -34,10 +32,8 @@ func NewWidget(app *tview.Application, settings *Settings) *Widget { // Refresh updates the onscreen contents of the widget func (widget *Widget) Refresh() { - widget.app.QueueUpdateDraw(func() { - sortedClocks := widget.clockColl.Sorted(widget.settings.sort) - widget.display(sortedClocks, widget.dateFormat, widget.timeFormat) - }) + sortedClocks := widget.clockColl.Sorted(widget.settings.sort) + widget.display(sortedClocks, widget.dateFormat, widget.timeFormat) } /* -------------------- Unexported Functions -------------------- */ diff --git a/modules/cmdrunner/widget.go b/modules/cmdrunner/widget.go index ccf35a69..dfb3bdaa 100644 --- a/modules/cmdrunner/widget.go +++ b/modules/cmdrunner/widget.go @@ -27,9 +27,9 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, buffer: &bytes.Buffer{}, diff --git a/modules/cryptoexchanges/bittrex/widget.go b/modules/cryptoexchanges/bittrex/widget.go index 2c52fb6a..f3510444 100644 --- a/modules/cryptoexchanges/bittrex/widget.go +++ b/modules/cryptoexchanges/bittrex/widget.go @@ -29,9 +29,9 @@ type Widget struct { } // NewWidget Make new instance of widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, summaryList: summaryList{}, diff --git a/modules/cryptoexchanges/blockfolio/widget.go b/modules/cryptoexchanges/blockfolio/widget.go index 9be63771..e1f2f8af 100644 --- a/modules/cryptoexchanges/blockfolio/widget.go +++ b/modules/cryptoexchanges/blockfolio/widget.go @@ -18,9 +18,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), device_token: settings.deviceToken, settings: settings, diff --git a/modules/cryptoexchanges/cryptolive/widget.go b/modules/cryptoexchanges/cryptolive/widget.go index bc008f6e..1ef76d90 100644 --- a/modules/cryptoexchanges/cryptolive/widget.go +++ b/modules/cryptoexchanges/cryptolive/widget.go @@ -20,9 +20,9 @@ type Widget struct { } // NewWidget Make new instance of widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), priceWidget: price.NewWidget(settings.priceSettings), toplistWidget: toplist.NewWidget(settings.toplistSettings), diff --git a/modules/datadog/keyboard.go b/modules/datadog/keyboard.go index bf0d3f3c..4be97996 100644 --- a/modules/datadog/keyboard.go +++ b/modules/datadog/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/datadog/widget.go b/modules/datadog/widget.go index 3fbf6dcb..09627c21 100644 --- a/modules/datadog/widget.go +++ b/modules/datadog/widget.go @@ -17,9 +17,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/devto/keyboard.go b/modules/devto/keyboard.go index b476d574..e31c0b20 100644 --- a/modules/devto/keyboard.go +++ b/modules/devto/keyboard.go @@ -3,6 +3,7 @@ package devto import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("d", widget.Next, "Select next item") diff --git a/modules/devto/widget.go b/modules/devto/widget.go index cc0e1252..d9b47cc5 100644 --- a/modules/devto/widget.go +++ b/modules/devto/widget.go @@ -19,9 +19,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/digitalclock/widget.go b/modules/digitalclock/widget.go index 6baa055a..ccc64323 100644 --- a/modules/digitalclock/widget.go +++ b/modules/digitalclock/widget.go @@ -9,16 +9,14 @@ import ( type Widget struct { view.TextWidget - app *tview.Application settings *Settings } // NewWidget creates a new widget using settings -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), - app: app, settings: settings, } diff --git a/modules/digitalocean/keyboard.go b/modules/digitalocean/keyboard.go index a33b6c3c..afc6be6d 100644 --- a/modules/digitalocean/keyboard.go +++ b/modules/digitalocean/keyboard.go @@ -3,6 +3,7 @@ package digitalocean import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("?", widget.showInfo, "Show info about the selected droplet") diff --git a/modules/digitalocean/widget.go b/modules/digitalocean/widget.go index 0ac96702..2431b776 100644 --- a/modules/digitalocean/widget.go +++ b/modules/digitalocean/widget.go @@ -42,11 +42,11 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), - app: app, + app: tviewApp, pages: pages, settings: settings, } diff --git a/modules/docker/widget.go b/modules/docker/widget.go index 8eff70d2..dfb6cc12 100644 --- a/modules/docker/widget.go +++ b/modules/docker/widget.go @@ -16,9 +16,9 @@ type Widget struct { displayBuffer string } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/exchangerates/widget.go b/modules/exchangerates/widget.go index 01dbfb6d..e12d5d51 100644 --- a/modules/exchangerates/widget.go +++ b/modules/exchangerates/widget.go @@ -18,9 +18,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/feedreader/keyboard.go b/modules/feedreader/keyboard.go index 928033f7..b7628efc 100644 --- a/modules/feedreader/keyboard.go +++ b/modules/feedreader/keyboard.go @@ -3,6 +3,7 @@ package feedreader import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/feedreader/widget.go b/modules/feedreader/widget.go index 5b934ea6..7a285bd3 100644 --- a/modules/feedreader/widget.go +++ b/modules/feedreader/widget.go @@ -63,9 +63,9 @@ func getShowText(feedItem *FeedItem, showType ShowType) string { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), parser: gofeed.NewParser(), settings: settings, diff --git a/modules/finnhub/widget.go b/modules/finnhub/widget.go index 961144c3..27279ba5 100644 --- a/modules/finnhub/widget.go +++ b/modules/finnhub/widget.go @@ -17,10 +17,10 @@ type Widget struct { } // NewWidget .. -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ Client: NewClient(settings.symbols, settings.apiKey), - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/football/widget.go b/modules/football/widget.go index 52ee6ac5..ccb616f8 100644 --- a/modules/football/widget.go +++ b/modules/football/widget.go @@ -36,7 +36,7 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { var widget Widget leagueId, err := getLeague(settings.league) @@ -51,7 +51,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * } widget = Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), Client: NewClient(settings.apiKey), League: leagueId, settings: settings, diff --git a/modules/gcal/widget.go b/modules/gcal/widget.go index c551cf6e..c2218ebb 100644 --- a/modules/gcal/widget.go +++ b/modules/gcal/widget.go @@ -8,17 +8,17 @@ import ( type Widget struct { view.TextWidget - app *tview.Application calEvents []*CalEvent - settings *Settings err error + settings *Settings + tviewApp *tview.Application } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), - app: app, + tviewApp: tviewApp, settings: settings, } @@ -37,7 +37,7 @@ func (widget *Widget) Refresh() { return } - widget.app.Suspend(widget.authenticate) + widget.tviewApp.Suspend(widget.authenticate) widget.Refresh() } diff --git a/modules/gerrit/keyboard.go b/modules/gerrit/keyboard.go index 50c13ffe..ffc22b51 100644 --- a/modules/gerrit/keyboard.go +++ b/modules/gerrit/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("h", widget.prevProject, "Select previous project") diff --git a/modules/gerrit/widget.go b/modules/gerrit/widget.go index 50525d95..664b1d36 100644 --- a/modules/gerrit/widget.go +++ b/modules/gerrit/widget.go @@ -29,9 +29,9 @@ var ( GerritURLPattern = regexp.MustCompile(`^(http|https)://(.*)$`) ) -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), Idx: 0, diff --git a/modules/git/keyboard.go b/modules/git/keyboard.go index 65092e34..74d7158e 100644 --- a/modules/git/keyboard.go +++ b/modules/git/keyboard.go @@ -3,6 +3,7 @@ package git import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("l", widget.NextSource, "Select next source") diff --git a/modules/git/widget.go b/modules/git/widget.go index e9b9920c..5e0a9c66 100644 --- a/modules/git/widget.go +++ b/modules/git/widget.go @@ -23,17 +23,17 @@ type Widget struct { GitRepos []*GitRepo - app *tview.Application pages *tview.Pages settings *Settings + tviewApp *tview.Application } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "repository", "repositories"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), - app: app, + tviewApp: tviewApp, pages: pages, settings: settings, } @@ -55,7 +55,7 @@ func (widget *Widget) Checkout() { repoToCheckout := widget.GitRepos[widget.Idx] repoToCheckout.checkout(text) widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() widget.Refresh() } @@ -93,7 +93,7 @@ func (widget *Widget) addButtons(form *tview.Form, checkoutFctn func()) { func (widget *Widget) addCancelButton(form *tview.Form) { cancelFn := func() { widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() } @@ -102,10 +102,10 @@ func (widget *Widget) addCancelButton(form *tview.Form) { } func (widget *Widget) modalFocus(form *tview.Form) { - widget.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { frame := widget.modalFrame(form) widget.pages.AddPage("modal", frame, false, true) - widget.app.SetFocus(frame) + widget.tviewApp.SetFocus(frame) }) } diff --git a/modules/github/keyboard.go b/modules/github/keyboard.go index 13aec5f6..4df85459 100644 --- a/modules/github/keyboard.go +++ b/modules/github/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/github/widget.go b/modules/github/widget.go index 14ec6f62..a6948197 100644 --- a/modules/github/widget.go +++ b/modules/github/widget.go @@ -23,10 +23,10 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "repository", "repositories"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/gitlab/keyboard.go b/modules/gitlab/keyboard.go index 0bbee06c..08d88d3a 100644 --- a/modules/gitlab/keyboard.go +++ b/modules/gitlab/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/gitlab/widget.go b/modules/gitlab/widget.go index fe2cec74..60023322 100644 --- a/modules/gitlab/widget.go +++ b/modules/gitlab/widget.go @@ -29,12 +29,12 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { context, err := newContext(settings) widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "repository", "repositories"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), context: context, settings: settings, diff --git a/modules/gitlabtodo/keyboard.go b/modules/gitlabtodo/keyboard.go index e6507d92..fe14deff 100644 --- a/modules/gitlabtodo/keyboard.go +++ b/modules/gitlabtodo/keyboard.go @@ -3,8 +3,9 @@ package gitlabtodo import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { - widget.SetKeyboardChar("/", widget.ShowHelp, "Show/hide this help widget") - widget.SetKeyboardChar("r", widget.Refresh, "Refresh widget") + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) + widget.InitializeRefreshKeyboardControl(widget.Refresh) + widget.SetKeyboardChar("j", widget.Next, "Select next item") widget.SetKeyboardChar("k", widget.Prev, "Select previous item") widget.SetKeyboardChar("o", widget.openTodo, "Open todo in browser") diff --git a/modules/gitlabtodo/widget.go b/modules/gitlabtodo/widget.go index 8de387be..7800bf13 100644 --- a/modules/gitlabtodo/widget.go +++ b/modules/gitlabtodo/widget.go @@ -18,9 +18,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/gitter/keyboard.go b/modules/gitter/keyboard.go index 39607c4e..93e9544a 100644 --- a/modules/gitter/keyboard.go +++ b/modules/gitter/keyboard.go @@ -3,6 +3,7 @@ package gitter import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/gitter/widget.go b/modules/gitter/widget.go index 702fc32e..4a74869a 100644 --- a/modules/gitter/widget.go +++ b/modules/gitter/widget.go @@ -17,9 +17,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/googleanalytics/widget.go b/modules/googleanalytics/widget.go index a759bd62..3bd619ae 100644 --- a/modules/googleanalytics/widget.go +++ b/modules/googleanalytics/widget.go @@ -11,9 +11,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/grafana/widget.go b/modules/grafana/widget.go index e122d7ab..c0639095 100644 --- a/modules/grafana/widget.go +++ b/modules/grafana/widget.go @@ -20,9 +20,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), Client: NewClient(settings), Selected: -1, diff --git a/modules/gspreadsheets/widget.go b/modules/gspreadsheets/widget.go index 3ff295a3..4c68abad 100644 --- a/modules/gspreadsheets/widget.go +++ b/modules/gspreadsheets/widget.go @@ -17,9 +17,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/hackernews/keyboard.go b/modules/hackernews/keyboard.go index bb572599..7dfc554e 100644 --- a/modules/hackernews/keyboard.go +++ b/modules/hackernews/keyboard.go @@ -3,6 +3,7 @@ package hackernews import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/hackernews/widget.go b/modules/hackernews/widget.go index 918430b3..29446ac6 100644 --- a/modules/hackernews/widget.go +++ b/modules/hackernews/widget.go @@ -18,9 +18,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/hibp/widget.go b/modules/hibp/widget.go index 9cf6bfaf..86d2635a 100644 --- a/modules/hibp/widget.go +++ b/modules/hibp/widget.go @@ -17,9 +17,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := &Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/ipaddresses/ipapi/widget.go b/modules/ipaddresses/ipapi/widget.go index 89a58368..f27a9ac5 100644 --- a/modules/ipaddresses/ipapi/widget.go +++ b/modules/ipaddresses/ipapi/widget.go @@ -36,9 +36,9 @@ type ipinfo struct { } // NewWidget constructor -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/ipaddresses/ipinfo/widget.go b/modules/ipaddresses/ipinfo/widget.go index 86f4cbd9..4c167078 100644 --- a/modules/ipaddresses/ipinfo/widget.go +++ b/modules/ipaddresses/ipinfo/widget.go @@ -30,9 +30,9 @@ type ipinfo struct { Organization string `json:"org"` } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/jenkins/keyboard.go b/modules/jenkins/keyboard.go index 9aa3155d..61a44ed0 100644 --- a/modules/jenkins/keyboard.go +++ b/modules/jenkins/keyboard.go @@ -3,6 +3,7 @@ package jenkins import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/jenkins/widget.go b/modules/jenkins/widget.go index e49c4c5a..f2c019df 100644 --- a/modules/jenkins/widget.go +++ b/modules/jenkins/widget.go @@ -17,9 +17,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/jira/keyboard.go b/modules/jira/keyboard.go index dcbf9b67..016617f1 100644 --- a/modules/jira/keyboard.go +++ b/modules/jira/keyboard.go @@ -5,6 +5,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/jira/widget.go b/modules/jira/widget.go index 7c7dd9e3..0f046815 100644 --- a/modules/jira/widget.go +++ b/modules/jira/widget.go @@ -16,9 +16,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/kubernetes/widget.go b/modules/kubernetes/widget.go index 08e37a29..55ad9700 100644 --- a/modules/kubernetes/widget.go +++ b/modules/kubernetes/widget.go @@ -23,9 +23,9 @@ type Widget struct { } // NewWidget creates a new instance of the widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), objects: settings.objects, title: settings.title, diff --git a/modules/logger/widget.go b/modules/logger/widget.go index ea0fdd25..bced4663 100644 --- a/modules/logger/widget.go +++ b/modules/logger/widget.go @@ -17,16 +17,14 @@ const ( type Widget struct { view.TextWidget - app *tview.Application filePath string settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), - app: app, filePath: log.LogFilePath(), settings: settings, } diff --git a/modules/mercurial/keyboard.go b/modules/mercurial/keyboard.go index daa9b5a9..19d7d836 100644 --- a/modules/mercurial/keyboard.go +++ b/modules/mercurial/keyboard.go @@ -3,6 +3,7 @@ package mercurial import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("l", widget.NextSource, "Select next source") diff --git a/modules/mercurial/widget.go b/modules/mercurial/widget.go index 74c3c688..89c636d2 100644 --- a/modules/mercurial/widget.go +++ b/modules/mercurial/widget.go @@ -18,19 +18,19 @@ type Widget struct { view.MultiSourceWidget view.TextWidget - app *tview.Application Data []*MercurialRepo pages *tview.Pages settings *Settings + tviewApp *tview.Application } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "repository", "repositories"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), - app: app, + tviewApp: tviewApp, pages: pages, settings: settings, } @@ -52,7 +52,7 @@ func (widget *Widget) Checkout() { repoToCheckout := widget.Data[widget.Idx] repoToCheckout.checkout(text) widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() @@ -91,7 +91,7 @@ func (widget *Widget) addButtons(form *tview.Form, checkoutFctn func()) { func (widget *Widget) addCancelButton(form *tview.Form) { cancelFn := func() { widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() } @@ -100,10 +100,10 @@ func (widget *Widget) addCancelButton(form *tview.Form) { } func (widget *Widget) modalFocus(form *tview.Form) { - widget.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { frame := widget.modalFrame(form) widget.pages.AddPage("modal", frame, false, true) - widget.app.SetFocus(frame) + widget.tviewApp.SetFocus(frame) }) } diff --git a/modules/nbascore/keyboard.go b/modules/nbascore/keyboard.go index 47f8d32f..9e8c7b03 100644 --- a/modules/nbascore/keyboard.go +++ b/modules/nbascore/keyboard.go @@ -3,6 +3,7 @@ package nbascore import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("l", widget.next, "Select next item") diff --git a/modules/nbascore/widget.go b/modules/nbascore/widget.go index 215510b9..0d3e6fbc 100644 --- a/modules/nbascore/widget.go +++ b/modules/nbascore/widget.go @@ -24,9 +24,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/newrelic/widget.go b/modules/newrelic/widget.go index 75b8bbf6..4080ee16 100644 --- a/modules/newrelic/widget.go +++ b/modules/newrelic/widget.go @@ -17,10 +17,10 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "applicationID", "applicationIDs"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/opsgenie/widget.go b/modules/opsgenie/widget.go index f389fbed..11746b2b 100644 --- a/modules/opsgenie/widget.go +++ b/modules/opsgenie/widget.go @@ -15,9 +15,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/pagerduty/widget.go b/modules/pagerduty/widget.go index bbac2d1b..e657956d 100644 --- a/modules/pagerduty/widget.go +++ b/modules/pagerduty/widget.go @@ -23,9 +23,9 @@ type Widget struct { } // NewWidget creates and returns an instance of PagerDuty widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/pihole/keyboard.go b/modules/pihole/keyboard.go index 0d61e141..87147849 100644 --- a/modules/pihole/keyboard.go +++ b/modules/pihole/keyboard.go @@ -1,6 +1,7 @@ package pihole func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("d", widget.disable, "disable Pi-hole") diff --git a/modules/pihole/widget.go b/modules/pihole/widget.go index 64a4dd3c..1211caa2 100644 --- a/modules/pihole/widget.go +++ b/modules/pihole/widget.go @@ -15,10 +15,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -//func NewWidget(app *tview.Application, settings *Settings) *Widget { -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/pocket/keyboard.go b/modules/pocket/keyboard.go index b51a0226..4c8af590 100644 --- a/modules/pocket/keyboard.go +++ b/modules/pocket/keyboard.go @@ -3,6 +3,7 @@ package pocket import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("a", widget.toggleLink, "Toggle Link") diff --git a/modules/pocket/widget.go b/modules/pocket/widget.go index 4bb79437..050cb751 100644 --- a/modules/pocket/widget.go +++ b/modules/pocket/widget.go @@ -21,9 +21,9 @@ type Widget struct { archivedView bool } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, nil, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, nil, settings.Common), settings: settings, client: NewClient(settings.consumerKey, "http://localhost"), archivedView: false, diff --git a/modules/power/widget.go b/modules/power/widget.go index 8e7c093a..3fbfe536 100644 --- a/modules/power/widget.go +++ b/modules/power/widget.go @@ -15,9 +15,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), Battery: NewBattery(), diff --git a/modules/resourceusage/widget.go b/modules/resourceusage/widget.go index a3ac69a6..23d9fdf9 100644 --- a/modules/resourceusage/widget.go +++ b/modules/resourceusage/widget.go @@ -14,18 +14,17 @@ import ( // Widget define wtf widget to register widget later type Widget struct { - view.BarGraph - - app *tview.Application settings *Settings + tviewApp *tview.Application + view.BarGraph } // NewWidget Make new instance of widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - BarGraph: view.NewBarGraph(app, settings.Name, settings.Common), + BarGraph: view.NewBarGraph(tviewApp, settings.Name, settings.Common), - app: app, + tviewApp: tviewApp, settings: settings, } @@ -131,7 +130,7 @@ func (widget *Widget) Refresh() { return } - widget.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { widget.View.Clear() display(widget) }) diff --git a/modules/rollbar/keyboard.go b/modules/rollbar/keyboard.go index 2d4c5a5a..409c12c1 100644 --- a/modules/rollbar/keyboard.go +++ b/modules/rollbar/keyboard.go @@ -3,6 +3,7 @@ package rollbar import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/rollbar/widget.go b/modules/rollbar/widget.go index b4e9d535..b3448264 100644 --- a/modules/rollbar/widget.go +++ b/modules/rollbar/widget.go @@ -18,9 +18,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/security/widget.go b/modules/security/widget.go index 7c90b1f9..9ed832cc 100644 --- a/modules/security/widget.go +++ b/modules/security/widget.go @@ -14,9 +14,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/spacex/widget.go b/modules/spacex/widget.go index 0be388f6..4a90a7ae 100644 --- a/modules/spacex/widget.go +++ b/modules/spacex/widget.go @@ -15,9 +15,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := &Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } return widget diff --git a/modules/spotify/keyboard.go b/modules/spotify/keyboard.go index 70f105cb..d7db4d0c 100644 --- a/modules/spotify/keyboard.go +++ b/modules/spotify/keyboard.go @@ -7,6 +7,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("l", widget.next, "Select next item") diff --git a/modules/spotify/widget.go b/modules/spotify/widget.go index 99e13677..c2253da5 100644 --- a/modules/spotify/widget.go +++ b/modules/spotify/widget.go @@ -19,9 +19,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), Info: spotigopher.Info{}, client: spotigopher.NewClient(), diff --git a/modules/spotifyweb/keyboard.go b/modules/spotifyweb/keyboard.go index 7cf7610e..dd31066d 100644 --- a/modules/spotifyweb/keyboard.go +++ b/modules/spotifyweb/keyboard.go @@ -7,6 +7,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("h", widget.selectPrevious, "Select previous item") diff --git a/modules/spotifyweb/widget.go b/modules/spotifyweb/widget.go index 24243644..6c5add0a 100644 --- a/modules/spotifyweb/widget.go +++ b/modules/spotifyweb/widget.go @@ -60,7 +60,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) { } // NewWidget creates a new widget for WTF -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { redirectURI = "http://localhost:" + settings.callbackPort + "/callback" auth = spotify.NewAuthenticator(redirectURI, spotify.ScopeUserReadCurrentlyPlaying, spotify.ScopeUserReadPlaybackState, spotify.ScopeUserModifyPlaybackState) @@ -71,7 +71,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * var playerState *spotify.PlayerState widget := Widget{ - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), Info: Info{}, diff --git a/modules/status/widget.go b/modules/status/widget.go index 7c8a193f..7bc58f29 100644 --- a/modules/status/widget.go +++ b/modules/status/widget.go @@ -13,9 +13,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), CurrentIcon: 0, diff --git a/modules/subreddit/keyboard.go b/modules/subreddit/keyboard.go index ee5ab9f3..e31601aa 100644 --- a/modules/subreddit/keyboard.go +++ b/modules/subreddit/keyboard.go @@ -3,6 +3,7 @@ package subreddit import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/subreddit/widget.go b/modules/subreddit/widget.go index 6254d04d..4841208e 100644 --- a/modules/subreddit/widget.go +++ b/modules/subreddit/widget.go @@ -16,9 +16,9 @@ type Widget struct { links []Link } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/system/widget.go b/modules/system/widget.go index fb934a43..44027769 100644 --- a/modules/system/widget.go +++ b/modules/system/widget.go @@ -19,9 +19,9 @@ type Widget struct { systemInfo *SystemInfo } -func NewWidget(app *tview.Application, date, version string, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, date, version string, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), Date: date, diff --git a/modules/textfile/keyboard.go b/modules/textfile/keyboard.go index 08654947..70d537ff 100644 --- a/modules/textfile/keyboard.go +++ b/modules/textfile/keyboard.go @@ -6,6 +6,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(nil) widget.SetKeyboardChar("l", widget.NextSource, "Select next file") diff --git a/modules/textfile/widget.go b/modules/textfile/widget.go index 169c2f78..b25fd9cc 100644 --- a/modules/textfile/widget.go +++ b/modules/textfile/widget.go @@ -29,10 +29,10 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "filePath", "filePaths"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/todo/keyboard.go b/modules/todo/keyboard.go index ec132d25..87727696 100644 --- a/modules/todo/keyboard.go +++ b/modules/todo/keyboard.go @@ -9,6 +9,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/todo/widget.go b/modules/todo/widget.go index 6e894ac0..cccbff83 100644 --- a/modules/todo/widget.go +++ b/modules/todo/widget.go @@ -22,21 +22,20 @@ const ( // A Widget represents a Todo widget type Widget struct { - view.ScrollableWidget - - app *tview.Application filePath string list checklist.Checklist pages *tview.Pages settings *Settings + tviewApp *tview.Application + view.ScrollableWidget } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), - app: app, + tviewApp: tviewApp, settings: settings, filePath: settings.filePath, list: checklist.NewChecklist(settings.Sigils.Checkbox.Checked, settings.Sigils.Checkbox.Unchecked), @@ -117,15 +116,15 @@ func (widget *Widget) newItem() { widget.SetItemCount(len(widget.list.Items)) widget.persist() widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() } widget.addButtons(form, saveFctn) widget.modalFocus(form) - widget.app.QueueUpdate(func() { - widget.app.Draw() + widget.tviewApp.QueueUpdate(func() { + widget.tviewApp.Draw() }) } @@ -166,15 +165,15 @@ func (widget *Widget) updateSelected() { widget.updateSelectedItem(text) widget.persist() widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() } widget.addButtons(form, saveFctn) widget.modalFocus(form) - widget.app.QueueUpdate(func() { - widget.app.Draw() + widget.tviewApp.QueueUpdate(func() { + widget.tviewApp.Draw() }) } @@ -198,7 +197,7 @@ func (widget *Widget) addButtons(form *tview.Form, saveFctn func()) { func (widget *Widget) addCancelButton(form *tview.Form) { cancelFn := func() { widget.pages.RemovePage("modal") - widget.app.SetFocus(widget.View) + widget.tviewApp.SetFocus(widget.View) widget.display() } @@ -211,10 +210,10 @@ func (widget *Widget) addSaveButton(form *tview.Form, fctn func()) { } func (widget *Widget) modalFocus(form *tview.Form) { - widget.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { frame := widget.modalFrame(form) widget.pages.AddPage("modal", frame, false, true) - widget.app.SetFocus(frame) + widget.tviewApp.SetFocus(frame) }) } diff --git a/modules/todo_plus/keyboard.go b/modules/todo_plus/keyboard.go index f1922c26..66ab0059 100644 --- a/modules/todo_plus/keyboard.go +++ b/modules/todo_plus/keyboard.go @@ -3,6 +3,7 @@ package todo_plus import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("d", widget.Delete, "Delete item") diff --git a/modules/todo_plus/widget.go b/modules/todo_plus/widget.go index 7796af12..bb260333 100644 --- a/modules/todo_plus/widget.go +++ b/modules/todo_plus/widget.go @@ -19,10 +19,10 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "project", "projects"), - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/transmission/keyboard.go b/modules/transmission/keyboard.go index 0bd69b4f..1690b526 100644 --- a/modules/transmission/keyboard.go +++ b/modules/transmission/keyboard.go @@ -3,6 +3,7 @@ package transmission import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(nil) widget.SetKeyboardChar("j", widget.Prev, "Select previous item") diff --git a/modules/transmission/widget.go b/modules/transmission/widget.go index 4a68e528..a33935a9 100644 --- a/modules/transmission/widget.go +++ b/modules/transmission/widget.go @@ -21,9 +21,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/travisci/keyboard.go b/modules/travisci/keyboard.go index 0ada9d68..0a9e735e 100644 --- a/modules/travisci/keyboard.go +++ b/modules/travisci/keyboard.go @@ -3,6 +3,7 @@ package travisci import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/travisci/widget.go b/modules/travisci/widget.go index 74b7dba7..0872f974 100644 --- a/modules/travisci/widget.go +++ b/modules/travisci/widget.go @@ -17,9 +17,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/twitch/keyboard.go b/modules/twitch/keyboard.go index 7f3e11a1..36a2d88a 100644 --- a/modules/twitch/keyboard.go +++ b/modules/twitch/keyboard.go @@ -3,6 +3,7 @@ package twitch import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/twitch/widget.go b/modules/twitch/widget.go index 1a3b980a..54000ff1 100644 --- a/modules/twitch/widget.go +++ b/modules/twitch/widget.go @@ -27,9 +27,9 @@ type Stream struct { Title string } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, twitch: NewClient(settings.clientId), } diff --git a/modules/twitter/keyboard.go b/modules/twitter/keyboard.go index a6142b1e..908be09e 100644 --- a/modules/twitter/keyboard.go +++ b/modules/twitter/keyboard.go @@ -6,6 +6,7 @@ import ( ) func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("l", widget.NextSource, "Select next source") diff --git a/modules/twitter/widget.go b/modules/twitter/widget.go index bbe029d3..97a4fcef 100644 --- a/modules/twitter/widget.go +++ b/modules/twitter/widget.go @@ -20,10 +20,10 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "screenName", "screenNames"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), idx: 0, settings: settings, diff --git a/modules/twitterstats/widget.go b/modules/twitterstats/widget.go index f1e8ff81..b8c5d659 100644 --- a/modules/twitterstats/widget.go +++ b/modules/twitterstats/widget.go @@ -14,9 +14,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), client: NewClient(settings), settings: settings, diff --git a/modules/unknown/widget.go b/modules/unknown/widget.go index 3446c708..88fb00f1 100644 --- a/modules/unknown/widget.go +++ b/modules/unknown/widget.go @@ -13,9 +13,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/uptimerobot/keyboard.go b/modules/uptimerobot/keyboard.go index 483a4ef2..57293de3 100644 --- a/modules/uptimerobot/keyboard.go +++ b/modules/uptimerobot/keyboard.go @@ -1,6 +1,6 @@ package uptimerobot func (widget *Widget) initializeKeyboardControls() { - widget.SetKeyboardChar("/", widget.ShowHelp, "Show/hide this help widget") - widget.SetKeyboardChar("r", widget.Refresh, "Refresh widget") + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) + widget.InitializeRefreshKeyboardControl(widget.Refresh) } diff --git a/modules/uptimerobot/widget.go b/modules/uptimerobot/widget.go index 832e1b41..9d3d4266 100644 --- a/modules/uptimerobot/widget.go +++ b/modules/uptimerobot/widget.go @@ -21,9 +21,9 @@ type Widget struct { err error } -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := &Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/modules/victorops/widget.go b/modules/victorops/widget.go index 9b7e53b4..c6624c7f 100644 --- a/modules/victorops/widget.go +++ b/modules/victorops/widget.go @@ -17,9 +17,9 @@ type Widget struct { } // NewWidget creates a new widget -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/weatherservices/arpansagovau/widget.go b/modules/weatherservices/arpansagovau/widget.go index 26a0aa8e..2251329d 100644 --- a/modules/weatherservices/arpansagovau/widget.go +++ b/modules/weatherservices/arpansagovau/widget.go @@ -15,10 +15,10 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { locationData, err := GetLocationData(settings.city) widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), location: locationData, lastError: err, diff --git a/modules/weatherservices/prettyweather/widget.go b/modules/weatherservices/prettyweather/widget.go index 306ab4e5..fa067468 100644 --- a/modules/weatherservices/prettyweather/widget.go +++ b/modules/weatherservices/prettyweather/widget.go @@ -17,9 +17,9 @@ type Widget struct { settings *Settings } -func NewWidget(app *tview.Application, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: view.NewTextWidget(app, nil, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, nil, settings.Common), settings: settings, } diff --git a/modules/weatherservices/weather/keyboard.go b/modules/weatherservices/weather/keyboard.go index bfa8fe75..0dcfb463 100644 --- a/modules/weatherservices/weather/keyboard.go +++ b/modules/weatherservices/weather/keyboard.go @@ -3,6 +3,7 @@ package weather import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("h", widget.PrevSource, "Select previous city") diff --git a/modules/weatherservices/weather/widget.go b/modules/weatherservices/weather/widget.go index ab2ae924..37fe6eab 100644 --- a/modules/weatherservices/weather/widget.go +++ b/modules/weatherservices/weather/widget.go @@ -20,10 +20,10 @@ type Widget struct { } // NewWidget creates and returns a new instance of the weather Widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ MultiSourceWidget: view.NewMultiSourceWidget(settings.Common, "cityid", "cityids"), - TextWidget: view.NewTextWidget(app, pages, settings.Common), + TextWidget: view.NewTextWidget(tviewApp, pages, settings.Common), pages: pages, settings: settings, diff --git a/modules/zendesk/keyboard.go b/modules/zendesk/keyboard.go index 2c561181..5ab69962 100644 --- a/modules/zendesk/keyboard.go +++ b/modules/zendesk/keyboard.go @@ -3,6 +3,7 @@ package zendesk import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { + widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) widget.InitializeRefreshKeyboardControl(widget.Refresh) widget.SetKeyboardChar("j", widget.Next, "Select next item") diff --git a/modules/zendesk/widget.go b/modules/zendesk/widget.go index a43c68f0..a6c0c78e 100644 --- a/modules/zendesk/widget.go +++ b/modules/zendesk/widget.go @@ -18,9 +18,9 @@ type Widget struct { } // NewWidget creates a new instance of a widget -func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { +func NewWidget(tviewApp *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ - ScrollableWidget: view.NewScrollableWidget(app, pages, settings.Common), + ScrollableWidget: view.NewScrollableWidget(tviewApp, pages, settings.Common), settings: settings, } diff --git a/view/bargraph.go b/view/bargraph.go index 49df2431..58b10c43 100644 --- a/view/bargraph.go +++ b/view/bargraph.go @@ -30,10 +30,10 @@ type Bar struct { } // NewBarGraph creates and returns an instance of BarGraph -func NewBarGraph(app *tview.Application, name string, commonSettings *cfg.Common) BarGraph { +func NewBarGraph(tviewApp *tview.Application, name string, commonSettings *cfg.Common) BarGraph { widget := BarGraph{ - Base: NewBase(app, commonSettings), - KeyboardWidget: NewKeyboardWidget(app, nil, commonSettings), + Base: NewBase(tviewApp, nil, commonSettings), + KeyboardWidget: NewKeyboardWidget(commonSettings), maxStars: commonSettings.Config.UInt("graphStars", 20), starChar: commonSettings.Config.UString("graphIcon", "|"), diff --git a/view/base.go b/view/base.go index 919c557c..6550be82 100644 --- a/view/base.go +++ b/view/base.go @@ -10,35 +10,39 @@ import ( ) type Base struct { - app *tview.Application bordered bool commonSettings *cfg.Common enabled bool + enabledMutex *sync.Mutex focusChar string focusable bool + helpTextFunc func() string name string + pages *tview.Pages quitChan chan bool - refreshing bool refreshInterval int - enabledMutex *sync.Mutex + refreshing bool + tviewApp *tview.Application + view *tview.TextView } // NewBase creates and returns an instance of the Base module, the lowest-level // primitive module from which all others are derived -func NewBase(app *tview.Application, commonSettings *cfg.Common) *Base { +func NewBase(tviewApp *tview.Application, pages *tview.Pages, commonSettings *cfg.Common) *Base { base := &Base{ commonSettings: commonSettings, - app: app, bordered: commonSettings.Bordered, enabled: commonSettings.Enabled, enabledMutex: &sync.Mutex{}, focusChar: commonSettings.FocusChar(), focusable: commonSettings.Focusable, name: commonSettings.Name, + pages: pages, quitChan: make(chan bool), refreshInterval: commonSettings.RefreshInterval, refreshing: false, + tviewApp: tviewApp, } return base @@ -134,6 +138,32 @@ func (base *Base) SetFocusChar(char string) { base.focusChar = char } +// SetView assigns the passed-in tview.TextView view to this widget +func (base *Base) SetView(view *tview.TextView) { + base.view = view +} + +// ShowHelp displays the modal help dialog for a module +func (base *Base) ShowHelp() { + if base.pages == nil { + return + } + + closeFunc := func() { + base.pages.RemovePage("help") + base.tviewApp.SetFocus(base.view) + } + + modal := NewBillboardModal(base.helpTextFunc(), closeFunc) + + base.pages.AddPage("help", modal, false, true) + base.tviewApp.SetFocus(modal) + + base.tviewApp.QueueUpdate(func() { + base.tviewApp.Draw() + }) +} + func (base *Base) Stop() { base.enabledMutex.Lock() base.enabled = false diff --git a/view/keyboard_widget.go b/view/keyboard_widget.go index d37c90a3..1ba1bbfe 100644 --- a/view/keyboard_widget.go +++ b/view/keyboard_widget.go @@ -5,11 +5,11 @@ import ( "strings" "github.com/gdamore/tcell" - "github.com/rivo/tview" "github.com/wtfutil/wtf/cfg" "github.com/wtfutil/wtf/utils" ) +const helpKeyChar = "/" const refreshKeyChar = "r" type helpItem struct { @@ -19,9 +19,6 @@ type helpItem struct { // KeyboardWidget manages keyboard control for a widget type KeyboardWidget struct { - app *tview.Application - pages *tview.Pages - view *tview.TextView settings *cfg.Common charMap map[string]func() @@ -32,10 +29,9 @@ type KeyboardWidget struct { } // NewKeyboardWidget creates and returns a new instance of KeyboardWidget -func NewKeyboardWidget(app *tview.Application, pages *tview.Pages, settings *cfg.Common) *KeyboardWidget { +// func NewKeyboardWidget(tviewApp *tview.Application, pages *tview.Pages, settings *cfg.Common) *KeyboardWidget { +func NewKeyboardWidget(settings *cfg.Common) *KeyboardWidget { keyWidget := &KeyboardWidget{ - app: app, - pages: pages, settings: settings, charMap: make(map[string]func()), keyMap: make(map[tcell.Key]func()), @@ -78,6 +74,14 @@ func (widget *KeyboardWidget) HelpText() string { return str } +// InitializeHelpTextKeyboardControl assigns the function that displays help text to the +// common help text key value +func (widget *KeyboardWidget) InitializeHelpTextKeyboardControl(helpFunc func()) { + if helpFunc != nil { + widget.SetKeyboardChar(helpKeyChar, helpFunc, "Show/hide this help prompt") + } +} + // InitializeRefreshKeyboardControl assigns the module's explicit refresh function to // the commom refresh key value func (widget *KeyboardWidget) InitializeRefreshKeyboardControl(refreshFunc func()) { @@ -155,37 +159,10 @@ func (widget *KeyboardWidget) SetKeyboardKey(key tcell.Key, fn func(), helpText } } -// SetView assigns the passed-in tview.TextView view to this widget -func (widget *KeyboardWidget) SetView(view *tview.TextView) { - widget.view = view -} - -// ShowHelp displays the modal help dialog for a module -func (widget *KeyboardWidget) ShowHelp() { - if widget.pages == nil { - return - } - - closeFunc := func() { - widget.pages.RemovePage("help") - widget.app.SetFocus(widget.view) - } - - modal := NewBillboardModal(widget.HelpText(), closeFunc) - - widget.pages.AddPage("help", modal, false, true) - widget.app.SetFocus(modal) - - widget.app.QueueUpdate(func() { - widget.app.Draw() - }) -} - /* -------------------- Unexported Functions -------------------- */ // initializeCommonKeyboardControls sets up the keyboard controls that are common to // all widgets that accept keyboard input func (widget *KeyboardWidget) initializeCommonKeyboardControls() { - widget.SetKeyboardChar("/", widget.ShowHelp, "Show/hide this help prompt") widget.SetKeyboardChar("\\", widget.LaunchDocumentation, "Open the documentation for this module in a browser") } diff --git a/view/keyboard_widget_test.go b/view/keyboard_widget_test.go index 3ecdb1c9..6660a2ec 100644 --- a/view/keyboard_widget_test.go +++ b/view/keyboard_widget_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/gdamore/tcell" - "github.com/rivo/tview" "github.com/stretchr/testify/assert" "github.com/wtfutil/wtf/cfg" ) @@ -13,8 +12,6 @@ func test() {} func testKeyboardWidget() *KeyboardWidget { keyWid := NewKeyboardWidget( - tview.NewApplication(), - tview.NewPages(), &cfg.Common{ Module: cfg.Module{ Name: "testWidget", @@ -178,7 +175,6 @@ func Test_initializeCommonKeyboardControls(t *testing.T) { t.Run("nil refreshFunc", func(t *testing.T) { keyWid := testKeyboardWidget() - assert.NotNil(t, keyWid.charMap["/"]) assert.NotNil(t, keyWid.charMap["\\"]) }) } @@ -206,18 +202,3 @@ func Test_HelpText(t *testing.T) { assert.NotNil(t, keyWid.HelpText()) } - -func Test_SetView(t *testing.T) { - keyWid := testKeyboardWidget() - assert.Nil(t, keyWid.view) - - view := &tview.TextView{} - keyWid.SetView(view) - assert.Equal(t, view, keyWid.view) -} - -func Test_ShowHelp(t *testing.T) { - keyWid := testKeyboardWidget() - - assert.NotPanics(t, func() { keyWid.ShowHelp() }) -} diff --git a/view/scrollable_widget.go b/view/scrollable_widget.go index 57fe816e..9080c39e 100644 --- a/view/scrollable_widget.go +++ b/view/scrollable_widget.go @@ -15,9 +15,9 @@ type ScrollableWidget struct { RenderFunction func() } -func NewScrollableWidget(app *tview.Application, pages *tview.Pages, commonSettings *cfg.Common) ScrollableWidget { +func NewScrollableWidget(tviewApp *tview.Application, pages *tview.Pages, commonSettings *cfg.Common) ScrollableWidget { widget := ScrollableWidget{ - TextWidget: NewTextWidget(app, pages, commonSettings), + TextWidget: NewTextWidget(tviewApp, pages, commonSettings), } widget.Unselect() @@ -84,7 +84,7 @@ func (widget *ScrollableWidget) Unselect() { func (widget *ScrollableWidget) Redraw(data func() (string, string, bool)) { widget.TextWidget.Redraw(data) - widget.Base.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { widget.View.Highlight(strconv.Itoa(widget.Selected)).ScrollToHighlight() }) } diff --git a/view/text_widget.go b/view/text_widget.go index 2414e5b2..1cfa32eb 100644 --- a/view/text_widget.go +++ b/view/text_widget.go @@ -14,19 +14,24 @@ type TextWidget struct { *KeyboardWidget View *tview.TextView + + tviewApp *tview.Application } // NewTextWidget creates and returns an instance of TextWidget -func NewTextWidget(app *tview.Application, pages *tview.Pages, commonSettings *cfg.Common) TextWidget { +func NewTextWidget(tviewApp *tview.Application, pages *tview.Pages, commonSettings *cfg.Common) TextWidget { widget := TextWidget{ - Base: NewBase(app, commonSettings), - KeyboardWidget: NewKeyboardWidget(app, pages, commonSettings), + Base: NewBase(tviewApp, pages, commonSettings), + KeyboardWidget: NewKeyboardWidget(commonSettings), + + tviewApp: tviewApp, } widget.View = widget.createView(widget.bordered) widget.View.SetInputCapture(widget.KeyboardWidget.InputCapture) - widget.KeyboardWidget.SetView(widget.View) + widget.Base.SetView(widget.View) + widget.Base.helpTextFunc = widget.KeyboardWidget.HelpText return widget } @@ -38,8 +43,9 @@ func (widget *TextWidget) TextView() *tview.TextView { return widget.View } +// Redraw forces a refresh of the onscreen text content of this widget func (widget *TextWidget) Redraw(data func() (string, string, bool)) { - widget.Base.app.QueueUpdateDraw(func() { + widget.tviewApp.QueueUpdateDraw(func() { title, content, wrap := data() widget.View.Clear() diff --git a/wtf/terminal.go b/wtf/terminal.go new file mode 100644 index 00000000..4700e1d4 --- /dev/null +++ b/wtf/terminal.go @@ -0,0 +1,22 @@ +package wtf + +import ( + "fmt" + "os" + + "github.com/logrusorgru/aurora" + "github.com/olebedev/config" +) + +// SetTerminal sets the TERM environment variable, defaulting to whatever the OS +// has as the current value if none is specified. +// See https://www.gnu.org/software/gettext/manual/html_node/The-TERM-variable.html for +// more details. +func SetTerminal(config *config.Config) { + term := config.UString("wtf.term", os.Getenv("TERM")) + err := os.Setenv("TERM", term) + if err != nil { + fmt.Printf("\n%s Failed to set $TERM to %s.\n", aurora.Red("ERROR"), aurora.Yellow(term)) + os.Exit(1) + } +}