mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Better focus check code using FocustState enum
This commit is contained in:
parent
6be6afaf2c
commit
6158a055da
@ -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() {
|
||||
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() {
|
||||
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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user