ソースを参照

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

BDisp 8 ヶ月 前
コミット
d4d0675194

+ 23 - 0
Terminal.Gui/View/View.Drawing.cs

@@ -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

+ 62 - 0
UnitTests/View/Adornment/AdornmentTests.cs

@@ -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
+                                                     );
+    }
 }