diff --git a/data/binding/binding.go b/data/binding/binding.go index a0bd790e70..5807b1043c 100644 --- a/data/binding/binding.go +++ b/data/binding/binding.go @@ -9,7 +9,6 @@ import ( "sync" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/internal/async" ) var ( @@ -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() } }) diff --git a/data/binding/binding_test.go b/data/binding/binding_test.go index 9f5fbe2f00..f5073d09c6 100644 --- a/data/binding/binding_test.go +++ b/data/binding/binding_test.go @@ -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) } @@ -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) diff --git a/data/binding/lists_test.go b/data/binding/lists_test.go index ed3632100a..3b6a31c82c 100644 --- a/data/binding/lists_test.go +++ b/data/binding/lists_test.go @@ -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) @@ -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) diff --git a/data/binding/trees_test.go b/data/binding/trees_test.go index 9106bc10f2..dcd2ad97bf 100644 --- a/data/binding/trees_test.go +++ b/data/binding/trees_test.go @@ -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) @@ -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)