From 162aa081ada43f27c5990b5941a8a5634ea307cc Mon Sep 17 00:00:00 2001 From: Tig Date: Tue, 16 Apr 2024 11:47:51 -0600 Subject: [PATCH] Implemented AnchorEnd(); added .UseDimForOffset property --- Terminal.Gui/View/Layout/PosDim.cs | 26 +++++++++++++++++++++---- Terminal.Gui/View/Layout/ViewLayout.cs | 15 ++++++++++++-- UnitTests/View/Layout/AnchorEndTests.cs | 21 ++++++++++++++++++-- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/Terminal.Gui/View/Layout/PosDim.cs b/Terminal.Gui/View/Layout/PosDim.cs index 9159ea9b9..2230ee970 100644 --- a/Terminal.Gui/View/Layout/PosDim.cs +++ b/Terminal.Gui/View/Layout/PosDim.cs @@ -139,8 +139,7 @@ public class Pos /// public static Pos AnchorEnd () { - throw new NotImplementedException (); - //return new PosAnchorEnd (0); + return new PosAnchorEnd (); } /// @@ -336,11 +335,30 @@ public class Pos internal class PosAnchorEnd : Pos { private readonly int _offset; + public PosAnchorEnd () { UseDimForOffset = true; } public PosAnchorEnd (int offset) { _offset = offset; } public override bool Equals (object other) { return other is PosAnchorEnd anchorEnd && anchorEnd._offset == _offset; } public override int GetHashCode () { return _offset.GetHashCode (); } - public override string ToString () { return $"AnchorEnd({_offset})"; } - internal override int Anchor (int width) { return width - _offset; } + + public bool UseDimForOffset { get; set; } + + public override string ToString () + { + if (UseDimForOffset) + { + return "AnchorEnd()"; + } + return $"AnchorEnd({_offset})"; + } + + internal override int Anchor (int width) + { + if (UseDimForOffset) + { + return width; + } + return width - _offset; + } } internal class PosCenter : Pos diff --git a/Terminal.Gui/View/Layout/ViewLayout.cs b/Terminal.Gui/View/Layout/ViewLayout.cs index f593d93d2..69a07f066 100644 --- a/Terminal.Gui/View/Layout/ViewLayout.cs +++ b/Terminal.Gui/View/Layout/ViewLayout.cs @@ -1109,7 +1109,6 @@ public partial class View GetNewDimension (dim, newLocation, superviewDimension, autosizeDimension), 0 ); - break; case Pos.PosCombine combine: @@ -1148,7 +1147,19 @@ public partial class View break; - case Pos.PosAnchorEnd: + case Pos.PosAnchorEnd anchorEnd: + newLocation = anchorEnd.Anchor (superviewDimension); + if (anchorEnd.UseDimForOffset) + { + newLocation -= dim.Anchor (0); + } + + newDimension = Math.Max ( + GetNewDimension (dim, newLocation, superviewDimension, autosizeDimension), + 0 + ); + break; + case Pos.PosAbsolute: case Pos.PosFactor: case Pos.PosFunc: diff --git a/UnitTests/View/Layout/AnchorEndTests.cs b/UnitTests/View/Layout/AnchorEndTests.cs index 37449bd67..ec5dc5c16 100644 --- a/UnitTests/View/Layout/AnchorEndTests.cs +++ b/UnitTests/View/Layout/AnchorEndTests.cs @@ -107,6 +107,23 @@ public class AnchorEndTests (ITestOutputHelper output) Assert.Equal (expectedXPosition, view.Frame.X); } + // UseDimForOffset tests + + [Fact] + public void AnchorEnd_UseDimForOffset_CreatesCorrectInstance () + { + var pos = Pos.AnchorEnd (); + Assert.IsType (pos); + Assert.True (((PosAnchorEnd)pos).UseDimForOffset); + } + + [Fact] + public void AnchorEnd_UseDimForOffset_SetsValue_Anchor_Is_Negative () + { + Pos pos = Pos.AnchorEnd (); + Assert.Equal (-10, -pos.Anchor (10)); + } + [Theory] [InlineData (0, 25)] [InlineData (10, 15)] @@ -114,14 +131,14 @@ public class AnchorEndTests (ITestOutputHelper output) [InlineData (11, 14)] [InlineData (25, 0)] [InlineData (26, -1)] - public void AnchorEnd_No_Offset_PositionsViewOffsetByWidth (int width, int expectedXPosition) + public void AnchorEnd_UseDimForOffset_PositionsViewOffsetByDim (int dim, int expectedXPosition) { // Arrange var superView = new View { Width = 25, Height = 25 }; var view = new View { X = Pos.AnchorEnd (), - Width = width, + Width = dim, Height = 1 }; superView.Add (view);