Skip to content

Commit

Permalink
Merge pull request #5490 from Jacalz/binding-trigger-faster
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacalz authored Feb 5, 2025
2 parents 38596c9 + 0d99434 commit a40055a
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 27 deletions.
30 changes: 18 additions & 12 deletions data/binding/binding.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"sync"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/internal/async"
)

var (
Expand Down Expand Up @@ -58,31 +57,38 @@ func (l *listener) DataChanged() {
}

type base struct {
listeners async.Map[DataListener, bool]
listeners []DataListener

lock sync.RWMutex
}

// AddListener allows a data listener to be informed of changes to this item.
func (b *base) AddListener(l DataListener) {
b.listeners.Store(l, true)
queueItem(l.DataChanged)
queueItem(func() {
b.listeners = append(b.listeners, l)
l.DataChanged()
})
}

// RemoveListener should be called if the listener is no longer interested in being informed of data change events.
func (b *base) RemoveListener(l DataListener) {
b.listeners.Delete(l)
queueItem(func() {
for i, listener := range b.listeners {
if listener == l {
// Delete without preserving order:
lastIndex := len(b.listeners) - 1
b.listeners[i] = b.listeners[lastIndex]
b.listeners[lastIndex] = nil
b.listeners = b.listeners[:lastIndex]
return
}
}
})
}

func (b *base) trigger() {
var listeners []DataListener
b.listeners.Range(func(listener DataListener, _ bool) bool {
listeners = append(listeners, listener)
return true
})

queueItem(func() {
for _, listen := range listeners {
for _, listen := range b.listeners {
listen.DataChanged()
}
})
Expand Down
10 changes: 5 additions & 5 deletions data/binding/binding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ type simpleItem struct {

func TestBase_AddListener(t *testing.T) {
data := &simpleItem{}
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

called := false
fn := NewDataListener(func() {
called = true
})
data.AddListener(fn)
assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))
assert.True(t, called)
}

Expand All @@ -29,11 +29,11 @@ func TestBase_RemoveListener(t *testing.T) {
called = true
})
data := &simpleItem{}
data.listeners.Store(fn, true)
data.listeners = append(data.listeners, fn)

assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))
data.RemoveListener(fn)
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

data.trigger()
assert.False(t, called)
Expand Down
10 changes: 5 additions & 5 deletions data/binding/lists_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ type simpleList struct {

func TestListBase_AddListener(t *testing.T) {
data := &simpleList{}
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

called := false
fn := NewDataListener(func() {
called = true
})
data.AddListener(fn)
assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))

data.trigger()
assert.True(t, called)
Expand Down Expand Up @@ -55,11 +55,11 @@ func TestListBase_RemoveListener(t *testing.T) {
called = true
})
data := &simpleList{}
data.listeners.Store(fn, true)
data.listeners = append(data.listeners, fn)

assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))
data.RemoveListener(fn)
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

data.trigger()
assert.False(t, called)
Expand Down
10 changes: 5 additions & 5 deletions data/binding/trees_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import (

func TestTreeBase_AddListener(t *testing.T) {
data := newSimpleTree()
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

called := false
fn := NewDataListener(func() {
called = true
})
data.AddListener(fn)
assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))

data.trigger()
assert.True(t, called)
Expand Down Expand Up @@ -52,11 +52,11 @@ func TestTreeBase_RemoveListener(t *testing.T) {
called = true
})
data := newSimpleTree()
data.listeners.Store(fn, true)
data.listeners = append(data.listeners, fn)

assert.Equal(t, 1, data.listeners.Len())
assert.Equal(t, 1, len(data.listeners))
data.RemoveListener(fn)
assert.Equal(t, 0, data.listeners.Len())
assert.Equal(t, 0, len(data.listeners))

data.trigger()
assert.False(t, called)
Expand Down

0 comments on commit a40055a

Please sign in to comment.