From cd3d002cc9474a8a2cc58b7a897bbe2b03966784 Mon Sep 17 00:00:00 2001 From: donandren Date: Thu, 4 Aug 2016 10:53:11 +0300 Subject: [PATCH 1/4] added failing unit test for #651 --- ...emsPresenterTests_Virtualization_Simple.cs | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 53e81de241..108c029caa 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -554,6 +554,60 @@ namespace Avalonia.Controls.UnitTests.Presenters } } + [Fact] + public void InsertRange_Items_Should_Update_Containers() + { + var target = CreateTarget(useAvaloniaList: true); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList(); + var items = (AvaloniaList)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected, actual); + + var toAdd = Enumerable.Range(0, 3).Select(x => $"New Item {x}").ToList(); + + int index = 1; + + items.InsertRange(index, toAdd); + expected.InsertRange(index, toAdd); + expected.RemoveRange(10, toAdd.Count); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + + [Fact] + public void InsertRange_Items_Before_Last_Should_Update_Containers() + { + var target = CreateTarget(useAvaloniaList: true); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList(); + var items = (AvaloniaList)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected, actual); + + var toAdd = Enumerable.Range(0, 3).Select(x => $"New Item {x}").ToList(); + + int index = 8; + + items.InsertRange(index, toAdd); + expected.InsertRange(index, toAdd); + expected.RemoveRange(10, toAdd.Count); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + public class Vertical { [Fact] @@ -877,4 +931,4 @@ namespace Avalonia.Controls.UnitTests.Presenters } } } -} +} \ No newline at end of file From 1aaea1dd2a0eac634738d4768e3279448efd448f Mon Sep 17 00:00:00 2001 From: donandren Date: Thu, 4 Aug 2016 11:18:45 +0300 Subject: [PATCH 2/4] fixes #651 --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 00d896925a..78ecdb338c 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -116,7 +116,7 @@ namespace Avalonia.Controls.Presenters CreateAndRemoveContainers(); if (e.NewStartingIndex >= FirstIndex && - e.NewStartingIndex + e.NewItems.Count <= NextIndex) + e.NewStartingIndex < NextIndex) { RecycleContainers(); } From 1ed45e8d4346bf4711eef1f449789809d0d41631 Mon Sep 17 00:00:00 2001 From: donandren Date: Thu, 4 Aug 2016 11:29:00 +0300 Subject: [PATCH 3/4] added failing unit test related to #651 for RemoveRange from items --- ...emsPresenterTests_Virtualization_Simple.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 108c029caa..8390ec6c03 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -608,6 +608,56 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(expected, actual); } + [Fact] + public void RemoveRange_Items_Should_Update_Containers() + { + var target = CreateTarget(useAvaloniaList: true); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + var expected = Enumerable.Range(0, 13).Select(x => $"Item {x}").ToList(); + var items = (AvaloniaList)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected.Take(10), actual); + + int index = 5; + int count = 3; + + items.RemoveRange(index, count); + expected.RemoveRange(index, count); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + + [Fact] + public void RemoveRange_Items_Before_Last_Should_Update_Containers() + { + var target = CreateTarget(useAvaloniaList: true); + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + var expected = Enumerable.Range(0, 13).Select(x => $"Item {x}").ToList(); + var items = (AvaloniaList)target.Items; + var actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + + Assert.Equal(expected.Take(10), actual); + + int index = 8; + int count = 3; + + items.RemoveRange(index, count); + expected.RemoveRange(index, count); + + actual = target.Panel.Children.Select(x => x.DataContext).ToList(); + Assert.Equal(expected, actual); + } + public class Vertical { [Fact] From ba8829399d482a519a9174c26710773ce8f7a4ac Mon Sep 17 00:00:00 2001 From: donandren Date: Thu, 4 Aug 2016 11:32:03 +0300 Subject: [PATCH 4/4] fixed problem when Removing range items from virtualized ItemsPresenter related to #651 --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 78ecdb338c..83a0313dd5 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -125,7 +125,7 @@ namespace Avalonia.Controls.Presenters case NotifyCollectionChangedAction.Remove: if (e.OldStartingIndex >= FirstIndex && - e.OldStartingIndex + e.OldItems.Count <= NextIndex) + e.OldStartingIndex < NextIndex) { RecycleContainersOnRemove(); }