From ac3ca7ca292d4e59ca4f373ee04918a8d6da0ee5 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 11 Jun 2017 00:53:54 +0200 Subject: [PATCH] Make LayoutManager pass new tests. --- src/Avalonia.Layout/LayoutManager.cs | 38 +++++++++---------- .../LayoutManagerTests.cs | 31 +++++++++++++++ 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Layout/LayoutManager.cs b/src/Avalonia.Layout/LayoutManager.cs index b7b83bf852..e8fc7acf2a 100644 --- a/src/Avalonia.Layout/LayoutManager.cs +++ b/src/Avalonia.Layout/LayoutManager.cs @@ -124,21 +124,21 @@ namespace Avalonia.Layout private void Measure(ILayoutable control) { - var root = control as ILayoutRoot; - var parent = control.VisualParent as ILayoutable; - - if (root != null) - { - root.Measure(root.MaxClientSize); - } - else if (parent != null) + if (control.VisualParent is ILayoutable parent) { Measure(parent); } if (!control.IsMeasureValid) { - control.Measure(control.PreviousMeasure.Value); + if (control is ILayoutRoot root) + { + root.Measure(Size.Infinity); + } + else if (!control.IsMeasureValid && control.IsAttachedToVisualTree) + { + control.Measure(control.PreviousMeasure.Value); + } } _toMeasure.Remove(control); @@ -146,21 +146,21 @@ namespace Avalonia.Layout private void Arrange(ILayoutable control) { - var root = control as ILayoutRoot; - var parent = control.VisualParent as ILayoutable; - - if (root != null) - { - root.Arrange(new Rect(root.DesiredSize)); - } - else if (parent != null) + if (control.VisualParent is ILayoutable parent) { Arrange(parent); } - if (control.PreviousArrange.HasValue) + if (!control.IsArrangeValid) { - control.Arrange(control.PreviousArrange.Value); + if (control is ILayoutRoot root) + { + root.Arrange(new Rect(control.DesiredSize)); + } + else if (!control.IsArrangeValid && control.IsAttachedToVisualTree) + { + control.Arrange(control.PreviousArrange.Value); + } } _toArrange.Remove(control); diff --git a/tests/Avalonia.Layout.UnitTests/LayoutManagerTests.cs b/tests/Avalonia.Layout.UnitTests/LayoutManagerTests.cs index 45e8803f16..361e7678be 100644 --- a/tests/Avalonia.Layout.UnitTests/LayoutManagerTests.cs +++ b/tests/Avalonia.Layout.UnitTests/LayoutManagerTests.cs @@ -228,6 +228,37 @@ namespace Avalonia.Layout.UnitTests } } + [Fact] + public void Arranges_Root_With_DesiredSize() + { + var target = new LayoutManager(); + + using (Start(target)) + { + var root = new LayoutTestRoot + { + Width = 100, + Height = 100, + }; + + var arrangeSize = default(Size); + + root.DoArrangeOverride = (_, s) => + { + arrangeSize = s; + return s; + }; + + target.ExecuteInitialLayoutPass(root); + Assert.Equal(new Size(100, 100), arrangeSize); + + root.Width = 120; + + target.ExecuteLayoutPass(); + Assert.Equal(new Size(120, 100), arrangeSize); + } + } + [Fact] public void Invalidating_Child_Remeasures_Parent() {