Fixes #3864. Border isn't cleared after margin thickness change. (#3868)

This commit is contained in:
BDisp
2024-11-29 18:00:42 +00:00
committed by GitHub
parent f6db2fc847
commit d4d0675194
2 changed files with 85 additions and 0 deletions

View File

@@ -167,6 +167,13 @@ public partial class View // Drawing APIs
private void DoDrawBorderAndPadding ()
{
if (Margin?.NeedsLayout == true)
{
Margin.NeedsLayout = false;
Margin?.ClearFrame ();
Margin?.Parent?.SetSubViewNeedsDraw ();
}
if (SubViewNeedsDraw)
{
// A Subview may add to the LineCanvas. This ensures any Adornment LineCanvas updates happen.
@@ -210,6 +217,22 @@ public partial class View // Drawing APIs
}
private void ClearFrame ()
{
if (Driver is null)
{
return;
}
// Get screen-relative coords
Rectangle toClear = FrameToScreen ();
Attribute prev = SetAttribute (GetNormalColor ());
Driver.FillRect (toClear);
SetAttribute (prev);
SetNeedsDraw ();
}
/// <summary>
/// Called when the View's Adornments are to be drawn. Prepares <see cref="View.LineCanvas"/>. If
/// <see cref="SuperViewRendersLineCanvas"/> is true, only the

View File

@@ -511,4 +511,66 @@ public class AdornmentTests (ITestOutputHelper output)
bool result = adornment.Contains (new (pointX, pointY));
Assert.Equal (expected, result);
}
[Fact]
[SetupFakeDriver]
public void Border_Is_Cleared_After_Margin_Thickness_Change ()
{
View view = new () { Text = "View", Width = 6, Height = 3, BorderStyle = LineStyle.Rounded };
// Remove border bottom thickness
view.Border!.Thickness = new (1, 1, 1, 0);
// Add margin bottom thickness
view.Margin!.Thickness = new (0, 0, 0, 1);
Assert.Equal (6, view.Width);
Assert.Equal (3, view.Height);
view.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@"
╭────╮
│View│
",
output
);
// Add border bottom thickness
view.Border!.Thickness = new (1, 1, 1, 1);
// Remove margin bottom thickness
view.Margin!.Thickness = new (0, 0, 0, 0);
view.Draw ();
Assert.Equal (6, view.Width);
Assert.Equal (3, view.Height);
TestHelpers.AssertDriverContentsWithFrameAre (
@"
╭────╮
│View│
╰────╯
",
output
);
// Remove border bottom thickness
view.Border!.Thickness = new (1, 1, 1, 0);
// Add margin bottom thickness
view.Margin!.Thickness = new (0, 0, 0, 1);
Assert.Equal (6, view.Width);
Assert.Equal (3, view.Height);
View.SetClipToScreen ();
view.Draw ();
TestHelpers.AssertDriverContentsWithFrameAre (
@"
╭────╮
│View│
",
output
);
}
}