diff --git a/Terminal.Gui/Core/TextFormatter.cs b/Terminal.Gui/Core/TextFormatter.cs index 56458b3e0..50fc9f5ae 100644 --- a/Terminal.Gui/Core/TextFormatter.cs +++ b/Terminal.Gui/Core/TextFormatter.cs @@ -1212,11 +1212,11 @@ namespace Terminal.Gui { if (isVertical) { var runesWidth = GetSumMaxCharWidth (Lines, line); x = bounds.Right - runesWidth; - CursorPosition = bounds.Width - runesWidth + hotKeyPos; + CursorPosition = bounds.Width - runesWidth + (hotKeyPos > -1 ? hotKeyPos : 0); } else { var runesWidth = GetTextWidth (ustring.Make (runes)); x = bounds.Right - runesWidth; - CursorPosition = bounds.Width - runesWidth + hotKeyPos; + CursorPosition = bounds.Width - runesWidth + (hotKeyPos > -1 ? hotKeyPos : 0); } } else if (textAlignment == TextAlignment.Left || textAlignment == TextAlignment.Justified) { if (isVertical) { @@ -1225,16 +1225,16 @@ namespace Terminal.Gui { } else { x = bounds.Left; } - CursorPosition = hotKeyPos; + CursorPosition = hotKeyPos > -1 ? hotKeyPos : 0; } else if (textAlignment == TextAlignment.Centered) { if (isVertical) { var runesWidth = GetSumMaxCharWidth (Lines, line); x = bounds.Left + line + ((bounds.Width - runesWidth) / 2); - CursorPosition = (bounds.Width - runesWidth) / 2 + hotKeyPos; + CursorPosition = (bounds.Width - runesWidth) / 2 + (hotKeyPos > -1 ? hotKeyPos : 0); } else { var runesWidth = GetTextWidth (ustring.Make (runes)); x = bounds.Left + (bounds.Width - runesWidth) / 2; - CursorPosition = (bounds.Width - runesWidth) / 2 + hotKeyPos; + CursorPosition = (bounds.Width - runesWidth) / 2 + (hotKeyPos > -1 ? hotKeyPos : 0); } } else { throw new ArgumentOutOfRangeException (); @@ -1291,7 +1291,7 @@ namespace Terminal.Gui { rune = runes [idx]; } } - if (idx == HotKeyPos) { + if (HotKeyPos > -1 && idx == HotKeyPos) { if ((isVertical && textVerticalAlignment == VerticalTextAlignment.Justified) || (!isVertical && textAlignment == TextAlignment.Justified)) { CursorPosition = idx - start; diff --git a/UnitTests/TestHelpers.cs b/UnitTests/TestHelpers.cs index ac13d56c0..13ceeb2c4 100644 --- a/UnitTests/TestHelpers.cs +++ b/UnitTests/TestHelpers.cs @@ -37,9 +37,9 @@ public class AutoInitShutdownAttribute : Xunit.Sdk.BeforeAfterTestAttribute { /// Only valid if is true. /// Only valid if == and is true. public AutoInitShutdownAttribute (bool autoInit = true, bool autoShutdown = true, - Type consoleDriverType = null, - bool useFakeClipboard = false, - bool fakeClipboardAlwaysThrowsNotSupportedException = false, + Type consoleDriverType = null, + bool useFakeClipboard = false, + bool fakeClipboardAlwaysThrowsNotSupportedException = false, bool fakeClipboardIsSupportedAlwaysTrue = false) { //Assert.True (autoInit == false && consoleDriverType == null); @@ -54,7 +54,7 @@ public class AutoInitShutdownAttribute : Xunit.Sdk.BeforeAfterTestAttribute { static bool _init = false; bool AutoInit { get; } - bool AutoShutdown { get; } + bool AutoShutdown { get; } Type DriverType; public override void Before (MethodInfo methodUnderTest) @@ -251,7 +251,7 @@ class TestHelpers { var match = expectedColors.Where (e => e.Value == val).ToList (); if (match.Count == 0) { - throw new Exception ($"Unexpected color {DescribeColor (val)} was used at row {r} and col {c} (indexes start at 0). Color value was {val} (expected colors were {string.Join (",", expectedColors.Select (c => c.Value))})"); + throw new Exception ($"Unexpected color {DescribeColor (val)} was used at row {r} and col {c} (indexes start at 0). Color value was {val} (expected colors were {string.Join (",", expectedColors.Select (c => DescribeColor (c.Value)))})"); } else if (match.Count > 1) { throw new ArgumentException ($"Bad value for expectedColors, {match.Count} Attributes had the same Value"); } diff --git a/UnitTests/TextFormatterTests.cs b/UnitTests/TextFormatterTests.cs index e2750439a..63e28290e 100644 --- a/UnitTests/TextFormatterTests.cs +++ b/UnitTests/TextFormatterTests.cs @@ -4259,5 +4259,46 @@ This TextFormatter (tf2) is rewritten. 0111000000 0000000000", expectedColors); } + + [Fact, AutoInitShutdown] + public void Colors_On_TextAlignment_Right_And_Bottom () + { + var labelRight = new Label ("Test") { + Width = 6, + Height = 1, + TextAlignment = TextAlignment.Right, + ColorScheme = Colors.Base + }; + var labelBottom = new Label ("Test", TextDirection.TopBottom_LeftRight) { + Y = 1, + Width = 1, + Height = 6, + VerticalTextAlignment = VerticalTextAlignment.Bottom, + ColorScheme = Colors.Base + }; + var top = Application.Top; + top.Add (labelRight, labelBottom); + + Application.Begin (top); + ((FakeDriver)Application.Driver).SetBufferSize (7, 7); + + TestHelpers.AssertDriverContentsWithFrameAre (@" + Test + + +T +e +s +t ", output); + + TestHelpers.AssertDriverColorsAre (@" +000000 +0 +0 +0 +0 +0 +0", new Attribute [] { Colors.Base.Normal }); + } } } \ No newline at end of file