ui/app,ui/internal/input: move InvalidateOp summary to Router

In preparation for extracting more op types in Router.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-07-12 15:11:20 +02:00
parent c7eb9be9f3
commit 032e9a380e
2 changed files with 32 additions and 23 deletions
+30
View File
@@ -3,8 +3,11 @@
package input
import (
"time"
"gioui.org/ui"
"gioui.org/ui/input"
"gioui.org/ui/internal/ops"
"gioui.org/ui/key"
"gioui.org/ui/pointer"
)
@@ -16,6 +19,11 @@ type Router struct {
kqueue keyQueue
handlers handlerEvents
reader ui.OpsReader
// InvalidateOp summary.
redraw bool
redrawTime time.Time
}
type handlerEvents struct {
@@ -29,6 +37,10 @@ func (q *Router) Events(k input.Key) []input.Event {
func (q *Router) Frame(ops *ui.Ops) {
q.handlers.Clear()
q.redraw = false
q.reader.Reset(ops)
q.collect()
q.pqueue.Frame(ops, &q.handlers)
q.kqueue.Frame(ops, &q.handlers)
}
@@ -47,6 +59,24 @@ func (q *Router) InputState() key.TextInputState {
return q.kqueue.InputState()
}
func (q *Router) collect() {
for encOp, ok := q.reader.Decode(); ok; encOp, ok = q.reader.Decode() {
switch ops.OpType(encOp.Data[0]) {
case ops.TypeInvalidate:
var op ui.InvalidateOp
op.Decode(encOp.Data)
if !q.redraw || op.At.Before(q.redrawTime) {
q.redraw = true
q.redrawTime = op.At
}
}
}
}
func (q *Router) RedrawTime() (time.Time, bool) {
return q.redrawTime, q.redraw
}
func (h *handlerEvents) init() {
if h.handlers == nil {
h.handlers = make(map[input.Key][]input.Event)