From f09d08bda2ba900e82bb0a12f4df69aff1e9ad09 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Thu, 18 Apr 2019 18:05:56 -0700 Subject: [PATCH] WTF-400 Common settings implemented --- cfg/common_settings.go | 35 ++++++-- cfg/config_files.go | 52 ++++++++++-- logger/log.go | 2 +- main.go | 22 ++--- modules/bamboohr/widget.go | 2 +- modules/circleci/widget.go | 2 +- modules/clocks/widget.go | 2 +- modules/cmdrunner/widget.go | 2 +- modules/cryptoexchanges/bittrex/widget.go | 2 +- modules/cryptoexchanges/blockfolio/widget.go | 2 +- modules/cryptoexchanges/cryptolive/widget.go | 2 +- modules/datadog/widget.go | 2 +- modules/gcal/widget.go | 2 +- modules/gerrit/widget.go | 2 +- modules/git/widget.go | 4 +- modules/github/widget.go | 2 +- modules/gitlab/widget.go | 2 +- modules/gitter/widget.go | 2 +- modules/gspreadsheets/widget.go | 2 +- modules/hackernews/widget.go | 2 +- modules/ipaddresses/ipapi/widget.go | 2 +- modules/ipaddresses/ipinfo/widget.go | 2 +- modules/jenkins/widget.go | 2 +- modules/jira/widget.go | 2 +- modules/mercurial/widget.go | 2 +- modules/nbascore/widget.go | 2 +- modules/newrelic/widget.go | 2 +- modules/opsgenie/widget.go | 2 +- modules/pagerduty/widget.go | 2 +- modules/power/widget.go | 2 +- modules/rollbar/widget.go | 2 +- modules/security/widget.go | 2 +- modules/spotify/widget.go | 6 +- modules/spotifyweb/widget.go | 5 +- modules/status/widget.go | 2 +- modules/system/widget.go | 2 +- modules/textfile/widget.go | 10 +-- modules/todo/widget.go | 2 +- modules/todoist/widget.go | 2 +- modules/travisci/widget.go | 2 +- modules/trello/widget.go | 2 +- modules/twitter/widget.go | 2 +- modules/unknown/widget.go | 2 +- modules/victorops/widget.go | 2 +- .../weatherservices/prettyweather/widget.go | 2 +- modules/weatherservices/weather/widget.go | 2 +- modules/zendesk/widget.go | 2 +- wtf/text_widget.go | 84 ++++++++----------- wtf/utils.go | 3 +- wtf/widget_validator.go | 21 +++++ wtf/wtfable.go | 8 +- wtf_tests/colors_test.go | 2 +- 52 files changed, 201 insertions(+), 131 deletions(-) create mode 100644 wtf/widget_validator.go diff --git a/cfg/common_settings.go b/cfg/common_settings.go index 2bc4450f..a8d85191 100644 --- a/cfg/common_settings.go +++ b/cfg/common_settings.go @@ -13,6 +13,7 @@ type Colors struct { HighlightFore string HighlightBack string Text string + Title string } type Module struct { @@ -33,21 +34,27 @@ type Common struct { Position Enabled bool + FocusChar int RefreshInterval int Title string } func NewCommonSettingsFromYAML(name, configKey string, ymlConfig *config.Config) *Common { + colorsPath := "wtf.colors" + modulePath := "wtf.mods." + configKey + positionPath := "wtf.mods." + configKey + ".position" + common := Common{ Colors: Colors{ - Background: ymlConfig.UString("wtf.colors.background", "black"), - BorderFocusable: ymlConfig.UString("wtf.colors.border.focusable"), - BorderFocused: ymlConfig.UString("wtf.colors.border.focused"), - BorderNormal: ymlConfig.UString("wtf.colors.border.normal"), - Checked: ymlConfig.UString("wtf.colors.checked"), - HighlightFore: ymlConfig.UString("wtf.colors.highlight.fore"), - HighlightBack: ymlConfig.UString("wtf.colors.highlight.back"), - Text: ymlConfig.UString("wtf.colors.text", "white"), + Background: ymlConfig.UString(modulePath+".colors.background", ymlConfig.UString(colorsPath+".background", "black")), + BorderFocusable: ymlConfig.UString(colorsPath+".border.focusable", "red"), + BorderFocused: ymlConfig.UString(colorsPath+".border.focused", "orange"), + BorderNormal: ymlConfig.UString(colorsPath+".border.normal", "gray"), + Checked: ymlConfig.UString(colorsPath+".checked", "gray"), + HighlightFore: ymlConfig.UString(colorsPath+".highlight.fore", "black"), + HighlightBack: ymlConfig.UString(colorsPath+".highlight.back", "green"), + Text: ymlConfig.UString(modulePath+".colors.text", ymlConfig.UString(colorsPath+".text", "white")), + Title: ymlConfig.UString(modulePath+".colors.title", ymlConfig.UString(colorsPath+".title", "white")), }, Module: Module{ @@ -55,7 +62,17 @@ func NewCommonSettingsFromYAML(name, configKey string, ymlConfig *config.Config) Name: name, }, - Position: Position{}, + Position: Position{ + Height: ymlConfig.UInt(positionPath + ".height"), + Left: ymlConfig.UInt(positionPath + ".left"), + Top: ymlConfig.UInt(positionPath + ".top"), + Width: ymlConfig.UInt(positionPath + ".width"), + }, + + Enabled: ymlConfig.UBool(modulePath+".enabled", false), + FocusChar: ymlConfig.UInt(modulePath+".focusChar", -1), + RefreshInterval: ymlConfig.UInt(modulePath+".refreshInterval", 300), + Title: ymlConfig.UString(modulePath+".title", name), } return &common diff --git a/cfg/config_files.go b/cfg/config_files.go index 852ecf25..4bb00582 100644 --- a/cfg/config_files.go +++ b/cfg/config_files.go @@ -1,12 +1,14 @@ package cfg import ( + "errors" "fmt" "io/ioutil" "os" + "os/user" + "path/filepath" "github.com/olebedev/config" - "github.com/wtfutil/wtf/wtf" ) // ConfigDirV1 defines the path to the first version of configuration. Do not use this @@ -20,8 +22,8 @@ const ConfigDirV2 = "~/.config/wtf/" // MigrateOldConfig copies any existing configuration from the old location // to the new, XDG-compatible location func MigrateOldConfig() { - srcDir, _ := wtf.ExpandHomeDir(ConfigDirV1) - destDir, _ := wtf.ExpandHomeDir(ConfigDirV2) + srcDir, _ := expandHomeDir(ConfigDirV1) + destDir, _ := expandHomeDir(ConfigDirV2) // If the old config directory doesn't exist, do not move if _, err := os.Stat(srcDir); os.IsNotExist(err) { @@ -52,7 +54,7 @@ func MigrateOldConfig() { // ConfigDir returns the absolute path to the configuration directory func ConfigDir() (string, error) { - configDir, err := wtf.ExpandHomeDir(ConfigDirV2) + configDir, err := expandHomeDir(ConfigDirV2) if err != nil { return "", err } @@ -120,7 +122,7 @@ func CreateFile(fileName string) (string, error) { // LoadConfigFile loads the config.yml file to configure the app func LoadConfigFile(filePath string) *config.Config { - absPath, _ := wtf.ExpandHomeDir(filePath) + absPath, _ := expandHomeDir(filePath) cfg, err := config.ParseYamlFile(absPath) if err != nil { @@ -196,3 +198,43 @@ const simpleConfig = `wtf: width: 1 refreshInterval: 30 ` + +/* -------------------- Unexported Functions -------------------- */ + +// Expand expands the path to include the home directory if the path +// is prefixed with `~`. If it isn't prefixed with `~`, the path is +// returned as-is. +func expandHomeDir(path string) (string, error) { + if len(path) == 0 { + return path, nil + } + + if path[0] != '~' { + return path, nil + } + + if len(path) > 1 && path[1] != '/' && path[1] != '\\' { + return "", errors.New("cannot expand user-specific home dir") + } + + dir, err := home() + if err != nil { + return "", err + } + + return filepath.Join(dir, path[1:]), nil +} + +// Dir returns the home directory for the executing user. +// An error is returned if a home directory cannot be detected. +func home() (string, error) { + currentUser, err := user.Current() + if err != nil { + return "", err + } + if currentUser.HomeDir == "" { + return "", errors.New("cannot find user-specific home dir") + } + + return currentUser.HomeDir, nil +} diff --git a/logger/log.go b/logger/log.go index b786e122..7b4b88cd 100644 --- a/logger/log.go +++ b/logger/log.go @@ -22,7 +22,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, "Logs", "logger", true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), filePath: logFilePath(), settings: settings, diff --git a/main.go b/main.go index 1afc6ca1..be978e2a 100644 --- a/main.go +++ b/main.go @@ -151,7 +151,7 @@ func watchForConfigChanges(app *tview.Application, configFilePath string, grid * loadConfigFile(absPath) widgets := makeWidgets(app, pages) - validateWidgets(widgets) + wtf.ValidateWidgets(widgets) initializeFocusTracker(app, widgets) @@ -342,15 +342,15 @@ func makeWidgets(app *tview.Application, pages *tview.Pages) []wtf.Wtfable { return widgets } -// Check that all the loaded widgets are valid for display -func validateWidgets(widgets []wtf.Wtfable) { - for _, widget := range widgets { - if widget.Enabled() && !widget.IsPositionable() { - errStr := fmt.Sprintf("Widget config has invalid values: %s", widget.Key()) - log.Fatalln(errStr) - } - } -} +// // Check that all the loaded widgets are valid for display +// func validateWidgets(widgets []wtf.Wtfable) { +// for _, widget := range widgets { +// if widget.Enabled() && !widget.IsPositionable() { +// errStr := fmt.Sprintf("Widget config has invalid values: %s", widget.Key()) +// log.Fatalln(errStr) +// } +// } +// } /* -------------------- Main -------------------- */ @@ -376,7 +376,7 @@ func main() { pages := tview.NewPages() widgets := makeWidgets(app, pages) - validateWidgets(widgets) + wtf.ValidateWidgets(widgets) initializeFocusTracker(app, widgets) diff --git a/modules/bamboohr/widget.go b/modules/bamboohr/widget.go index 3a37cc77..c132a719 100644 --- a/modules/bamboohr/widget.go +++ b/modules/bamboohr/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/circleci/widget.go b/modules/circleci/widget.go index 0c654241..4016a25e 100644 --- a/modules/circleci/widget.go +++ b/modules/circleci/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), Client: NewClient(settings.apiKey), settings: settings, diff --git a/modules/clocks/widget.go b/modules/clocks/widget.go index 45ffb3d7..e65cb584 100644 --- a/modules/clocks/widget.go +++ b/modules/clocks/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, dateFormat: settings.dateFormat, diff --git a/modules/cmdrunner/widget.go b/modules/cmdrunner/widget.go index ec613969..bb326677 100644 --- a/modules/cmdrunner/widget.go +++ b/modules/cmdrunner/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), args: settings.args, cmd: settings.cmd, diff --git a/modules/cryptoexchanges/bittrex/widget.go b/modules/cryptoexchanges/bittrex/widget.go index 70daaac7..9085626d 100644 --- a/modules/cryptoexchanges/bittrex/widget.go +++ b/modules/cryptoexchanges/bittrex/widget.go @@ -27,7 +27,7 @@ type Widget struct { // NewWidget Make new instance of widget func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, summaryList: summaryList{}, diff --git a/modules/cryptoexchanges/blockfolio/widget.go b/modules/cryptoexchanges/blockfolio/widget.go index 9453da57..27f8e5fe 100644 --- a/modules/cryptoexchanges/blockfolio/widget.go +++ b/modules/cryptoexchanges/blockfolio/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), device_token: settings.deviceToken, settings: settings, diff --git a/modules/cryptoexchanges/cryptolive/widget.go b/modules/cryptoexchanges/cryptolive/widget.go index 39d2f14c..c16c4dcf 100644 --- a/modules/cryptoexchanges/cryptolive/widget.go +++ b/modules/cryptoexchanges/cryptolive/widget.go @@ -22,7 +22,7 @@ type Widget struct { // NewWidget Make new instance of widget func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), priceWidget: price.NewWidget(settings.priceSettings), toplistWidget: toplist.NewWidget(settings.toplistSettings), diff --git a/modules/datadog/widget.go b/modules/datadog/widget.go index 275ec1fc..7b97b40d 100644 --- a/modules/datadog/widget.go +++ b/modules/datadog/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/gcal/widget.go b/modules/gcal/widget.go index c7e1679e..ecc40cd7 100644 --- a/modules/gcal/widget.go +++ b/modules/gcal/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), app: app, ch: make(chan struct{}), diff --git a/modules/gerrit/widget.go b/modules/gerrit/widget.go index 24c056f6..15afa32c 100644 --- a/modules/gerrit/widget.go +++ b/modules/gerrit/widget.go @@ -49,7 +49,7 @@ var ( func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Idx: 0, settings: settings, diff --git a/modules/git/widget.go b/modules/git/widget.go index d6ac7533..f63952c7 100644 --- a/modules/git/widget.go +++ b/modules/git/widget.go @@ -42,8 +42,8 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - MultiSourceWidget: wtf.NewMultiSourceWidget("git", "repository", "repositories"), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + MultiSourceWidget: wtf.NewMultiSourceWidget(settings.common.ConfigKey, "repository", "repositories"), + TextWidget: wtf.NewTextWidget(app, settings.common, true), app: app, pages: pages, diff --git a/modules/github/widget.go b/modules/github/widget.go index cd552c00..8021183b 100644 --- a/modules/github/widget.go +++ b/modules/github/widget.go @@ -32,7 +32,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Idx: 0, settings: settings, diff --git a/modules/gitlab/widget.go b/modules/gitlab/widget.go index 04e1e860..bbeb8f4e 100644 --- a/modules/gitlab/widget.go +++ b/modules/gitlab/widget.go @@ -39,7 +39,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Idx: 0, gitlab: gitlab, diff --git a/modules/gitter/widget.go b/modules/gitter/widget.go index 8d0ff45a..3411e67f 100644 --- a/modules/gitter/widget.go +++ b/modules/gitter/widget.go @@ -32,7 +32,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/gspreadsheets/widget.go b/modules/gspreadsheets/widget.go index 92d91b3a..f723cec0 100644 --- a/modules/gspreadsheets/widget.go +++ b/modules/gspreadsheets/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/hackernews/widget.go b/modules/hackernews/widget.go index 5bdee3fe..d9798d25 100644 --- a/modules/hackernews/widget.go +++ b/modules/hackernews/widget.go @@ -38,7 +38,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/ipaddresses/ipapi/widget.go b/modules/ipaddresses/ipapi/widget.go index de4f00d1..24d6b1fd 100644 --- a/modules/ipaddresses/ipapi/widget.go +++ b/modules/ipaddresses/ipapi/widget.go @@ -38,7 +38,7 @@ type ipinfo struct { // NewWidget constructor func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/ipaddresses/ipinfo/widget.go b/modules/ipaddresses/ipinfo/widget.go index bc8b44e8..0f282519 100644 --- a/modules/ipaddresses/ipinfo/widget.go +++ b/modules/ipaddresses/ipinfo/widget.go @@ -31,7 +31,7 @@ type ipinfo struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/jenkins/widget.go b/modules/jenkins/widget.go index 64e6e022..145c397b 100644 --- a/modules/jenkins/widget.go +++ b/modules/jenkins/widget.go @@ -36,7 +36,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/jira/widget.go b/modules/jira/widget.go index eb929530..91047552 100644 --- a/modules/jira/widget.go +++ b/modules/jira/widget.go @@ -34,7 +34,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/mercurial/widget.go b/modules/mercurial/widget.go index 683eb939..cffe384b 100644 --- a/modules/mercurial/widget.go +++ b/modules/mercurial/widget.go @@ -38,7 +38,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), MultiSourceWidget: wtf.NewMultiSourceWidget(settings.common.ConfigKey, "repository", "repositories"), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), app: app, pages: pages, diff --git a/modules/nbascore/widget.go b/modules/nbascore/widget.go index c1a28681..d506fcee 100644 --- a/modules/nbascore/widget.go +++ b/modules/nbascore/widget.go @@ -33,7 +33,7 @@ var offset = 0 func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/newrelic/widget.go b/modules/newrelic/widget.go index 7affdc38..73c24039 100644 --- a/modules/newrelic/widget.go +++ b/modules/newrelic/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/opsgenie/widget.go b/modules/opsgenie/widget.go index a59652f9..d6d34b2a 100644 --- a/modules/opsgenie/widget.go +++ b/modules/opsgenie/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/pagerduty/widget.go b/modules/pagerduty/widget.go index a11cf8bb..4db3f72b 100644 --- a/modules/pagerduty/widget.go +++ b/modules/pagerduty/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/power/widget.go b/modules/power/widget.go index fe5766b7..db25265e 100644 --- a/modules/power/widget.go +++ b/modules/power/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), Battery: NewBattery(), settings: settings, diff --git a/modules/rollbar/widget.go b/modules/rollbar/widget.go index 74fadc80..985b7079 100644 --- a/modules/rollbar/widget.go +++ b/modules/rollbar/widget.go @@ -35,7 +35,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/security/widget.go b/modules/security/widget.go index 68856bbc..b656ab71 100644 --- a/modules/security/widget.go +++ b/modules/security/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/spotify/widget.go b/modules/spotify/widget.go index 5e35bfa8..b35c0838 100644 --- a/modules/spotify/widget.go +++ b/modules/spotify/widget.go @@ -30,14 +30,16 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * spotifyClient := spotigopher.NewClient() widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Info: spotigopher.Info{}, SpotifyClient: spotifyClient, settings: settings, } + + widget.settings.common.RefreshInterval = 5 + widget.HelpfulWidget.SetView(widget.View) - widget.TextWidget.RefreshInt = 5 widget.View.SetInputCapture(widget.captureInput) widget.View.SetWrap(true) widget.View.SetWordWrap(true) diff --git a/modules/spotifyweb/widget.go b/modules/spotifyweb/widget.go index 3d0ec40d..fe91efde 100644 --- a/modules/spotifyweb/widget.go +++ b/modules/spotifyweb/widget.go @@ -93,7 +93,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Info: Info{}, client: client, @@ -135,8 +135,9 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * // If inconvenient, I'll remove this option and save the URL in a file or some other method. wtf.OpenFile(`"` + authURL + `"`) + widget.settings.common.RefreshInterval = 5 + widget.HelpfulWidget.SetView(widget.View) - widget.TextWidget.RefreshInt = 5 widget.View.SetInputCapture(widget.captureInput) widget.View.SetWrap(true) widget.View.SetWordWrap(true) diff --git a/modules/status/widget.go b/modules/status/widget.go index 257480a9..e9a07650 100644 --- a/modules/status/widget.go +++ b/modules/status/widget.go @@ -14,7 +14,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), CurrentIcon: 0, settings: settings, diff --git a/modules/system/widget.go b/modules/system/widget.go index 2f5ee3e5..4bf5b32d 100644 --- a/modules/system/widget.go +++ b/modules/system/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget(app *tview.Application, date, version string, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), Date: date, settings: settings, diff --git a/modules/textfile/widget.go b/modules/textfile/widget.go index 36f7a39e..c0d01778 100644 --- a/modules/textfile/widget.go +++ b/modules/textfile/widget.go @@ -42,19 +42,17 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), MultiSourceWidget: wtf.NewMultiSourceWidget(settings.common.ConfigKey, "filePath", "filePaths"), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } // Don't use a timer for this widget, watch for filesystem changes instead - widget.RefreshInt = 0 - - widget.LoadSources() - widget.SetDisplayFunction(widget.display) + widget.settings.common.RefreshInterval = 0 widget.HelpfulWidget.SetView(widget.View) - + widget.LoadSources() + widget.SetDisplayFunction(widget.display) widget.View.SetWrap(true) widget.View.SetWordWrap(true) widget.View.SetInputCapture(widget.keyboardIntercept) diff --git a/modules/todo/widget.go b/modules/todo/widget.go index de054813..3af8558a 100644 --- a/modules/todo/widget.go +++ b/modules/todo/widget.go @@ -49,7 +49,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), app: app, settings: settings, diff --git a/modules/todoist/widget.go b/modules/todoist/widget.go index 23118c6b..0a57c22e 100644 --- a/modules/todoist/widget.go +++ b/modules/todoist/widget.go @@ -37,7 +37,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/travisci/widget.go b/modules/travisci/widget.go index de948a09..1265c176 100644 --- a/modules/travisci/widget.go +++ b/modules/travisci/widget.go @@ -34,7 +34,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/modules/trello/widget.go b/modules/trello/widget.go index 2c5a6f19..fd79984f 100644 --- a/modules/trello/widget.go +++ b/modules/trello/widget.go @@ -16,7 +16,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/twitter/widget.go b/modules/twitter/widget.go index 874a0815..b2056932 100644 --- a/modules/twitter/widget.go +++ b/modules/twitter/widget.go @@ -37,7 +37,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), MultiSourceWidget: wtf.NewMultiSourceWidget(settings.common.ConfigKey, "screenName", "screenNames"), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), idx: 0, settings: settings, diff --git a/modules/unknown/widget.go b/modules/unknown/widget.go index 6be2c567..053c9bad 100644 --- a/modules/unknown/widget.go +++ b/modules/unknown/widget.go @@ -15,7 +15,7 @@ type Widget struct { func NewWidget(app *tview.Application, name string, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, name, name, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/victorops/widget.go b/modules/victorops/widget.go index 81eb37ba..a3e0fcdb 100644 --- a/modules/victorops/widget.go +++ b/modules/victorops/widget.go @@ -27,7 +27,7 @@ type Widget struct { // NewWidget creates a new widget func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), } widget.View.SetScrollable(true) diff --git a/modules/weatherservices/prettyweather/widget.go b/modules/weatherservices/prettyweather/widget.go index 43c49485..3107db35 100644 --- a/modules/weatherservices/prettyweather/widget.go +++ b/modules/weatherservices/prettyweather/widget.go @@ -18,7 +18,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, false), + TextWidget: wtf.NewTextWidget(app, settings.common, false), settings: settings, } diff --git a/modules/weatherservices/weather/widget.go b/modules/weatherservices/weather/widget.go index 60b38379..c4017b36 100644 --- a/modules/weatherservices/weather/widget.go +++ b/modules/weatherservices/weather/widget.go @@ -33,7 +33,7 @@ type Widget struct { func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { widget := Widget{ HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText), - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), Idx: 0, settings: settings, diff --git a/modules/zendesk/widget.go b/modules/zendesk/widget.go index 6a282a4d..7ce1649d 100644 --- a/modules/zendesk/widget.go +++ b/modules/zendesk/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(app, settings.common.Name, settings.common.ConfigKey, true), + TextWidget: wtf.NewTextWidget(app, settings.common, true), settings: settings, } diff --git a/wtf/text_widget.go b/wtf/text_widget.go index 74ead21f..fe1b35e4 100644 --- a/wtf/text_widget.go +++ b/wtf/text_widget.go @@ -5,44 +5,49 @@ import ( "github.com/olebedev/config" "github.com/rivo/tview" + "github.com/wtfutil/wtf/cfg" ) var Config *config.Config type TextWidget struct { - enabled bool - focusable bool - focusChar string - key string - name string + enabled bool + focusable bool + focusChar string + key string + name string + refreshInterval int - RefreshInt int - View *tview.TextView + View *tview.TextView + CommonSettings *cfg.Common Position } -func NewTextWidget(app *tview.Application, name string, configKey string, focusable bool) TextWidget { - focusCharValue := Config.UInt(fmt.Sprintf("wtf.mods.%s.focusChar", configKey), -1) - focusChar := string('0' + focusCharValue) - if focusCharValue == -1 { +func NewTextWidget(app *tview.Application, commonSettings *cfg.Common, focusable bool) TextWidget { + configKey := commonSettings.ConfigKey + + focusChar := string('0' + commonSettings.FocusChar) + if commonSettings.FocusChar == -1 { focusChar = "" } widget := TextWidget{ - enabled: Config.UBool(fmt.Sprintf("wtf.mods.%s.enabled", configKey), false), - focusable: focusable, - focusChar: focusChar, - key: configKey, - name: Config.UString(fmt.Sprintf("wtf.mods.%s.title", configKey), name), - RefreshInt: Config.UInt(fmt.Sprintf("wtf.mods.%s.refreshInterval", configKey)), + CommonSettings: commonSettings, + + enabled: commonSettings.Enabled, + focusable: focusable, + focusChar: focusChar, + key: commonSettings.ConfigKey, + name: commonSettings.Name, + refreshInterval: commonSettings.RefreshInterval, } widget.Position = NewPosition( - Config.UInt(fmt.Sprintf("wtf.mods.%s.position.top", configKey)), - Config.UInt(fmt.Sprintf("wtf.mods.%s.position.left", configKey)), - Config.UInt(fmt.Sprintf("wtf.mods.%s.position.width", configKey)), - Config.UInt(fmt.Sprintf("wtf.mods.%s.position.height", configKey)), + commonSettings.Position.Top, + commonSettings.Position.Left, + commonSettings.Position.Width, + commonSettings.Position.Height, ) widget.addView(app, configKey) @@ -54,10 +59,10 @@ func NewTextWidget(app *tview.Application, name string, configKey string, focusa func (widget *TextWidget) BorderColor() string { if widget.Focusable() { - return Config.UString("wtf.colors.border.focusable", "red") + return widget.CommonSettings.Colors.BorderFocusable } - return Config.UString("wtf.colors.border.normal", "gray") + return widget.CommonSettings.Colors.BorderNormal } func (widget *TextWidget) ContextualTitle(defaultStr string) string { @@ -103,7 +108,7 @@ func (widget *TextWidget) Name() string { } func (widget *TextWidget) RefreshInterval() int { - return widget.RefreshInt + return widget.refreshInterval } func (widget *TextWidget) SetFocusChar(char string) { @@ -119,34 +124,19 @@ func (widget *TextWidget) TextView() *tview.TextView { func (widget *TextWidget) addView(app *tview.Application, configKey string) { view := tview.NewTextView() - view.SetBackgroundColor(ColorFor( - Config.UString(fmt.Sprintf("wtf.mods.%s.colors.background", configKey), - Config.UString("wtf.colors.background", "black"), - ), - )) - - view.SetTextColor(ColorFor( - Config.UString( - fmt.Sprintf("wtf.mods.%s.colors.text", configKey), - Config.UString("wtf.colors.text", "white"), - ), - )) - - view.SetTitleColor(ColorFor( - Config.UString( - fmt.Sprintf("wtf.mods.%s.colors.title", configKey), - Config.UString("wtf.colors.title", "white"), - ), - )) + view.SetBackgroundColor(ColorFor(widget.CommonSettings.Colors.Background)) + view.SetBorderColor(ColorFor(widget.BorderColor())) + view.SetTextColor(ColorFor(widget.CommonSettings.Colors.Text)) + view.SetTitleColor(ColorFor(widget.CommonSettings.Colors.Title)) view.SetBorder(true) - view.SetBorderColor(ColorFor(widget.BorderColor())) - view.SetChangedFunc(func() { - app.Draw() - }) view.SetDynamicColors(true) view.SetTitle(widget.ContextualTitle(widget.name)) view.SetWrap(false) + view.SetChangedFunc(func() { + app.Draw() + }) + widget.View = view } diff --git a/wtf/utils.go b/wtf/utils.go index 205ea09a..2c1c1f88 100644 --- a/wtf/utils.go +++ b/wtf/utils.go @@ -5,9 +5,8 @@ import ( "io/ioutil" "os/exec" "regexp" - "strings" - //"sync" "runtime" + "strings" "github.com/rivo/tview" ) diff --git a/wtf/widget_validator.go b/wtf/widget_validator.go new file mode 100644 index 00000000..9483db28 --- /dev/null +++ b/wtf/widget_validator.go @@ -0,0 +1,21 @@ +package wtf + +import ( + "fmt" + "log" +) + +// Check that all the loaded widgets are valid for display +func ValidateWidgets(widgets []Wtfable) (bool, error) { + result := true + var err error + + for _, widget := range widgets { + if widget.Enabled() && !widget.IsPositionable() { + errStr := fmt.Sprintf("Widget config has invalid values: %s", widget.Key()) + log.Fatalln(errStr) + } + } + + return result, err +} diff --git a/wtf/wtfable.go b/wtf/wtfable.go index 86e33121..aad2b78c 100644 --- a/wtf/wtfable.go +++ b/wtf/wtfable.go @@ -9,15 +9,15 @@ type Wtfable interface { Scheduler BorderColor() string - Focusable() bool FocusChar() string + Focusable() bool Key() string Name() string SetFocusChar(string) TextView() *tview.TextView - Top() int - Left() int - Width() int Height() int + Left() int + Top() int + Width() int } diff --git a/wtf_tests/colors_test.go b/wtf_tests/colors_test.go index 8f7ddea6..baec66ac 100644 --- a/wtf_tests/colors_test.go +++ b/wtf_tests/colors_test.go @@ -7,7 +7,7 @@ import ( . "github.com/wtfutil/wtf/wtf" ) -func TestASCIItoTviewColors(t *testing.T) { +func Test_ASCIItoTviewColors(t *testing.T) { Equal(t, "", ASCIItoTviewColors("")) Equal(t, "cat", ASCIItoTviewColors("cat")) Equal(t, "[38;5;226mcat/[-]", ASCIItoTviewColors("[38;5;226mcat/"))