Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement song select v2 difficulty name content component #29415

Merged
merged 10 commits into from
Aug 15, 2024
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Testing;
using osu.Game.Overlays;

namespace osu.Game.Tests.Visual.SongSelectV2
{
public abstract partial class SongSelectComponentsTestScene : OsuTestScene
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you using this in many other places? Could probably just do away with this class.

But also, if you're going to make a class like this you probably want to make use of Content:

diff --git a/osu.Game.Tests/Visual/SongSelectV2/SongSelectComponentsTestScene.cs b/osu.Game.Tests/Visual/SongSelectV2/SongSelectComponentsTestScene.cs
index d984a3a11a..1583d229c5 100644
--- a/osu.Game.Tests/Visual/SongSelectV2/SongSelectComponentsTestScene.cs
+++ b/osu.Game.Tests/Visual/SongSelectV2/SongSelectComponentsTestScene.cs
@@ -12,14 +12,19 @@ namespace osu.Game.Tests.Visual.SongSelectV2
 {
     public abstract partial class SongSelectComponentsTestScene : OsuTestScene
     {
-        protected Container ComponentContainer = null!;
+        [Cached]
+        protected readonly OverlayColourProvider ColourProvider = new OverlayColourProvider(OverlayColourScheme.Aquamarine);
+
+        protected override Container<Drawable> Content { get; } = new Container
+        {
+            RelativeSizeAxes = Axes.X,
+            AutoSizeAxes = Axes.Y,
+            Padding = new MarginPadding(10),
+        };
 
         private Container? resizeContainer;
         private float relativeWidth;
 
-        [Cached]
-        protected readonly OverlayColourProvider ColourProvider = new OverlayColourProvider(OverlayColourScheme.Aquamarine);
-
         [BackgroundDependencyLoader]
         private void load()
         {
@@ -41,9 +46,9 @@ public virtual void SetUpSteps()
                 SelectedMods.SetDefault();
             });
 
-            AddStep("set content", () =>
+            AddStep("setup content", () =>
             {
-                Child = resizeContainer = new Container
+                base.Content.Add(resizeContainer = new Container
                 {
                     RelativeSizeAxes = Axes.X,
                     AutoSizeAxes = Axes.Y,
@@ -56,14 +61,9 @@ public virtual void SetUpSteps()
                             RelativeSizeAxes = Axes.Both,
                             Colour = ColourProvider.Background5,
                         },
-                        ComponentContainer = new Container
-                        {
-                            RelativeSizeAxes = Axes.X,
-                            AutoSizeAxes = Axes.Y,
-                            Padding = new MarginPadding(10),
-                        }
+                        Content
                     }
-                };
+                });
             });
         }
     }
diff --git a/osu.Game.Tests/Visual/SongSelectV2/TestSceneDifficultyNameContent.cs b/osu.Game.Tests/Visual/SongSelectV2/TestSceneDifficultyNameContent.cs
index e32d6ddb80..49e7e2bc1a 100644
--- a/osu.Game.Tests/Visual/SongSelectV2/TestSceneDifficultyNameContent.cs
+++ b/osu.Game.Tests/Visual/SongSelectV2/TestSceneDifficultyNameContent.cs
@@ -19,7 +19,7 @@ public partial class TestSceneDifficultyNameContent : SongSelectComponentsTestSc
         [Test]
         public void TestLocalBeatmap()
         {
-            AddStep("set component", () => ComponentContainer.Child = difficultyNameContent = new LocalDifficultyNameContent());
+            AddStep("set component", () => Child = difficultyNameContent = new LocalDifficultyNameContent());
 
             AddAssert("difficulty name is not set", () => LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<TruncatingSpriteText>().Single().Text));
             AddAssert("author is not set", () => LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<OsuHoverContainer>().Single().ChildrenOfType<OsuSpriteText>().Single().Text));

Copy link
Member Author

@Joehuu Joehuu Aug 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it will be used for all the individual components that the wedge has. Just wanted to share the resizing and background logic so it can help find layout issues with limited width.

Totally forgot the Content thing.

{
[Cached]
protected readonly OverlayColourProvider ColourProvider = new OverlayColourProvider(OverlayColourScheme.Aquamarine);

protected override Container<Drawable> Content { get; } = new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Padding = new MarginPadding(10),
};

private Container? resizeContainer;
private float relativeWidth;

[BackgroundDependencyLoader]
private void load()
{
base.Content.Child = resizeContainer = new Container
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Padding = new MarginPadding(10),
Width = relativeWidth,
Children = new Drawable[]
{
new Box
{
RelativeSizeAxes = Axes.Both,
Colour = ColourProvider.Background5,
},
Content
}
};

AddSliderStep("change relative width", 0, 1f, 1f, v =>
{
if (resizeContainer != null)
resizeContainer.Width = v;

relativeWidth = v;
});
}

[SetUpSteps]
public virtual void SetUpSteps()
{
AddStep("reset dependencies", () =>
{
Beatmap.SetDefault();
SelectedMods.SetDefault();
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@
using osu.Game.Screens.Select;
using osuTK;

namespace osu.Game.Tests.Visual.SongSelect
namespace osu.Game.Tests.Visual.SongSelectV2
{
[TestFixture]
public partial class TestSceneBeatmapInfoWedgeV2 : OsuTestScene
public partial class TestSceneBeatmapInfoWedge : SongSelectComponentsTestScene
{
private RulesetStore rulesets = null!;
private TestBeatmapInfoWedgeV2 infoWedge = null!;
Expand All @@ -33,6 +32,13 @@ private void load(RulesetStore rulesets)
this.rulesets = rulesets;
}

public override void SetUpSteps()
{
base.SetUpSteps();

AddStep("reset mods", () => SelectedMods.SetDefault());
}

protected override void LoadComplete()
{
base.LoadComplete();
Expand Down Expand Up @@ -107,12 +113,6 @@ private void testBeatmapLabels(Ruleset ruleset)
AddAssert("check artist", () => infoWedge.Info!.ArtistLabel.Current.Value == $"{ruleset.ShortName}Artist");
}

[SetUpSteps]
public void SetUpSteps()
{
AddStep("reset mods", () => SelectedMods.SetDefault());
}

[Test]
public void TestTruncation()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System.Linq;
using NUnit.Framework;
using osu.Framework.Localisation;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Screens.SelectV2.Wedge;

namespace osu.Game.Tests.Visual.SongSelectV2
{
public partial class TestSceneDifficultyNameContent : SongSelectComponentsTestScene
{
private DifficultyNameContent? difficultyNameContent;

[Test]
public void TestLocalBeatmap()
{
AddStep("set component", () => Child = difficultyNameContent = new LocalDifficultyNameContent());

AddAssert("difficulty name is not set", () => LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<TruncatingSpriteText>().Single().Text));
AddAssert("author is not set", () => LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<OsuHoverContainer>().Single().ChildrenOfType<OsuSpriteText>().Single().Text));

AddStep("set beatmap", () => Beatmap.Value = CreateWorkingBeatmap(new Beatmap
{
BeatmapInfo = new BeatmapInfo
{
DifficultyName = "really long difficulty name that gets truncated",
Metadata = new BeatmapMetadata
{
Author = { Username = "really long username that is autosized" },
},
OnlineID = 1,
}
}));

AddAssert("difficulty name is set", () => !LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<TruncatingSpriteText>().Single().Text));
AddAssert("author is set", () => !LocalisableString.IsNullOrEmpty(difficultyNameContent.ChildrenOfType<OsuHoverContainer>().Single().ChildrenOfType<OsuSpriteText>().Single().Text));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Testing;
using osu.Framework.Utils;
using osu.Game.Configuration;
using osu.Game.Graphics.Sprites;
Expand All @@ -24,9 +23,9 @@
using osu.Game.Users;
using osuTK;

namespace osu.Game.Tests.Visual.SongSelect
namespace osu.Game.Tests.Visual.SongSelectV2
{
public partial class TestSceneLeaderboardScoreV2 : OsuTestScene
public partial class TestSceneLeaderboardScore : SongSelectComponentsTestScene
{
[Cached]
private OverlayColourProvider colourProvider { get; set; } = new OverlayColourProvider(OverlayColourScheme.Aquamarine);
Expand All @@ -36,19 +35,6 @@ public partial class TestSceneLeaderboardScoreV2 : OsuTestScene

private FillFlowContainer? fillFlow;
private OsuSpriteText? drawWidthText;
private float relativeWidth;

[BackgroundDependencyLoader]
private void load()
{
// TODO: invalidation seems to be one-off when clicking slider to a certain value, so drag for now
// doesn't seem to happen in-game (when toggling window mode)
AddSliderStep("change relative width", 0, 1f, 0.6f, v =>
{
relativeWidth = v;
if (fillFlow != null) fillFlow.Width = v;
});
}

[Test]
public void TestSheared()
Expand All @@ -59,7 +45,6 @@ public void TestSheared()
{
fillFlow = new FillFlowContainer
{
Width = relativeWidth,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.X,
Expand Down Expand Up @@ -94,7 +79,6 @@ public void TestNonSheared()
{
fillFlow = new FillFlowContainer
{
Width = relativeWidth,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.X,
Expand All @@ -118,8 +102,7 @@ public void TestNonSheared()
});
}

[SetUpSteps]
public void SetUpSteps()
public override void SetUpSteps()
{
AddToggleStep("toggle scoring mode", v => config.SetValue(OsuSetting.ScoreDisplayMode, v ? ScoringMode.Classic : ScoringMode.Standardised));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,20 @@
using osu.Game.Screens;
using osu.Game.Screens.Footer;
using osu.Game.Screens.Menu;
using osu.Game.Screens.SelectV2;
using osu.Game.Screens.SelectV2.Footer;
using osuTK.Input;

namespace osu.Game.Tests.Visual.SongSelect
namespace osu.Game.Tests.Visual.SongSelectV2
{
public partial class TestSceneSongSelectV2 : ScreenTestScene
public partial class TestSceneSongSelect : ScreenTestScene
{
[Cached]
private readonly ScreenFooter screenScreenFooter;

[Cached]
private readonly OsuLogo logo;

public TestSceneSongSelectV2()
public TestSceneSongSelect()
{
Children = new Drawable[]
{
Expand Down Expand Up @@ -63,8 +62,8 @@ public override void SetUpSteps()
{
base.SetUpSteps();

AddStep("load screen", () => Stack.Push(new SongSelectV2()));
AddUntilStep("wait for load", () => Stack.CurrentScreen is SongSelectV2 songSelect && songSelect.IsLoaded);
AddStep("load screen", () => Stack.Push(new Screens.SelectV2.SongSelectV2()));
AddUntilStep("wait for load", () => Stack.CurrentScreen is Screens.SelectV2.SongSelectV2 songSelect && songSelect.IsLoaded);
}

#region Footer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@
using NUnit.Framework;
using osu.Framework.Testing;
using osu.Game.Screens.Menu;
using osu.Game.Screens.SelectV2;
using osuTK.Input;

namespace osu.Game.Tests.Visual.SongSelect
namespace osu.Game.Tests.Visual.SongSelectV2
{
public partial class TestSceneSongSelectV2Navigation : OsuGameTestScene
public partial class TestSceneSongSelectNavigation : OsuGameTestScene
{
public override void SetUpSteps()
{
base.SetUpSteps();
AddStep("press enter", () => InputManager.Key(Key.Enter));
AddWaitStep("wait", 5);
PushAndConfirm(() => new SongSelectV2());
PushAndConfirm(() => new Screens.SelectV2.SongSelectV2());
}

[Test]
Expand Down
88 changes: 88 additions & 0 deletions osu.Game/Screens/SelectV2/Wedge/DifficultyNameContent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Localisation;
using osu.Game.Overlays;

namespace osu.Game.Screens.SelectV2.Wedge
{
public abstract partial class DifficultyNameContent : CompositeDrawable
{
protected OsuSpriteText DifficultyName = null!;
private OsuSpriteText mappedByLabel = null!;
protected OsuHoverContainer MapperLink = null!;
protected OsuSpriteText MapperName = null!;

protected DifficultyNameContent()
{
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
}

[BackgroundDependencyLoader]
private void load()
{
InternalChild = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
DifficultyName = new TruncatingSpriteText
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Font = OsuFont.GetFont(weight: FontWeight.SemiBold),
},
mappedByLabel = new OsuSpriteText
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
// TODO: better null display? beatmap carousel panels also just show this text currently.
Text = " mapped by ",
Font = OsuFont.GetFont(size: 14),
},
// This is not a `LinkFlowContainer` as there are single-frame layout issues when Update()
// is being used for layout, see https://github.com/ppy/osu-framework/issues/3369.
MapperLink = new MapperLinkContainer
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
AutoSizeAxes = Axes.Both,
Child = MapperName = new OsuSpriteText
{
Font = OsuFont.GetFont(weight: FontWeight.SemiBold, size: 14),
}
},
}
};
}

protected override void Update()
{
base.Update();

// truncate difficulty name when width exceeds bounds, prioritizing mapper name display
DifficultyName.MaxWidth = Math.Max(DrawWidth - mappedByLabel.DrawWidth
- MapperName.DrawWidth, 0);
}

private partial class MapperLinkContainer : OsuHoverContainer
{
[BackgroundDependencyLoader]
private void load(OverlayColourProvider? overlayColourProvider, OsuColour colours)
{
TooltipText = ContextMenuStrings.ViewProfile;
IdleColour = overlayColourProvider?.Light2 ?? colours.Blue;
}
}
}
}
Loading
Loading