diff --git a/app/window.go b/app/window.go index dd5128b8..aae43139 100644 --- a/app/window.go +++ b/app/window.go @@ -565,19 +565,19 @@ func (c *callbacks) SetEditorSnippet(r key.Range) { c.Event(key.SnippetEvent(r)) } -func (w *Window) moveFocus(dir input.FocusDirection, d driver) { +func (w *Window) moveFocus(dir key.FocusDirection, d driver) { if w.queue.MoveFocus(dir) { w.queue.RevealFocus(w.viewport) } else { var v image.Point switch dir { - case input.FocusRight: + case key.FocusRight: v = image.Pt(+1, 0) - case input.FocusLeft: + case key.FocusLeft: v = image.Pt(-1, 0) - case input.FocusDown: + case key.FocusDown: v = image.Pt(0, +1) - case input.FocusUp: + case key.FocusUp: v = image.Pt(0, -1) default: return @@ -895,17 +895,17 @@ func (w *Window) processEvent(d driver, e event.Event) bool { isMobile := runtime.GOOS == "ios" || runtime.GOOS == "android" switch { case e.Name == key.NameTab && e.Modifiers == 0: - w.moveFocus(input.FocusForward, d) + w.moveFocus(key.FocusForward, d) case e.Name == key.NameTab && e.Modifiers == key.ModShift: - w.moveFocus(input.FocusBackward, d) + w.moveFocus(key.FocusBackward, d) case e.Name == key.NameUpArrow && e.Modifiers == 0 && isMobile: - w.moveFocus(input.FocusUp, d) + w.moveFocus(key.FocusUp, d) case e.Name == key.NameDownArrow && e.Modifiers == 0 && isMobile: - w.moveFocus(input.FocusDown, d) + w.moveFocus(key.FocusDown, d) case e.Name == key.NameLeftArrow && e.Modifiers == 0 && isMobile: - w.moveFocus(input.FocusLeft, d) + w.moveFocus(key.FocusLeft, d) case e.Name == key.NameRightArrow && e.Modifiers == 0 && isMobile: - w.moveFocus(input.FocusRight, d) + w.moveFocus(key.FocusRight, d) default: handled = false } diff --git a/io/input/key.go b/io/input/key.go index 45bcc15d..2daebeaf 100644 --- a/io/input/key.go +++ b/io/input/key.go @@ -65,17 +65,6 @@ const ( TextInputOpen ) -type FocusDirection int - -const ( - FocusRight FocusDirection = iota - FocusLeft - FocusUp - FocusDown - FocusForward - FocusBackward -) - // InputState returns the last text input state as // determined in Frame. func (q *keyQueue) InputState() TextInputState { @@ -171,7 +160,7 @@ func (q *keyQueue) updateFocusLayout() { } // MoveFocus attempts to move the focus in the direction of dir, returning true if it succeeds. -func (q *keyQueue) MoveFocus(dir FocusDirection, events *handlerEvents) bool { +func (q *keyQueue) MoveFocus(dir key.FocusDirection, events *handlerEvents) bool { if len(q.dirOrder) == 0 { return false } @@ -181,17 +170,17 @@ func (q *keyQueue) MoveFocus(dir FocusDirection, events *handlerEvents) bool { } focus := q.dirOrder[order] switch dir { - case FocusForward, FocusBackward: + case key.FocusForward, key.FocusBackward: if len(q.order) == 0 { break } order := 0 - if dir == FocusBackward { + if dir == key.FocusBackward { order = -1 } if q.focus != nil { order = q.handlers[q.focus].order - if dir == FocusForward { + if dir == key.FocusForward { order++ } else { order-- @@ -200,11 +189,11 @@ func (q *keyQueue) MoveFocus(dir FocusDirection, events *handlerEvents) bool { order = (order + len(q.order)) % len(q.order) q.setFocus(q.order[order], events) return true - case FocusRight, FocusLeft: + case key.FocusRight, key.FocusLeft: next := order if q.focus != nil { next = order + 1 - if dir == FocusLeft { + if dir == key.FocusLeft { next = order - 1 } } @@ -215,9 +204,9 @@ func (q *keyQueue) MoveFocus(dir FocusDirection, events *handlerEvents) bool { return true } } - case FocusUp, FocusDown: + case key.FocusUp, key.FocusDown: delta := +1 - if dir == FocusUp { + if dir == key.FocusUp { delta = -1 } nextRow := 0 diff --git a/io/input/key_test.go b/io/input/key_test.go index a2174b0f..2885ee2c 100644 --- a/io/input/key_test.go +++ b/io/input/key_test.go @@ -241,26 +241,26 @@ func TestDirectionalFocus(t *testing.T) { } r.Frame(ops) - r.MoveFocus(FocusLeft) + r.MoveFocus(key.FocusLeft) assertFocus(t, r, &handlers[0]) - r.MoveFocus(FocusLeft) + r.MoveFocus(key.FocusLeft) assertFocus(t, r, &handlers[0]) - r.MoveFocus(FocusRight) + r.MoveFocus(key.FocusRight) assertFocus(t, r, &handlers[1]) - r.MoveFocus(FocusRight) + r.MoveFocus(key.FocusRight) assertFocus(t, r, &handlers[1]) - r.MoveFocus(FocusDown) + r.MoveFocus(key.FocusDown) assertFocus(t, r, &handlers[2]) - r.MoveFocus(FocusDown) + r.MoveFocus(key.FocusDown) assertFocus(t, r, &handlers[2]) - r.MoveFocus(FocusLeft) + r.MoveFocus(key.FocusLeft) assertFocus(t, r, &handlers[3]) - r.MoveFocus(FocusUp) + r.MoveFocus(key.FocusUp) assertFocus(t, r, &handlers[0]) - r.MoveFocus(FocusForward) + r.MoveFocus(key.FocusForward) assertFocus(t, r, &handlers[1]) - r.MoveFocus(FocusBackward) + r.MoveFocus(key.FocusBackward) assertFocus(t, r, &handlers[0]) } @@ -285,7 +285,7 @@ func TestFocusScroll(t *testing.T) { parent.Pop() r.Frame(ops) - r.MoveFocus(FocusLeft) + r.MoveFocus(key.FocusLeft) r.RevealFocus(image.Rect(0, 0, 15, 40)) evts := r.Events(h) assertScrollEvent(t, evts[len(evts)-1], f32.Pt(6, -9)) @@ -305,14 +305,14 @@ func TestFocusClick(t *testing.T) { cl.Pop() r.Frame(ops) - r.MoveFocus(FocusLeft) + r.MoveFocus(key.FocusLeft) r.ClickFocus() assertEventPointerTypeSequence(t, r.Events(h), pointer.Cancel, pointer.Press, pointer.Release) } func TestNoFocus(t *testing.T) { r := new(Router) - r.MoveFocus(FocusForward) + r.MoveFocus(key.FocusForward) } func TestKeyRouting(t *testing.T) { diff --git a/io/input/router.go b/io/input/router.go index 6c07c716..dacb4c10 100644 --- a/io/input/router.go +++ b/io/input/router.go @@ -236,7 +236,7 @@ func (q *Router) queueKeyEvent(e key.Event) { } } -func (q *Router) MoveFocus(dir FocusDirection) bool { +func (q *Router) MoveFocus(dir key.FocusDirection) bool { return q.key.queue.MoveFocus(dir, &q.handlers) } diff --git a/io/key/key.go b/io/key/key.go index 5ba60b7b..f02893aa 100644 --- a/io/key/key.go +++ b/io/key/key.go @@ -225,6 +225,17 @@ const ( NameBack = "Back" ) +type FocusDirection int + +const ( + FocusRight FocusDirection = iota + FocusLeft + FocusUp + FocusDown + FocusForward + FocusBackward +) + // Contain reports whether m contains all modifiers // in m2. func (m Modifiers) Contain(m2 Modifiers) bool {