diff --git a/osu.Framework.Tests/Visual/Sprites/TestSceneSpriteTextMaxWidth.cs b/osu.Framework.Tests/Visual/Sprites/TestSceneSpriteTextMaxWidth.cs index 9f8c2e0119..920d3358bb 100644 --- a/osu.Framework.Tests/Visual/Sprites/TestSceneSpriteTextMaxWidth.cs +++ b/osu.Framework.Tests/Visual/Sprites/TestSceneSpriteTextMaxWidth.cs @@ -7,6 +7,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Sprites; +using osu.Framework.Text; using osuTK.Graphics; namespace osu.Framework.Tests.Visual.Sprites @@ -70,6 +71,8 @@ public void TestFixedSizeMoreThanMaxWidth() [Test] public void TestMaxWidthWithRelativeSize() { + float textWidth = 0; + createTest(s => { s.RelativeSizeAxes = Axes.X; @@ -77,9 +80,11 @@ public void TestMaxWidthWithRelativeSize() s.Text = "some very long text that should exceed the max width"; s.Truncate = true; }, Axes.Y); + AddStep("store text width", () => textWidth = display.Text.TextBuilder.Bounds.X); AddStep("set parent size", () => display.Width = 100); AddAssert("size <= max", () => display.Text.DrawWidth <= 50); + AddAssert("width increased", () => display.Text.TextBuilder.Bounds.X > textWidth); } private void createTest(Action initFunc, Axes autoSizeAxes = Axes.Both) @@ -93,7 +98,7 @@ private void createTest(Action initFunc, Axes autoSizeAxes = Axes.Bo private class VisualDisplay : CompositeDrawable { - public readonly SpriteText Text; + public readonly TestSpriteText Text; public VisualDisplay(Action initFunc, Axes autoSizeAxes = Axes.Both) { @@ -109,11 +114,19 @@ public VisualDisplay(Action initFunc, Axes autoSizeAxes = Axes.Both) Alpha = 0.2f, Colour = Color4.Pink }, - Text = new SpriteText { AllowMultiline = false } + Text = new TestSpriteText { AllowMultiline = false } }; initFunc?.Invoke(Text); } } + + private class TestSpriteText : SpriteText + { + public TextBuilder TextBuilder { get; private set; } + + protected override TextBuilder CreateTextBuilder(ITexturedGlyphLookupStore store) + => TextBuilder = base.CreateTextBuilder(store); + } } } diff --git a/osu.Framework/Graphics/Sprites/SpriteText.cs b/osu.Framework/Graphics/Sprites/SpriteText.cs index b96c4fc843..84fa78d4a1 100644 --- a/osu.Framework/Graphics/Sprites/SpriteText.cs +++ b/osu.Framework/Graphics/Sprites/SpriteText.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Caching; using osu.Framework.Development; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics.Containers; @@ -55,6 +54,7 @@ public SpriteText() AddLayout(parentScreenSpaceCache); AddLayout(localScreenSpaceCache); AddLayout(shadowOffsetCache); + AddLayout(textBuilderCache); } [BackgroundDependencyLoader] @@ -575,12 +575,12 @@ private void invalidate(bool characters = false, bool textBuilder = false) /// protected virtual char FallbackCharacter => '?'; - private readonly Cached textBuilderBacking = new Cached(); + private readonly LayoutValue textBuilderCache = new LayoutValue(Invalidation.DrawSize, InvalidationSource.Parent); /// /// Invalidates the current , causing a new one to be created next time it's required via . /// - protected void InvalidateTextBuilder() => textBuilderBacking.Invalidate(); + protected void InvalidateTextBuilder() => textBuilderCache.Invalidate(); /// /// Creates a to generate the character layout for this . @@ -613,10 +613,10 @@ protected virtual TextBuilder CreateTextBuilder(ITexturedGlyphLookupStore store) private TextBuilder getTextBuilder() { - if (!textBuilderBacking.IsValid) - textBuilderBacking.Value = CreateTextBuilder(store); + if (!textBuilderCache.IsValid) + textBuilderCache.Value = CreateTextBuilder(store); - return textBuilderBacking.Value; + return textBuilderCache.Value; } public override string ToString() => $@"""{displayedText}"" " + base.ToString();