1
0
mirror of https://github.com/ppy/osu.git synced 2026-06-04 18:24:13 +08:00

Fix daily challenge marker text spacing

Closes https://github.com/ppy/osu/issues/32908.

Have you ever been in a situation wherein you find out you fixed a bug
that you didn't know existed, but that makes *another* bug appear
because it was relying on the other bug? This is where I'm at right now.

But, to start from the top.

`TextFlowContainer.Text` (the setter) is a convenience property that you
use to set the text in one go. Internally it uses `AddText()`:

	https://github.com/ppy/osu-framework/blob/681900ffb70adfeede4e3fa32a69da66252691ee/osu.Framework/Graphics/Containers/TextFlowContainer.cs#L81-L94

`AddText()`'s xmldoc says:

	The \n character will create a new paragraph, not just a line break.
	If you need \n to be a line break, use <see cref="AddParagraph{TSpriteText}(LocalisableString, Action{TSpriteText})"/> instead.

	https://github.com/ppy/osu-framework/blob/681900ffb70adfeede4e3fa32a69da66252691ee/osu.Framework/Graphics/Containers/TextFlowContainer.cs#L226-L239

That's right. This portion of xmldoc was *straight up false* and
*silently broken* before https://github.com/ppy/osu-framework/pull/6556.
If you want to check that out yourself, apply the following patch to
framework:

diff --git a/osu.Framework.Tests/Visual/Containers/TestSceneTextFlowContainer.cs b/osu.Framework.Tests/Visual/Containers/TestSceneTextFlowContainer.cs
index 464f47c2c..e1ad521a7 100644
--- a/osu.Framework.Tests/Visual/Containers/TestSceneTextFlowContainer.cs
+++ b/osu.Framework.Tests/Visual/Containers/TestSceneTextFlowContainer.cs
@@ -180,6 +180,22 @@ public void TestAlignmentIsCorrectWhenLineBreaksAtLastWordOfParagraph(Anchor tex
             });
         }

+        [Test]
+        public void TestSetTextWithNewLine()
+        {
+            AddStep("set text", () => textContainer.Text = "this text\nhas a newline");
+            AddStep("clear and add text", () =>
+            {
+                textContainer.Clear();
+                textContainer.AddText("this text\nhas a newline");
+            });
+            AddStep("clear and add paragraph", () =>
+            {
+                textContainer.Clear();
+                textContainer.AddParagraph("this text\nhas a newline");
+            });
+        }
+
         private void assertSpriteTextCount(int count)
             => AddAssert($"text flow has {count} sprite texts", () => textContainer.ChildrenOfType<SpriteText>().Count() == count);

On `master`, there will be a difference between the first two steps, and
the third. On 2025.321.0, *there will be none*.

My working theory as to why this was always busted is that the
corresponding code that was there before in

	https://github.com/bdach/osu-framework/blob/c31a48178889ca2f9b4d257d2d64915eee90338a/osu.Framework/Graphics/Containers/TextFlowContainer.cs#L454-L458

just straight up ran too late. *The height of the container is being
changed after the flow has laid itself out, without adjusting subsequent
children in any way.*

There is potentially a discussion to be had as to whether the emergent
behaviour of `TextFlowContainer.Text` with respect to `\n` character is
correct, but I'm just going to start with this diff and see what the
reaction is.
This commit is contained in:
Bartłomiej Dach
2025-04-22 08:52:01 +02:00
committed by Dean Herbert
Unverified
parent cc6e2a5415
commit 187481650b
@@ -44,6 +44,8 @@ namespace osu.Game.Overlays.Profile.Header.Components
{
AutoSizeAxes = Axes.Both;
OsuTextFlowContainer label;
InternalChildren = new Drawable[]
{
content = new Container
@@ -69,12 +71,9 @@ namespace osu.Game.Overlays.Profile.Header.Components
Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
new OsuTextFlowContainer(s => s.Font = OsuFont.GetFont(size: 12))
label = new OsuTextFlowContainer(s => s.Font = OsuFont.GetFont(size: 12))
{
AutoSizeAxes = Axes.Both,
// can't use this because osu-web does weird stuff with \\n.
// Text = UsersStrings.ShowDailyChallengeTitle.,
Text = "Daily\nChallenge",
Margin = new MarginPadding { Horizontal = 5f, Bottom = 2f },
},
new Container
@@ -129,6 +128,10 @@ namespace osu.Game.Overlays.Profile.Header.Components
}
},
};
// can't use this because osu-web does weird stuff with \\n.
// Text = UsersStrings.ShowDailyChallengeTitle.,
label.AddParagraph("Daily\nChallenge");
}
protected override void LoadComplete()