From 20eddbe6c872fabf50dd751372170d1ee7f3dbd6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 15 May 2019 14:09:09 +0200 Subject: [PATCH 1/4] Added failing test for #2518 --- .../Rendering/DeferredRendererTests.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index 8c103360d4..f094d9c78d 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -325,6 +325,52 @@ namespace Avalonia.Visuals.UnitTests.Rendering context.Verify(x => x.DrawImage(borderLayer, 0.5, It.IsAny(), It.IsAny(), BitmapInterpolationMode.Default)); } + [Fact] + public void Can_Dirty_Control_In_SceneInvalidated() + { + Border border1; + Border border2; + var root = new TestRoot + { + Width = 100, + Height = 100, + Child = new StackPanel + { + Children = + { + (border1 = new Border + { + Background = Brushes.Red, + Child = new Canvas(), + }), + (border2 = new Border + { + Background = Brushes.Red, + Child = new Canvas(), + }), + } + } + }; + + root.Measure(Size.Infinity); + root.Arrange(new Rect(root.DesiredSize)); + + var target = CreateTargetAndRunFrame(root); + var invalidated = false; + + target.SceneInvalidated += (s, e) => + { + invalidated = true; + target.AddDirty(border2); + }; + + target.AddDirty(border1); + target.Paint(new Rect(root.DesiredSize)); + + Assert.True(invalidated); + Assert.True(((IRenderLoopTask)target).NeedsUpdate); + } + private DeferredRenderer CreateTargetAndRunFrame( TestRoot root, Mock timer = null, From 2661e939b1d548fcb4116d025c4f7e87f4684a83 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 15 May 2019 14:10:45 +0200 Subject: [PATCH 2/4] Reset dirty rects before calling SceneInvalidated. When cleared after calling `SceneInvalidated`, any control invalidated during `SceneInvalidated` was be lost. Fixes #2518. --- src/Avalonia.Visuals/Rendering/DeferredRenderer.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 5d1c66f872..c83a8436b4 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -528,6 +528,8 @@ namespace Avalonia.Rendering oldScene?.Dispose(); } + _dirty.Clear(); + if (SceneInvalidated != null) { var rect = new Rect(); @@ -540,10 +542,9 @@ namespace Avalonia.Rendering } } + System.Diagnostics.Debug.WriteLine("Invalidated " + rect); SceneInvalidated(this, new SceneInvalidatedEventArgs((IRenderRoot)_root, rect)); } - - _dirty.Clear(); } else { From c37f2b2fbcd631574140cbe0eb2022fd34f03948 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 15 May 2019 14:31:25 +0200 Subject: [PATCH 3/4] Added failing test for #2522. --- .../Primitives/SelectingItemsControlTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index 2df925301f..037c16e231 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -341,6 +341,33 @@ namespace Avalonia.Controls.UnitTests.Primitives Assert.Equal(-1, target.SelectedIndex); } + [Fact] + public void Moving_Selected_Item_Should_Update_Selection() + { + var items = new AvaloniaList + { + new Item(), + new Item(), + }; + + var target = new SelectingItemsControl + { + Items = items, + Template = Template(), + }; + + target.ApplyTemplate(); + target.SelectedIndex = 0; + + Assert.Equal(items[0], target.SelectedItem); + Assert.Equal(0, target.SelectedIndex); + + items.Move(0, 1); + + Assert.Equal(items[1], target.SelectedItem); + Assert.Equal(1, target.SelectedIndex); + } + [Fact] public void Resetting_Items_Collection_Should_Clear_Selection() { From ba7cec18e37627fe9eb948f3c3870fce447ae13e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 15 May 2019 14:31:44 +0200 Subject: [PATCH 4/4] Handle move in SelectingItemsControl. Fixes #2522. --- src/Avalonia.Controls/Primitives/SelectingItemsControl.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index 280c3ad93a..23d2dc06af 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -380,6 +380,7 @@ namespace Avalonia.Controls.Primitives } break; + case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Reset: SelectedIndex = IndexOf(Items, SelectedItem); break;