Skip to content

Commit

Permalink
Merge pull request #29415 from Joehuu/difficulty-name-content
Browse files Browse the repository at this point in the history
Implement song select v2 difficulty name content component
  • Loading branch information
peppy authored Aug 15, 2024
2 parents 70cfac0 + e603888 commit 9dc496d
Show file tree
Hide file tree
Showing 8 changed files with 253 additions and 39 deletions.
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
{
[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

0 comments on commit 9dc496d

Please sign in to comment.