From 127344898106f3d0e9c201784f9975f85bd0cdf4 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 15 Mar 2022 11:05:09 +0100 Subject: [PATCH] API changes and test fixes. --- src/Avalonia.Visuals/ApiCompatBaseline.txt | 2 +- .../Media/TextFormatting/TextCollapsingProperties.cs | 3 +-- .../Media/TextFormatting/TextEllipsisHelper.cs | 4 ++-- .../TextFormatting/TextLeadingPrefixCharacterEllipsis.cs | 4 ++-- src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs | 2 +- .../Media/TextFormatting/TextTrailingCharacterEllipsis.cs | 4 ++-- .../Media/TextFormatting/TextTrailingWordEllipsis.cs | 4 ++-- src/Avalonia.Visuals/Media/TextTrimming.cs | 5 +++++ .../Media/TextFormatting/TextLineTests.cs | 2 +- 9 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Visuals/ApiCompatBaseline.txt b/src/Avalonia.Visuals/ApiCompatBaseline.txt index b9989ad670..b725993b44 100644 --- a/src/Avalonia.Visuals/ApiCompatBaseline.txt +++ b/src/Avalonia.Visuals/ApiCompatBaseline.txt @@ -85,7 +85,7 @@ MembersMustExist : Member 'public void Avalonia.Media.TextFormatting.ShapedTextC MembersMustExist : Member 'public Avalonia.Media.TextFormatting.ShapedTextCharacters.SplitTextCharactersResult Avalonia.Media.TextFormatting.ShapedTextCharacters.Split(System.Int32)' does not exist in the implementation but it does exist in the contract. TypesMustExist : Type 'Avalonia.Media.TextFormatting.ShapedTextCharacters.SplitTextCharactersResult' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'protected System.Boolean Avalonia.Media.TextFormatting.TextCharacters.TryGetRunProperties(Avalonia.Utilities.ReadOnlySlice, Avalonia.Media.Typeface, Avalonia.Media.Typeface, System.Int32)' does not exist in the implementation but it does exist in the contract. -CannotAddAbstractMembers : Member 'public System.Collections.Generic.IReadOnlyList Avalonia.Media.TextFormatting.TextCollapsingProperties.Collapse(Avalonia.Media.TextFormatting.TextLine, Avalonia.Media.FlowDirection)' is abstract in the implementation but is missing in the contract. +CannotAddAbstractMembers : Member 'public System.Collections.Generic.IReadOnlyList Avalonia.Media.TextFormatting.TextCollapsingProperties.Collapse(Avalonia.Media.TextFormatting.TextLine)' is abstract in the implementation but is missing in the contract. MembersMustExist : Member 'public Avalonia.Media.TextFormatting.TextCollapsingStyle Avalonia.Media.TextFormatting.TextCollapsingProperties.Style.get()' does not exist in the implementation but it does exist in the contract. TypesMustExist : Type 'Avalonia.Media.TextFormatting.TextCollapsingStyle' does not exist in the implementation but it does exist in the contract. MembersMustExist : Member 'public void Avalonia.Media.TextFormatting.TextEndOfLine..ctor()' does not exist in the implementation but it does exist in the contract. diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextCollapsingProperties.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextCollapsingProperties.cs index 288f9386c2..a46f9537d0 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextCollapsingProperties.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextCollapsingProperties.cs @@ -21,7 +21,6 @@ namespace Avalonia.Media.TextFormatting /// Collapses given text line. /// /// Text line to collapse. - /// Text flow direction. - public abstract IReadOnlyList? Collapse(TextLine textLine, FlowDirection flowDirection); + public abstract IReadOnlyList? Collapse(TextLine textLine); } } diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextEllipsisHelper.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextEllipsisHelper.cs index eccaeba038..2031c2ec99 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextEllipsisHelper.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextEllipsisHelper.cs @@ -5,7 +5,7 @@ namespace Avalonia.Media.TextFormatting { internal class TextEllipsisHelper { - public static List? Collapse(TextLine textLine, FlowDirection flowDirection, TextCollapsingProperties properties, bool isWordEllipsis) + public static List? Collapse(TextLine textLine, TextCollapsingProperties properties, bool isWordEllipsis) { var shapedTextRuns = textLine.TextRuns as List; @@ -18,7 +18,7 @@ namespace Avalonia.Media.TextFormatting var currentWidth = 0.0; var collapsedLength = 0; var textRange = textLine.TextRange; - var shapedSymbol = TextFormatterImpl.CreateSymbol(properties.Symbol, flowDirection); + var shapedSymbol = TextFormatterImpl.CreateSymbol(properties.Symbol, FlowDirection.LeftToRight); if (properties.Width < shapedSymbol.GlyphRun.Size.Width) { diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextLeadingPrefixCharacterEllipsis.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextLeadingPrefixCharacterEllipsis.cs index a771b2a639..74c4573630 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextLeadingPrefixCharacterEllipsis.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextLeadingPrefixCharacterEllipsis.cs @@ -40,7 +40,7 @@ namespace Avalonia.Media.TextFormatting /// public sealed override TextRun Symbol { get; } - public override IReadOnlyList? Collapse(TextLine textLine, FlowDirection flowDirection) + public override IReadOnlyList? Collapse(TextLine textLine) { var shapedTextRuns = textLine.TextRuns as List; @@ -51,7 +51,7 @@ namespace Avalonia.Media.TextFormatting var runIndex = 0; var currentWidth = 0.0; - var shapedSymbol = TextFormatterImpl.CreateSymbol(Symbol, flowDirection); + var shapedSymbol = TextFormatterImpl.CreateSymbol(Symbol, FlowDirection.LeftToRight); if (Width < shapedSymbol.GlyphRun.Size.Width) { diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs index 09da6db8d4..49bee6e776 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextLineImpl.cs @@ -106,7 +106,7 @@ namespace Avalonia.Media.TextFormatting var collapsingProperties = collapsingPropertiesList[0]; - var collapsedRuns = collapsingProperties.Collapse(this, _paragraphProperties.FlowDirection); + var collapsedRuns = collapsingProperties.Collapse(this); if (collapsedRuns is List shapedRuns) { diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingCharacterEllipsis.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingCharacterEllipsis.cs index 5577fc31f5..83acaa021e 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingCharacterEllipsis.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingCharacterEllipsis.cs @@ -27,9 +27,9 @@ namespace Avalonia.Media.TextFormatting /// public sealed override TextRun Symbol { get; } - public override IReadOnlyList? Collapse(TextLine textLine, FlowDirection flowDirection) + public override IReadOnlyList? Collapse(TextLine textLine) { - return TextEllipsisHelper.Collapse(textLine, flowDirection, this, false); + return TextEllipsisHelper.Collapse(textLine, this, false); } } } diff --git a/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingWordEllipsis.cs b/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingWordEllipsis.cs index 7a98d36510..ff2e4cf325 100644 --- a/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingWordEllipsis.cs +++ b/src/Avalonia.Visuals/Media/TextFormatting/TextTrailingWordEllipsis.cs @@ -31,9 +31,9 @@ namespace Avalonia.Media.TextFormatting /// public sealed override TextRun Symbol { get; } - public override IReadOnlyList? Collapse(TextLine textLine, FlowDirection flowDirection) + public override IReadOnlyList? Collapse(TextLine textLine) { - return TextEllipsisHelper.Collapse(textLine, flowDirection, this, true); + return TextEllipsisHelper.Collapse(textLine, this, true); } } } diff --git a/src/Avalonia.Visuals/Media/TextTrimming.cs b/src/Avalonia.Visuals/Media/TextTrimming.cs index 3ba52b28f9..b6f5be496f 100644 --- a/src/Avalonia.Visuals/Media/TextTrimming.cs +++ b/src/Avalonia.Visuals/Media/TextTrimming.cs @@ -30,6 +30,11 @@ namespace Avalonia.Media /// public static TextTrimming PrefixCharacterEllipsis { get; } = new TextLeadingPrefixTrimming(s_defaultEllipsisChar, 8); + /// + /// Text is trimmed at a character boundary starting from the beginning. An ellipsis (...) is drawn in place of remaining text. + /// + public static TextTrimming LeadingCharacterEllipsis { get; } = new TextLeadingPrefixTrimming(s_defaultEllipsisChar, 0); + /// /// Creates properties that will be used for collapsing lines of text. /// diff --git a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs index 9c0f2d0a9f..367e6f4bea 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLineTests.cs @@ -364,7 +364,7 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting { get { - yield return CreateData("01234 01234 01234", 120, TextTrimming.PrefixEllipsis, "01234 01\u20264 01234"); + yield return CreateData("01234 01234 01234", 120, TextTrimming.PrefixCharacterEllipsis, "01234 01\u20264 01234"); yield return CreateData("01234 01234", 58, TextTrimming.CharacterEllipsis, "01234 0\u2026"); yield return CreateData("01234 01234", 58, TextTrimming.WordEllipsis, "01234\u2026"); yield return CreateData("01234", 9, TextTrimming.CharacterEllipsis, "\u2026");