all: [API] deliver events one at a time to allow fine-grained event processing

Processing one event at a time allows a widget to execute commands after
the event that triggered it, instead of after all matching events.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2023-11-24 16:46:39 -06:00
parent bce1dbd654
commit 88f5ac9cb9
14 changed files with 233 additions and 187 deletions
+13 -7
View File
@@ -34,7 +34,7 @@ func TestDraggable(t *testing.T) {
stack.Pop()
drag.Update(gtx)
r.Events(drag, transfer.TargetFilter{Type: drag.Type})
r.Event(drag, transfer.TargetFilter{Type: drag.Type})
r.Frame(gtx.Ops)
r.Queue(
pointer.Event{
@@ -52,21 +52,27 @@ func TestDraggable(t *testing.T) {
)
ofr := &offer{data: "hello"}
drag.Update(gtx)
r.Events(drag, transfer.TargetFilter{Type: drag.Type})
r.Event(drag, transfer.TargetFilter{Type: drag.Type})
drag.Offer(gtx, "file", ofr)
r.Frame(gtx.Ops)
evs := r.Events(drag, transfer.TargetFilter{Type: drag.Type})
if len(evs) != 2 {
t.Fatalf("expected 3 event, got %d", len(evs))
e, ok := r.Event(drag, transfer.TargetFilter{Type: drag.Type})
if !ok {
t.Fatalf("expected event")
}
ev := evs[0].(transfer.DataEvent)
ev := e.(transfer.DataEvent)
if got, want := ev.Type, "file"; got != want {
t.Errorf("expected %v; got %v", got, want)
}
if ofr.closed {
t.Error("offer closed prematurely")
}
e, ok = r.Event(drag, transfer.TargetFilter{Type: drag.Type})
if !ok {
t.Fatalf("expected event")
}
if _, ok := e.(transfer.CancelEvent); !ok {
t.Fatalf("expected transfer.CancelEvent event")
}
r.Frame(gtx.Ops)
if !ofr.closed {
t.Error("offer was not closed")