diff --git a/app/wtf_app.go b/app/wtf_app.go index 911a2f78..46c17d0d 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,34 +21,36 @@ 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 { + TViewApp *tview.Application + config *config.Config configFilePath string display *Display focusTracker FocusTracker ghUser *support.GitHubUser pages *tview.Pages - tviewApp *tview.Application validator *ModuleValidator widgets []wtf.Wtfable } // NewWtfApp creates and returns an instance of WtfApp -func NewWtfApp(tviewApp *tview.Application, config *config.Config, configFilePath string) *WtfApp { +func NewWtfApp(tviewApp *tview.Application, config *config.Config, configFilePath string) WtfApp { wtfApp := WtfApp{ - tviewApp: tviewApp, + TViewApp: tviewApp, + config: config, configFilePath: configFilePath, pages: tview.NewPages(), } - wtfApp.tviewApp.SetBeforeDrawFunc(func(s tcell.Screen) bool { + wtfApp.TViewApp.SetBeforeDrawFunc(func(s tcell.Screen) bool { s.Clear() return false }) - wtfApp.widgets = MakeWidgets(wtfApp.tviewApp, wtfApp.pages, wtfApp.config) + wtfApp.widgets = MakeWidgets(wtfApp.TViewApp, wtfApp.pages, wtfApp.config) wtfApp.display = NewDisplay(wtfApp.widgets, wtfApp.config) - wtfApp.focusTracker = NewFocusTracker(wtfApp.tviewApp, wtfApp.widgets, wtfApp.config) + wtfApp.focusTracker = NewFocusTracker(wtfApp.TViewApp, wtfApp.widgets, wtfApp.config) githubAPIKey := readGitHubAPIKey(wtfApp.config) wtfApp.ghUser = support.NewGitHubUser(githubAPIKey) @@ -63,14 +68,22 @@ func NewWtfApp(tviewApp *tview.Application, config *config.Config, configFilePat ), ) - wtfApp.tviewApp.SetInputCapture(wtfApp.keyboardIntercept) - wtfApp.tviewApp.SetRoot(wtfApp.pages, true) + wtfApp.TViewApp.SetInputCapture(wtfApp.keyboardIntercept) + wtfApp.TViewApp.SetRoot(wtfApp.pages, true) - return &wtfApp + 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() @@ -98,7 +111,7 @@ func (wtfApp *WtfApp) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyCtrlC: wtfApp.Stop() - wtfApp.tviewApp.Stop() + wtfApp.TViewApp.Stop() wtfApp.DisplayExitMessage() case tcell.KeyCtrlR: wtfApp.refreshAllWidgets() @@ -154,7 +167,7 @@ func (wtfApp *WtfApp) watchForConfigChanges() { wtfApp.Stop() config := cfg.LoadWtfConfigFile(wtfApp.configFilePath) - newApp := NewWtfApp(wtfApp.tviewApp, 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/main.go b/main.go index 314ff711..6a0cf661 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" @@ -45,6 +40,14 @@ func setTerm(config *config.Config) { } } +func makeWtfApp(config *config.Config, flagConfig string) app.WtfApp { + tviewApp = tview.NewApplication() + wtfApp := app.NewWtfApp(tviewApp, config, flagConfig) + wtfApp.Start() + + return wtfApp +} + /* -------------------- Main -------------------- */ func main() { @@ -54,11 +57,11 @@ 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()) + setTerm(config) + flags.RenderIf(version, date, config) if flags.Profile { @@ -69,15 +72,10 @@ func main() { openURLUtil := utils.ToStrs(config.UList("wtf.openUrlUtil", []interface{}{})) utils.Init(openFileUtil, openURLUtil) - setTerm(config) + apps := []app.WtfApp{} + app := makeWtfApp(config, flags.Config) + apps = append(apps, app) - // Build the application - tviewApp = tview.NewApplication() - wtfApp := app.NewWtfApp(tviewApp, config, flags.Config) - wtfApp.Start() - - if err := tviewApp.Run(); err != nil { - fmt.Printf("\n%s %v\n", aurora.Red("ERROR"), err) - os.Exit(1) - } + currentApp := apps[0] + currentApp.Run() }