From 67003577a0dc9c7aac2326c527f001d075ef9823 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 13 Apr 2018 13:40:56 +0100 Subject: [PATCH 1/4] Add failing unit tests for border and content presenter. --- .../BorderTests.cs | 23 +++++++++++++++++++ .../ContentPresenterTests_Layout.cs | 23 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/BorderTests.cs b/tests/Avalonia.Controls.UnitTests/BorderTests.cs index 3660a7b4ca..4f58e5e780 100644 --- a/tests/Avalonia.Controls.UnitTests/BorderTests.cs +++ b/tests/Avalonia.Controls.UnitTests/BorderTests.cs @@ -20,5 +20,28 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new Size(20, 20), target.DesiredSize); } + + [Fact] + public void Child_Should_Arrange_With_Zero_Height_Width_If_Padding_Greater_Than_Child_Size() + { + Border content; + + var target = new Border + { + Padding = new Thickness(6), + MaxHeight = 12, + MaxWidth = 12, + Content = content = new Border + { + Height = 0, + Width = 0 + } + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 0, 0, 0), content.Bounds); + } } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs index b3c617c4ab..d88716279a 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs @@ -210,5 +210,28 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(new Rect(84, 0, 16, 16), content.Bounds); } + + [Fact] + public void Child_Arrange_With_Zero_Height_When_Padding_Height_Greater_Than_Child_Height() + { + Border content; + var target = new ContentPresenter + { + Padding = 32, + MaxHeight = 32, + MaxWidth = 32, + Content = content = new Border + { + MinWidth = 16, + MinHeight = 16, + }, + }; + + target.UpdateChild(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 0, 0, 0), content.Bounds); + } } } \ No newline at end of file From a98d289af8abcf50e3b29bdd589b92a6e2ccd72a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 13 Apr 2018 13:42:36 +0100 Subject: [PATCH 2/4] Add arrange fix for border and content presenter. --- src/Avalonia.Controls/Border.cs | 3 ++- src/Avalonia.Controls/Presenters/ContentPresenter.cs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/Border.cs b/src/Avalonia.Controls/Border.cs index 06ad8a4837..6bceba3401 100644 --- a/src/Avalonia.Controls/Border.cs +++ b/src/Avalonia.Controls/Border.cs @@ -111,7 +111,8 @@ namespace Avalonia.Controls if (Child != null) { var padding = Padding + BorderThickness; - Child.Arrange(new Rect(finalSize).Deflate(padding)); + var arrangeRect = new Rect(finalSize).Deflate(padding); + Child.Arrange(new Rect(arrangeRect.X, arrangeRect.Y, Math.Max(0, arrangeRect.Width), Math.Max(0, arrangeRect.Height))); } _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius); diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index 6acbc047ae..1c5883d980 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -386,7 +386,7 @@ namespace Avalonia.Controls.Presenters if (verticalContentAlignment != VerticalAlignment.Stretch) { - size = size.WithHeight(Math.Min(size.Height, DesiredSize.Height - padding.Top - padding.Bottom)); + size = size.WithHeight(Math.Min(size.Height, DesiredSize.Height - padding.Top - padding.Bottom)); } if (useLayoutRounding) @@ -425,7 +425,7 @@ namespace Avalonia.Controls.Presenters originY = Math.Floor(originY * scale) / scale; } - Child.Arrange(new Rect(originX, originY, size.Width, size.Height)); + Child.Arrange(new Rect(originX, originY, Math.Max(0, size.Width), Math.Max(0, size.Height))); return finalSize; } From 2c9f3ede54cf7aca8c2fdd8b1e1af437c81aa805 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 13 Apr 2018 14:12:51 +0100 Subject: [PATCH 3/4] fix tests and and fixes. --- src/Avalonia.Controls/Border.cs | 5 ++--- tests/Avalonia.Controls.UnitTests/BorderTests.cs | 7 +++---- .../Presenters/ContentPresenterTests_Layout.cs | 12 +++++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.Controls/Border.cs b/src/Avalonia.Controls/Border.cs index 6bceba3401..e6846978dc 100644 --- a/src/Avalonia.Controls/Border.cs +++ b/src/Avalonia.Controls/Border.cs @@ -110,9 +110,8 @@ namespace Avalonia.Controls { if (Child != null) { - var padding = Padding + BorderThickness; - var arrangeRect = new Rect(finalSize).Deflate(padding); - Child.Arrange(new Rect(arrangeRect.X, arrangeRect.Y, Math.Max(0, arrangeRect.Width), Math.Max(0, arrangeRect.Height))); + var padding = Padding + BorderThickness; + Child.Arrange(new Rect(finalSize).Deflate(padding)); } _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius); diff --git a/tests/Avalonia.Controls.UnitTests/BorderTests.cs b/tests/Avalonia.Controls.UnitTests/BorderTests.cs index 4f58e5e780..9d6c838bc3 100644 --- a/tests/Avalonia.Controls.UnitTests/BorderTests.cs +++ b/tests/Avalonia.Controls.UnitTests/BorderTests.cs @@ -31,17 +31,16 @@ namespace Avalonia.Controls.UnitTests Padding = new Thickness(6), MaxHeight = 12, MaxWidth = 12, - Content = content = new Border + Child = content = new Border { Height = 0, Width = 0 } }; - - target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(0, 0, 0, 0), content.Bounds); + Assert.Equal(new Rect(6, 6, 0, 0), content.Bounds); } } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs index d88716279a..2c1074aa9a 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs @@ -217,21 +217,23 @@ namespace Avalonia.Controls.UnitTests.Presenters Border content; var target = new ContentPresenter { - Padding = 32, + Padding = new Thickness(32), MaxHeight = 32, MaxWidth = 32, + HorizontalContentAlignment = HorizontalAlignment.Center, + VerticalContentAlignment = VerticalAlignment.Center, Content = content = new Border { - MinWidth = 16, - MinHeight = 16, + Height = 0, + Width = 0, }, }; target.UpdateChild(); - target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(0, 0, 0, 0), content.Bounds); + Assert.Equal(new Rect(48, 48, 0, 0), content.Bounds); } } } \ No newline at end of file From 8d07861e5976fa1930d2da40271031019b242d05 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 13 Apr 2018 14:14:24 +0100 Subject: [PATCH 4/4] white space. --- src/Avalonia.Controls/Border.cs | 4 ++-- src/Avalonia.Controls/Presenters/ContentPresenter.cs | 4 ++-- tests/Avalonia.Controls.UnitTests/BorderTests.cs | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/Border.cs b/src/Avalonia.Controls/Border.cs index e6846978dc..93a6c203c9 100644 --- a/src/Avalonia.Controls/Border.cs +++ b/src/Avalonia.Controls/Border.cs @@ -110,11 +110,11 @@ namespace Avalonia.Controls { if (Child != null) { - var padding = Padding + BorderThickness; + var padding = Padding + BorderThickness; Child.Arrange(new Rect(finalSize).Deflate(padding)); } - _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius); + _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius); return finalSize; } diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index 1c5883d980..ce8fe52c22 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -383,10 +383,10 @@ namespace Avalonia.Controls.Presenters { size = size.WithWidth(Math.Min(size.Width, DesiredSize.Width - padding.Left - padding.Right)); } - + if (verticalContentAlignment != VerticalAlignment.Stretch) { - size = size.WithHeight(Math.Min(size.Height, DesiredSize.Height - padding.Top - padding.Bottom)); + size = size.WithHeight(Math.Min(size.Height, DesiredSize.Height - padding.Top - padding.Bottom)); } if (useLayoutRounding) diff --git a/tests/Avalonia.Controls.UnitTests/BorderTests.cs b/tests/Avalonia.Controls.UnitTests/BorderTests.cs index 9d6c838bc3..9a6a041ec7 100644 --- a/tests/Avalonia.Controls.UnitTests/BorderTests.cs +++ b/tests/Avalonia.Controls.UnitTests/BorderTests.cs @@ -33,11 +33,11 @@ namespace Avalonia.Controls.UnitTests MaxWidth = 12, Child = content = new Border { - Height = 0, - Width = 0 + Height = 0, + Width = 0 } }; - + target.Arrange(new Rect(0, 0, 100, 100)); Assert.Equal(new Rect(6, 6, 0, 0), content.Bounds);