diff --git a/data/binding/bindlists.go b/data/binding/bindlists.go index 0e61313451..38ee6e4e48 100644 --- a/data/binding/bindlists.go +++ b/data/binding/bindlists.go @@ -42,16 +42,7 @@ func NewBoolList() BoolList { // // Since: 2.0 func BindBoolList(v *[]bool) ExternalBoolList { - if v == nil { - return NewBoolList().(ExternalBoolList) - } - - b := newExternalListComparable(v) - for i := range *v { - b.appendItem(bindListItemComparable[bool](v, i, b.updateExternal)) - } - - return b + return bindListComparable(v) } // BytesList supports binding a list of []byte values. @@ -90,16 +81,7 @@ func NewBytesList() BytesList { // // Since: 2.2 func BindBytesList(v *[][]byte) ExternalBytesList { - if v == nil { - return NewBytesList().(ExternalBytesList) - } - - b := newExternalList(v, bytes.Equal) - for i := range *v { - b.appendItem(bindListItem(v, i, b.updateExternal, bytes.Equal)) - } - - return b + return bindList(v, bytes.Equal) } // FloatList supports binding a list of float64 values. @@ -138,16 +120,7 @@ func NewFloatList() FloatList { // // Since: 2.0 func BindFloatList(v *[]float64) ExternalFloatList { - if v == nil { - return NewFloatList().(ExternalFloatList) - } - - b := newExternalListComparable(v) - for i := range *v { - b.appendItem(bindListItemComparable(v, i, b.updateExternal)) - } - - return b + return bindListComparable(v) } // IntList supports binding a list of int values. @@ -186,16 +159,7 @@ func NewIntList() IntList { // // Since: 2.0 func BindIntList(v *[]int) ExternalIntList { - if v == nil { - return NewIntList().(ExternalIntList) - } - - b := newExternalListComparable(v) - for i := range *v { - b.appendItem(bindListItemComparable(v, i, b.updateExternal)) - } - - return b + return bindListComparable(v) } // RuneList supports binding a list of rune values. @@ -285,16 +249,7 @@ func NewStringList() StringList { // // Since: 2.0 func BindStringList(v *[]string) ExternalStringList { - if v == nil { - return NewStringList().(ExternalStringList) - } - - b := newExternalListComparable(v) - for i := range *v { - b.appendItem(bindListItemComparable(v, i, b.updateExternal)) - } - - return b + return bindListComparable(v) } // UntypedList supports binding a list of any values. @@ -382,14 +337,5 @@ func NewURIList() URIList { // // Since: 2.1 func BindURIList(v *[]fyne.URI) ExternalURIList { - if v == nil { - return NewURIList().(ExternalURIList) - } - - b := newExternalList(v, compareURI) - for i := range *v { - b.appendItem(bindListItem(v, i, b.updateExternal, compareURI)) - } - - return b + return bindList(v, compareURI) } diff --git a/data/binding/generic.go b/data/binding/generic.go index cf79cb74bc..ca918a32ec 100644 --- a/data/binding/generic.go +++ b/data/binding/generic.go @@ -147,18 +147,6 @@ func lookupExistingBinding[T any](key string, p fyne.Preferences) (genericItem[T return nil, false } -type List[T any] interface { - DataList - - Append(value T) error - Get() ([]T, error) - GetValue(index int) (T, error) - Prepend(value T) error - Remove(value T) error - Set(list []T) error - SetValue(index int, value T) error -} - func newList[T any](comparator func(T, T) bool) *boundList[T] { return &boundList[T]{val: new([]T), comparator: comparator} } @@ -171,8 +159,21 @@ func newExternalList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] { return &boundList[T]{val: v, comparator: comparator, updateExternal: true} } -func newExternalListComparable[T bool | float64 | int | rune | string](v *[]T) *boundList[T] { - return newExternalList(v, func(t1, t2 T) bool { return t1 == t2 }) +func bindList[T any](v *[]T, comparator func(T, T) bool) *boundList[T] { + if v == nil { + return newList(comparator) + } + + l := newExternalList(v, comparator) + for i := range *v { + l.appendItem(bindListItem(v, i, l.updateExternal, comparator)) + } + + return l +} + +func bindListComparable[T bool | float64 | int | rune | string](v *[]T) *boundList[T] { + return bindList(v, func(t1, t2 T) bool { return t1 == t2 }) } type boundList[T any] struct {