ui/input: move Router and input queues to internal package

Now that only app.Window needs the Router, make it unavailable for
clients.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-07-12 13:51:00 +02:00
parent 0d924a1950
commit cbdda4e9c5
4 changed files with 23 additions and 19 deletions
@@ -4,13 +4,14 @@ package input
import ( import (
"gioui.org/ui" "gioui.org/ui"
"gioui.org/ui/input"
"gioui.org/ui/internal/ops" "gioui.org/ui/internal/ops"
"gioui.org/ui/key" "gioui.org/ui/key"
) )
type keyQueue struct { type keyQueue struct {
focus Key focus input.Key
handlers map[Key]*keyHandler handlers map[input.Key]*keyHandler
reader ui.OpsReader reader ui.OpsReader
state key.TextInputState state key.TextInputState
} }
@@ -36,7 +37,7 @@ func (q *keyQueue) InputState() key.TextInputState {
func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) { func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
if q.handlers == nil { if q.handlers == nil {
q.handlers = make(map[Key]*keyHandler) q.handlers = make(map[input.Key]*keyHandler)
} }
for _, h := range q.handlers { for _, h := range q.handlers {
h.active = false h.active = false
@@ -76,15 +77,15 @@ func (q *keyQueue) Frame(root *ui.Ops, events handlerEvents) {
} }
} }
func (q *keyQueue) Push(e Event, events handlerEvents) { func (q *keyQueue) Push(e input.Event, events handlerEvents) {
if q.focus == nil { if q.focus == nil {
return return
} }
events[q.focus] = append(events[q.focus], e) events[q.focus] = append(events[q.focus], e)
} }
func (q *keyQueue) resolveFocus(events handlerEvents) (Key, listenerPriority, bool) { func (q *keyQueue) resolveFocus(events handlerEvents) (input.Key, listenerPriority, bool) {
var k Key var k input.Key
var pri listenerPriority var pri listenerPriority
var hide bool var hide bool
loop: loop:
@@ -111,7 +112,7 @@ loop:
h = new(keyHandler) h = new(keyHandler)
q.handlers[op.Key] = h q.handlers[op.Key] = h
// Reset the handler on (each) first appearance. // Reset the handler on (each) first appearance.
events[op.Key] = []Event{key.FocusEvent{Focus: false}} events[op.Key] = []input.Event{key.FocusEvent{Focus: false}}
} }
h.active = true h.active = true
case ops.TypeHideInput: case ops.TypeHideInput:
@@ -8,6 +8,7 @@ import (
"gioui.org/ui" "gioui.org/ui"
"gioui.org/ui/f32" "gioui.org/ui/f32"
"gioui.org/ui/input"
"gioui.org/ui/internal/ops" "gioui.org/ui/internal/ops"
"gioui.org/ui/pointer" "gioui.org/ui/pointer"
) )
@@ -15,10 +16,10 @@ import (
type pointerQueue struct { type pointerQueue struct {
hitTree []hitNode hitTree []hitNode
areas []areaNode areas []areaNode
handlers map[Key]*pointerHandler handlers map[input.Key]*pointerHandler
pointers []pointerInfo pointers []pointerInfo
reader ui.OpsReader reader ui.OpsReader
scratch []Key scratch []input.Key
} }
type hitNode struct { type hitNode struct {
@@ -28,13 +29,13 @@ type hitNode struct {
pass bool pass bool
// For handler nodes. // For handler nodes.
key Key key input.Key
} }
type pointerInfo struct { type pointerInfo struct {
id pointer.ID id pointer.ID
pressed bool pressed bool
handlers []Key handlers []input.Key
} }
type pointerHandler struct { type pointerHandler struct {
@@ -102,7 +103,7 @@ func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events handlerEvents, t
if !ok { if !ok {
h = new(pointerHandler) h = new(pointerHandler)
q.handlers[op.Key] = h q.handlers[op.Key] = h
events[op.Key] = []Event{pointer.Event{Type: pointer.Cancel}} events[op.Key] = []input.Event{pointer.Event{Type: pointer.Cancel}}
} }
h.active = true h.active = true
h.area = area h.area = area
@@ -112,7 +113,7 @@ func (q *pointerQueue) collectHandlers(r *ui.OpsReader, events handlerEvents, t
} }
} }
func (q *pointerQueue) opHit(handlers *[]Key, pos f32.Point) { func (q *pointerQueue) opHit(handlers *[]input.Key, pos f32.Point) {
// Track whether we're passing through hits. // Track whether we're passing through hits.
pass := true pass := true
idx := len(q.hitTree) - 1 idx := len(q.hitTree) - 1
@@ -155,7 +156,7 @@ func (a *areaNode) hit(p f32.Point) bool {
func (q *pointerQueue) init() { func (q *pointerQueue) init() {
if q.handlers == nil { if q.handlers == nil {
q.handlers = make(map[Key]*pointerHandler) q.handlers = make(map[input.Key]*pointerHandler)
} }
} }
@@ -176,7 +177,7 @@ func (q *pointerQueue) Frame(root *ui.Ops, events handlerEvents) {
} }
} }
func (q *pointerQueue) dropHandler(k Key) { func (q *pointerQueue) dropHandler(k input.Key) {
delete(q.handlers, k) delete(q.handlers, k)
for i := range q.pointers { for i := range q.pointers {
p := &q.pointers[i] p := &q.pointers[i]
@@ -4,6 +4,7 @@ package input
import ( import (
"gioui.org/ui" "gioui.org/ui"
"gioui.org/ui/input"
"gioui.org/ui/key" "gioui.org/ui/key"
"gioui.org/ui/pointer" "gioui.org/ui/pointer"
) )
@@ -17,9 +18,9 @@ type Router struct {
handlers handlerEvents handlers handlerEvents
} }
type handlerEvents map[Key][]Event type handlerEvents map[input.Key][]input.Event
func (q *Router) Events(k Key) []Event { func (q *Router) Events(k input.Key) []input.Event {
events := q.handlers[k] events := q.handlers[k]
delete(q.handlers, k) delete(q.handlers, k)
return events return events
@@ -34,7 +35,7 @@ func (q *Router) Frame(ops *ui.Ops) {
q.kqueue.Frame(ops, q.handlers) q.kqueue.Frame(ops, q.handlers)
} }
func (q *Router) Add(e Event) { func (q *Router) Add(e input.Event) {
q.init() q.init()
switch e := e.(type) { switch e := e.(type) {
case pointer.Event: case pointer.Event:
+2 -1
View File
@@ -12,6 +12,7 @@ import (
"gioui.org/ui" "gioui.org/ui"
"gioui.org/ui/app/internal/gpu" "gioui.org/ui/app/internal/gpu"
"gioui.org/ui/input" "gioui.org/ui/input"
iinput "gioui.org/ui/app/internal/input"
"gioui.org/ui/internal/ops" "gioui.org/ui/internal/ops"
"gioui.org/ui/key" "gioui.org/ui/key"
) )
@@ -46,7 +47,7 @@ type Window struct {
nextFrame time.Time nextFrame time.Time
delayedDraw *time.Timer delayedDraw *time.Timer
router input.Router router iinput.Router
reader ui.OpsReader reader ui.OpsReader
} }