Skip to content

Commit eddad92

Browse files
committed
Refactor collections.
1 parent 2b3c84e commit eddad92

2 files changed

Lines changed: 51 additions & 30 deletions

File tree

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using System.Collections.ObjectModel;
1+
using System;
2+
using System.Collections.ObjectModel;
23
using System.Collections.Specialized;
4+
using System.Runtime.CompilerServices;
35
using UnityEngine.UIElements;
46
using UnityMvvmToolkit.Common.Extensions;
57
using UnityMvvmToolkit.Common.Interfaces;
@@ -46,12 +48,13 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider)
4648

4749
_itemsSource.Value.CollectionChanged -= OnItemsCollectionChanged;
4850

49-
objectProvider.ReturnReadOnlyProperty(_itemsSource);
50-
5151
makeItem -= MakeItem;
5252
bindItem -= BindItem;
5353
unbindItem -= UnbindItem;
54-
Clear();
54+
55+
ClearItems();
56+
57+
objectProvider.ReturnReadOnlyProperty(_itemsSource);
5558

5659
_itemsSource = null;
5760
_itemTemplate = null;
@@ -63,13 +66,14 @@ protected virtual VisualElement MakeItem(VisualTreeAsset itemTemplate)
6366
return itemTemplate.InstantiateBindableElement(); // TODO: Pool.
6467
}
6568

66-
protected virtual void BindItem(VisualElement item, TItemBindingContext bindingContext,
69+
protected virtual void BindItem(VisualElement item, int index, TItemBindingContext bindingContext,
6770
IObjectProvider objectProvider)
6871
{
6972
item.SetBindingContext(bindingContext, objectProvider, true);
7073
}
7174

72-
protected virtual void UnbindItem(VisualElement item, IObjectProvider objectProvider)
75+
protected virtual void UnbindItem(VisualElement item, int index, TItemBindingContext bindingContext,
76+
IObjectProvider objectProvider)
7377
{
7478
item.ResetBindingContext(objectProvider, true);
7579
}
@@ -81,17 +85,23 @@ private VisualElement MakeItem()
8185

8286
private void BindItem(VisualElement item, int index)
8387
{
84-
BindItem(item, _itemsSource.Value[index], _objectProvider);
88+
BindItem(item, index, _itemsSource.Value[index], _objectProvider);
8589
}
8690

8791
private void UnbindItem(VisualElement item, int index)
8892
{
89-
UnbindItem(item, _objectProvider);
93+
UnbindItem(item, index, _itemsSource.Value[index], _objectProvider);
9094
}
9195

9296
private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
9397
{
9498
RefreshItems(); // TODO: Do not refresh all items.
9599
}
100+
101+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
102+
private void ClearItems()
103+
{
104+
itemsSource = Array.Empty<TItemBindingContext>();
105+
}
96106
}
97107
}

src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements
1616
public abstract partial class BindableScrollView<TItemBindingContext> : ScrollView, IBindableElement,
1717
IInitializable, IDisposable where TItemBindingContext : ICollectionItem
1818
{
19+
private int _itemsCount;
20+
1921
private VisualTreeAsset _itemTemplate;
2022

2123
private PropertyBindingData _itemsSourceBindingData;
@@ -35,7 +37,16 @@ public virtual void Initialize()
3537

3638
public virtual void Dispose()
3739
{
38-
ClearItems();
40+
if (_itemsSource == null)
41+
{
42+
_itemsCount = 0;
43+
_itemAssets.Clear();
44+
}
45+
else
46+
{
47+
ClearItems(_itemsSource.Value);
48+
}
49+
3950
_itemAssetsPool.Dispose();
4051
}
4152

@@ -63,9 +74,9 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider)
6374

6475
_itemsSource.Value.CollectionChanged -= OnItemsCollectionChanged;
6576

66-
objectProvider.ReturnReadOnlyProperty(_itemsSource);
77+
ClearItems(_itemsSource.Value);
6778

68-
ClearItems();
79+
objectProvider.ReturnReadOnlyProperty(_itemsSource);
6980

7081
_itemsSource = null;
7182
_itemTemplate = null;
@@ -77,13 +88,14 @@ protected virtual VisualElement MakeItem(VisualTreeAsset itemTemplate)
7788
return itemTemplate.InstantiateBindableElement();
7889
}
7990

80-
protected virtual void BindItem(VisualElement item, TItemBindingContext bindingContext,
91+
protected virtual void BindItem(VisualElement item, int index, TItemBindingContext bindingContext,
8192
IObjectProvider objectProvider)
8293
{
8394
item.SetBindingContext(bindingContext, objectProvider, true);
8495
}
8596

86-
protected virtual void UnbindItem(VisualElement item, IObjectProvider objectProvider)
97+
protected virtual void UnbindItem(VisualElement item, int index, TItemBindingContext bindingContext,
98+
IObjectProvider objectProvider)
8799
{
88100
item.ResetBindingContext(objectProvider, true);
89101
}
@@ -122,33 +134,37 @@ private void AddItems(IEnumerable<TItemBindingContext> items)
122134
private void AddItem(TItemBindingContext itemBindingContext)
123135
{
124136
var item = _itemAssetsPool.Get();
125-
BindItem(item, itemBindingContext, _objectProvider);
137+
BindItem(item, _itemsCount, itemBindingContext, _objectProvider);
126138

139+
_itemsCount++;
127140
_itemAssets.Add(itemBindingContext.Id, item);
141+
128142
contentContainer.Add(item);
129143
}
130144

131145
[MethodImpl(MethodImplOptions.AggressiveInlining)]
132146
private void RemoveItem(TItemBindingContext itemBindingContext)
133147
{
134-
_itemAssetsPool.Release(_itemAssets[itemBindingContext.Id]);
148+
_itemsCount--;
149+
150+
var item = _itemAssets[itemBindingContext.Id];
151+
152+
if (_objectProvider != null)
153+
{
154+
UnbindItem(item, _itemsCount, itemBindingContext, _objectProvider);
155+
}
156+
135157
_itemAssets.Remove(itemBindingContext.Id);
158+
_itemAssetsPool.Release(item);
136159
}
137160

138161
[MethodImpl(MethodImplOptions.AggressiveInlining)]
139-
private void ClearItems()
162+
private void ClearItems(IReadOnlyList<TItemBindingContext> items)
140163
{
141-
if (_itemAssets.Count == 0)
164+
for (var i = items.Count - 1; i >= 0; i--)
142165
{
143-
return;
166+
RemoveItem(items[i]);
144167
}
145-
146-
foreach (var asset in _itemAssets)
147-
{
148-
_itemAssetsPool.Release(asset.Value);
149-
}
150-
151-
_itemAssets.Clear();
152168
}
153169

154170
private VisualElement OnPoolInstantiateItem()
@@ -158,11 +174,6 @@ private VisualElement OnPoolInstantiateItem()
158174

159175
private void OnPooReleaseItem(VisualElement item)
160176
{
161-
if (_objectProvider != null)
162-
{
163-
UnbindItem(item, _objectProvider);
164-
}
165-
166177
item.RemoveFromHierarchy();
167178
}
168179

0 commit comments

Comments
 (0)