From 037c90db8599f924dca421e384275ee36483fd92 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Sat, 28 Apr 2018 23:41:51 -0700 Subject: [PATCH 1/2] Widget#focus now a thing Widgets can inform whether or not they should get tab focus. Widgets that provide additional functionality should return true. Widgets that have no extra capability should return false. This allows the FocusTracker to only tab through and focus on widgets for which it provides value. --- bamboohr/widget.go | 2 +- clocks/widget.go | 2 +- gcal/widget.go | 2 +- git/widget.go | 2 +- github/widget.go | 2 +- jira/widget.go | 2 +- newrelic/widget.go | 2 +- opsgenie/widget.go | 2 +- security/widget.go | 2 +- status/widget.go | 2 +- system/widget.go | 2 +- textfile/widget.go | 2 +- todo/widget.go | 2 +- weather/widget.go | 2 +- wtf/focus_tracker.go | 22 +++++++++++++++++----- wtf/text_viewer.go | 2 +- wtf/text_widget.go | 8 +++++++- 17 files changed, 39 insertions(+), 21 deletions(-) diff --git a/bamboohr/widget.go b/bamboohr/widget.go index 19de8f34..2e2d95ab 100644 --- a/bamboohr/widget.go +++ b/bamboohr/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" ðŸ‘― BambooHR ", "bamboohr"), + TextWidget: wtf.NewTextWidget(" ðŸ‘― BambooHR ", "bamboohr", false), } return &widget diff --git a/clocks/widget.go b/clocks/widget.go index 457d4a55..b3460c4d 100644 --- a/clocks/widget.go +++ b/clocks/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" 🕗 World Clocks ", "clocks"), + TextWidget: wtf.NewTextWidget(" 🕗 World Clocks ", "clocks", false), } return &widget diff --git a/gcal/widget.go b/gcal/widget.go index b68bba92..17bf126c 100644 --- a/gcal/widget.go +++ b/gcal/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" ðŸŋ Calendar ", "gcal"), + TextWidget: wtf.NewTextWidget(" ðŸŋ Calendar ", "gcal", false), } return &widget diff --git a/git/widget.go b/git/widget.go index 04c2f225..03b33354 100644 --- a/git/widget.go +++ b/git/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" Git ", "git"), + TextWidget: wtf.NewTextWidget(" Git ", "git", true), Idx: 0, } diff --git a/github/widget.go b/github/widget.go index 3f89b8f3..8d40c871 100644 --- a/github/widget.go +++ b/github/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" Github ", "github"), + TextWidget: wtf.NewTextWidget(" Github ", "github", true), Idx: 0, } diff --git a/jira/widget.go b/jira/widget.go index 36a9853a..24d4842e 100644 --- a/jira/widget.go +++ b/jira/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget("JIRA", "jira"), + TextWidget: wtf.NewTextWidget("JIRA", "jira", false), } return &widget diff --git a/newrelic/widget.go b/newrelic/widget.go index 06929982..bf5836c8 100644 --- a/newrelic/widget.go +++ b/newrelic/widget.go @@ -18,7 +18,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" New Relic ", "newrelic"), + TextWidget: wtf.NewTextWidget(" New Relic ", "newrelic", false), } return &widget diff --git a/opsgenie/widget.go b/opsgenie/widget.go index 253c0cdf..ad5dd122 100644 --- a/opsgenie/widget.go +++ b/opsgenie/widget.go @@ -18,7 +18,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" ⏰ OpsGenie ", "opsgenie"), + TextWidget: wtf.NewTextWidget(" ⏰ OpsGenie ", "opsgenie", false), } return &widget diff --git a/security/widget.go b/security/widget.go index 0ea8c9ef..e4a919cf 100644 --- a/security/widget.go +++ b/security/widget.go @@ -17,7 +17,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" ðŸĪš Security ", "security"), + TextWidget: wtf.NewTextWidget(" ðŸĪš Security ", "security", false), } return &widget diff --git a/status/widget.go b/status/widget.go index 39369005..cc602e4a 100644 --- a/status/widget.go +++ b/status/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" 🎉 Status ", "status"), + TextWidget: wtf.NewTextWidget(" 🎉 Status ", "status", false), Current: 0, } diff --git a/system/widget.go b/system/widget.go index 34d72103..d780dcc0 100644 --- a/system/widget.go +++ b/system/widget.go @@ -20,7 +20,7 @@ type Widget struct { func NewWidget(builtAt, version string) *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" System ", "system"), + TextWidget: wtf.NewTextWidget(" System ", "system", false), BuiltAt: builtAt, Version: version, } diff --git a/textfile/widget.go b/textfile/widget.go index 454a0642..eea0a2fb 100644 --- a/textfile/widget.go +++ b/textfile/widget.go @@ -19,7 +19,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" 📄 Text File ", "textfile"), + TextWidget: wtf.NewTextWidget(" 📄 Text File ", "textfile", true), FilePath: Config.UString("wtf.mods.textfile.filename"), } diff --git a/todo/widget.go b/todo/widget.go index 171f28ce..683bdcd2 100644 --- a/todo/widget.go +++ b/todo/widget.go @@ -23,7 +23,7 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" 📝 Todo ", "todo"), + TextWidget: wtf.NewTextWidget(" 📝 Todo ", "todo", true), FilePath: Config.UString("wtf.mods.todo.filename"), list: &List{selected: -1}, diff --git a/weather/widget.go b/weather/widget.go index 788ffa19..52cf7107 100644 --- a/weather/widget.go +++ b/weather/widget.go @@ -25,7 +25,7 @@ type Widget struct { // NewWidget creates and returns a new instance of the weather Widget. func NewWidget() *Widget { widget := Widget{ - TextWidget: wtf.NewTextWidget(" Weather ", "weather"), + TextWidget: wtf.NewTextWidget(" Weather ", "weather", true), APIKey: os.Getenv("WTF_OWM_API_KEY"), Idx: 0, } diff --git a/wtf/focus_tracker.go b/wtf/focus_tracker.go index 120f3c7d..5abbcc88 100644 --- a/wtf/focus_tracker.go +++ b/wtf/focus_tracker.go @@ -35,10 +35,10 @@ func (tracker *FocusTracker) Prev() { tracker.focus(tracker.Idx) } -/* -------------------- Exported Functions -------------------- */ +/* -------------------- Unexported Functions -------------------- */ func (tracker *FocusTracker) blur(idx int) { - view := tracker.Widgets[idx].TextView() + view := tracker.focusable()[idx].TextView() view.Blur() view.SetBorderColor(ColorFor(Config.UString("wtf.colors.border.normal", "gray"))) } @@ -47,20 +47,32 @@ func (tracker *FocusTracker) decrement() { tracker.Idx = tracker.Idx - 1 if tracker.Idx < 0 { - tracker.Idx = len(tracker.Widgets) - 1 + tracker.Idx = len(tracker.focusable()) - 1 } } func (tracker *FocusTracker) focus(idx int) { - view := tracker.Widgets[idx].TextView() + view := tracker.focusable()[idx].TextView() tracker.App.SetFocus(view) view.SetBorderColor(ColorFor(Config.UString("wtf.colors.border.focus", "gray"))) } +func (tracker *FocusTracker) focusable() []TextViewer { + focusable := []TextViewer{} + + for _, widget := range tracker.Widgets { + if widget.Focusable() { + focusable = append(focusable, widget) + } + } + + return focusable +} + func (tracker *FocusTracker) increment() { tracker.Idx = tracker.Idx + 1 - if tracker.Idx == len(tracker.Widgets) { + if tracker.Idx == len(tracker.focusable()) { tracker.Idx = 0 } } diff --git a/wtf/text_viewer.go b/wtf/text_viewer.go index 70839e9d..6a85af50 100644 --- a/wtf/text_viewer.go +++ b/wtf/text_viewer.go @@ -9,7 +9,7 @@ type TextViewer interface { Enabler Scheduler - //Refresh() + Focusable() bool TextView() *tview.TextView Top() int diff --git a/wtf/text_widget.go b/wtf/text_widget.go index f0703294..c1967ea0 100644 --- a/wtf/text_widget.go +++ b/wtf/text_widget.go @@ -13,6 +13,7 @@ var Config *config.Config type TextWidget struct { enabled bool + focusable bool Name string RefreshedAt time.Time RefreshInt int @@ -21,9 +22,10 @@ type TextWidget struct { Position } -func NewTextWidget(name string, configKey string) TextWidget { +func NewTextWidget(name string, configKey string, focusable bool) TextWidget { widget := TextWidget{ enabled: Config.UBool(fmt.Sprintf("wtf.mods.%s.enabled", configKey), false), + focusable: focusable, Name: name, RefreshInt: Config.UInt(fmt.Sprintf("wtf.mods.%s.refreshInterval", configKey)), Position: Position{ @@ -49,6 +51,10 @@ func (widget *TextWidget) Enabled() bool { return widget.enabled } +func (widget *TextWidget) Focusable() bool { + return widget.focusable +} + func (widget *TextWidget) RefreshInterval() int { return widget.RefreshInt } From 71f9b2ddf1cdd7fdafe2944c4c16de4145241240 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Sun, 29 Apr 2018 07:22:32 -0700 Subject: [PATCH 2/2] Thunderstorm added to weather icons --- weather/widget.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weather/widget.go b/weather/widget.go index 52cf7107..c0608308 100644 --- a/weather/widget.go +++ b/weather/widget.go @@ -186,6 +186,8 @@ func (widget *Widget) icon(data *owm.CurrentWeatherData) string { icon = "❄ïļ" case "sunny": icon = "☀ïļ" + case "thunderstorm": + icon = "⛈" default: icon = "ðŸ’Ĩ" }