forked from joejulian/gio
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:
+5
-1
@@ -163,7 +163,11 @@ func (b *Clickable) Update(gtx layout.Context) []Click {
|
||||
if b.focused {
|
||||
filters = append(filters, key.Filter{Name: key.NameReturn}, key.Filter{Name: key.NameSpace})
|
||||
}
|
||||
for _, e := range gtx.Events(&b.keyTag, filters...) {
|
||||
for {
|
||||
e, ok := gtx.Event(&b.keyTag, filters...)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
switch e := e.(type) {
|
||||
case key.FocusEvent:
|
||||
b.focused = e.Focus
|
||||
|
||||
+6
-2
@@ -65,8 +65,12 @@ func (d *Draggable) Update(gtx layout.Context) (mime string, requested bool) {
|
||||
}
|
||||
d.pos = pos
|
||||
|
||||
for _, ev := range gtx.Events(&d.handle, transfer.SourceFilter{Type: d.Type}) {
|
||||
if e, ok := ev.(transfer.RequestEvent); ok {
|
||||
for {
|
||||
e, ok := gtx.Event(&d.handle, transfer.SourceFilter{Type: d.Type})
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
if e, ok := e.(transfer.RequestEvent); ok {
|
||||
return e.Type, true
|
||||
}
|
||||
}
|
||||
|
||||
+13
-7
@@ -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")
|
||||
|
||||
+5
-1
@@ -380,7 +380,11 @@ func (e *Editor) processKey(gtx layout.Context) {
|
||||
}
|
||||
// adjust keeps track of runes dropped because of MaxLen.
|
||||
var adjust int
|
||||
for _, ke := range gtx.Events(&e.eventKey, filters...) {
|
||||
for {
|
||||
ke, ok := gtx.Event(&e.eventKey, filters...)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
e.blinkStart = gtx.Now
|
||||
switch ke := ke.(type) {
|
||||
case key.FocusEvent:
|
||||
|
||||
+5
-1
@@ -66,7 +66,11 @@ func (e *Enum) Update(gtx layout.Context) bool {
|
||||
if e.focused && e.focus == state.key {
|
||||
filters = append(filters, key.Filter{Name: key.NameReturn}, key.Filter{Name: key.NameSpace})
|
||||
}
|
||||
for _, ev := range gtx.Events(&state.tag, filters...) {
|
||||
for {
|
||||
ev, ok := gtx.Event(&state.tag, filters...)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
switch ev := ev.(type) {
|
||||
case key.FocusEvent:
|
||||
if ev.Focus {
|
||||
|
||||
@@ -109,7 +109,11 @@ func ExampleDraggable_Layout() {
|
||||
ds.Pop()
|
||||
|
||||
// Check for the received data.
|
||||
for _, ev := range gtx.Events(&drop, transfer.TargetFilter{Type: mime}) {
|
||||
for {
|
||||
ev, ok := gtx.Event(&drop, transfer.TargetFilter{Type: mime})
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
switch e := ev.(type) {
|
||||
case transfer.DataEvent:
|
||||
data := e.Open()
|
||||
|
||||
@@ -319,7 +319,11 @@ func (e *Selectable) processKey(gtx layout.Context) {
|
||||
key.Filter{Name: "A", Required: key.ModShortcut},
|
||||
)
|
||||
}
|
||||
for _, ke := range gtx.Events(e, filters...) {
|
||||
for {
|
||||
ke, ok := gtx.Event(e, filters...)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
switch ke := ke.(type) {
|
||||
case key.FocusEvent:
|
||||
e.focused = ke.Focus
|
||||
|
||||
Reference in New Issue
Block a user