From 6158a055da6717db65dcaa94b5116afe0467f327 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Mon, 7 May 2018 16:44:16 -0700 Subject: [PATCH] Better focus check code using FocustState enum --- wtf/focus_tracker.go | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/wtf/focus_tracker.go b/wtf/focus_tracker.go index 9d6c328e..43914735 100644 --- a/wtf/focus_tracker.go +++ b/wtf/focus_tracker.go @@ -4,6 +4,14 @@ import ( "github.com/rivo/tview" ) +type FocusState int + +const ( + Widget FocusState = iota + NonWidget + NeverFocused +) + // FocusTracker is used by the app to track which onscreen widget currently has focus, // and to move focus between widgets. type FocusTracker struct { @@ -17,11 +25,13 @@ type FocusTracker struct { // Next sets the focus on the next widget in the widget list. If the current widget is // the last widget, sets focus on the first widget. func (tracker *FocusTracker) Next() { - if tracker.widgetHasFocus() { - tracker.blur(tracker.Idx) - tracker.increment() - tracker.focus(tracker.Idx) + if tracker.focusState() == NonWidget { + return } + + tracker.blur(tracker.Idx) + tracker.increment() + tracker.focus(tracker.Idx) } // None removes focus from the currently-focused widget. @@ -32,11 +42,13 @@ func (tracker *FocusTracker) None() { // Prev sets the focus on the previous widget in the widget list. If the current widget is // the last widget, sets focus on the last widget. func (tracker *FocusTracker) Prev() { - if tracker.widgetHasFocus() { - tracker.blur(tracker.Idx) - tracker.decrement() - tracker.focus(tracker.Idx) + if tracker.focusState() == NonWidget { + return } + + tracker.blur(tracker.Idx) + tracker.decrement() + tracker.focus(tracker.Idx) } func (tracker *FocusTracker) Refocus() { @@ -107,16 +119,17 @@ func (tracker *FocusTracker) increment() { // widgetHasFocus returns true if one of the widgets currently has the app's focus, // false if none of them do (ie: perhaps a modal dialog currently has it instead) -func (tracker *FocusTracker) widgetHasFocus() bool { +// If there's no index, it returns true because focus has never been assigned +func (tracker *FocusTracker) focusState() FocusState { if tracker.Idx < 0 { - return true + return NeverFocused } for _, widget := range tracker.Widgets { if widget.TextView() == tracker.App.GetFocus() { - return true + return Widget } } - return false + return NonWidget }