From b981ccf9eda43816ae9d809466fe96c8e0c2475b Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 21 Jun 2019 16:30:20 +0200 Subject: [PATCH] ui/input: support single stepping through events Change input.Events interface to return one event at a time until the queue is empty. Change text.Editor and gestures to match. Re-add Editor.Submit while we're here; we don't want to enable submit mode always. Signed-off-by: Elias Naur --- ui/gesture/gestures.go | 16 ++++++++++++---- ui/input/input.go | 2 +- ui/input/queue.go | 10 ++++++++-- ui/text/editor.go | 9 +++++++-- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/ui/gesture/gestures.go b/ui/gesture/gestures.go index fa88feba..2d7ae595 100644 --- a/ui/gesture/gestures.go +++ b/ui/gesture/gestures.go @@ -83,8 +83,12 @@ func (c *Click) Add(ops *ui.Ops) { func (c *Click) Update(q input.Events) []ClickEvent { var events []ClickEvent - for _, e := range q.For(c) { - e, ok := e.(pointer.Event) + for { + evt, ok := q.Next(c) + if !ok { + break + } + e, ok := evt.(pointer.Event) if !ok { continue } @@ -135,8 +139,12 @@ func (s *Scroll) Update(cfg *ui.Config, q input.Events, axis Axis) int { return 0 } total := 0 - for _, e := range q.For(s) { - e, ok := e.(pointer.Event) + for { + evt, ok := q.Next(s) + if !ok { + break + } + e, ok := evt.(pointer.Event) if !ok { continue } diff --git a/ui/input/input.go b/ui/input/input.go index 0458c64f..80db1d15 100644 --- a/ui/input/input.go +++ b/ui/input/input.go @@ -7,7 +7,7 @@ package input // Events maps an event handler key to the events // available to the handler. type Events interface { - For(k Key) []Event + Next(k Key) (Event, bool) } // Key is the stable identifier for an event handler. For a handler h, the diff --git a/ui/input/queue.go b/ui/input/queue.go index eacd275f..0ea2b4dd 100644 --- a/ui/input/queue.go +++ b/ui/input/queue.go @@ -19,8 +19,14 @@ type Queue struct { type handlerEvents map[Key][]Event -func (q *Queue) For(k Key) []Event { - return q.handlers[k] +func (q *Queue) Next(k Key) (Event, bool) { + events := q.handlers[k] + if len(events) == 0 { + return nil, false + } + e := events[0] + q.handlers[k] = events[1:] + return e, true } func (q *Queue) Frame(ops *ui.Ops) { diff --git a/ui/text/editor.go b/ui/text/editor.go index 9a2bd3ae..7da1f4cf 100644 --- a/ui/text/editor.go +++ b/ui/text/editor.go @@ -25,6 +25,7 @@ type Editor struct { Face Face Alignment Alignment SingleLine bool + Submit bool oldCfg ui.Config blinkStart time.Time @@ -103,7 +104,11 @@ func (e *Editor) Next() (EditorEvent, bool) { } } stop := (sdist > 0 && soff >= smax) || (sdist < 0 && soff <= smin) - for _, ke := range e.Inputs.For(e) { + for { + ke, ok := e.Inputs.Next(e) + if !ok { + break + } e.blinkStart = e.Config.Now switch ke := ke.(type) { case key.Focus: @@ -112,7 +117,7 @@ func (e *Editor) Next() (EditorEvent, bool) { if !e.focused { break } - if ke.Name == key.NameReturn || ke.Name == key.NameEnter { + if e.Submit && (ke.Name == key.NameReturn || ke.Name == key.NameEnter) { if !ke.Modifiers.Contain(key.ModShift) { return Submit{}, true }