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)
+2 -23
View File
@@ -13,7 +13,6 @@ import (
"gioui.org/ui/app/internal/gpu"
iinput "gioui.org/ui/app/internal/input"
"gioui.org/ui/input"
"gioui.org/ui/internal/ops"
"gioui.org/ui/key"
)
@@ -48,7 +47,6 @@ type Window struct {
delayedDraw *time.Timer
router iinput.Router
reader ui.OpsReader
}
// driver is the interface for the platform implementation
@@ -138,8 +136,6 @@ func (w *Window) Draw(root *ui.Ops) {
}
w.gpu.Draw(w.Profiling, size, root)
w.router.Frame(root)
w.reader.Reset(root)
redrawTime, redraw := collectRedraws(&w.reader)
now := time.Now()
w.mu.Lock()
w.setTextInput(w.router.InputState())
@@ -151,30 +147,13 @@ func (w *Window) Draw(root *ui.Ops) {
w.timings = fmt.Sprintf("tot:%7s cpu:%7s %s", frameDur.Round(q), drawDur.Round(q), w.gpu.Timings())
w.setNextFrame(time.Time{})
}
if redraw {
w.setNextFrame(redrawTime)
if t, ok := w.router.RedrawTime(); ok {
w.setNextFrame(t)
}
w.updateAnimation()
w.mu.Unlock()
}
func collectRedraws(r *ui.OpsReader) (time.Time, bool) {
var t time.Time
redraw := false
for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() {
switch ops.OpType(encOp.Data[0]) {
case ops.TypeInvalidate:
var op ui.InvalidateOp
op.Decode(encOp.Data)
if !redraw || op.At.Before(t) {
redraw = true
t = op.At
}
}
}
return t, redraw
}
func (w *Window) Redraw() {
w.mu.Lock()
defer w.mu.Unlock()