mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 15:07:44 +08:00
Merge pull request #29415 from Joehuu/difficulty-name-content
Implement song select v2 difficulty name content component
This commit is contained in:
commit
9dc496d6a7
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,10 +18,9 @@ using osu.Game.Rulesets.Objects.Types;
|
|||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.SongSelect
|
namespace osu.Game.Tests.Visual.SongSelectV2
|
||||||
{
|
{
|
||||||
[TestFixture]
|
public partial class TestSceneBeatmapInfoWedge : SongSelectComponentsTestScene
|
||||||
public partial class TestSceneBeatmapInfoWedgeV2 : OsuTestScene
|
|
||||||
{
|
{
|
||||||
private RulesetStore rulesets = null!;
|
private RulesetStore rulesets = null!;
|
||||||
private TestBeatmapInfoWedgeV2 infoWedge = null!;
|
private TestBeatmapInfoWedgeV2 infoWedge = null!;
|
||||||
@ -33,6 +32,13 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
this.rulesets = rulesets;
|
this.rulesets = rulesets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void SetUpSteps()
|
||||||
|
{
|
||||||
|
base.SetUpSteps();
|
||||||
|
|
||||||
|
AddStep("reset mods", () => SelectedMods.SetDefault());
|
||||||
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
@ -107,12 +113,6 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
AddAssert("check artist", () => infoWedge.Info!.ArtistLabel.Current.Value == $"{ruleset.ShortName}Artist");
|
AddAssert("check artist", () => infoWedge.Info!.ArtistLabel.Current.Value == $"{ruleset.ShortName}Artist");
|
||||||
}
|
}
|
||||||
|
|
||||||
[SetUpSteps]
|
|
||||||
public void SetUpSteps()
|
|
||||||
{
|
|
||||||
AddStep("reset mods", () => SelectedMods.SetDefault());
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestTruncation()
|
public void TestTruncation()
|
||||||
{
|
{
|
@ -0,0 +1,44 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,6 @@ using NUnit.Framework;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Testing;
|
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
@ -24,9 +23,9 @@ using osu.Game.Tests.Resources;
|
|||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using osuTK;
|
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]
|
[Cached]
|
||||||
private OverlayColourProvider colourProvider { get; set; } = new OverlayColourProvider(OverlayColourScheme.Aquamarine);
|
private OverlayColourProvider colourProvider { get; set; } = new OverlayColourProvider(OverlayColourScheme.Aquamarine);
|
||||||
@ -36,19 +35,6 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
|
|
||||||
private FillFlowContainer? fillFlow;
|
private FillFlowContainer? fillFlow;
|
||||||
private OsuSpriteText? drawWidthText;
|
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]
|
[Test]
|
||||||
public void TestSheared()
|
public void TestSheared()
|
||||||
@ -59,7 +45,6 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
{
|
{
|
||||||
fillFlow = new FillFlowContainer
|
fillFlow = new FillFlowContainer
|
||||||
{
|
{
|
||||||
Width = relativeWidth,
|
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
@ -94,7 +79,6 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
{
|
{
|
||||||
fillFlow = new FillFlowContainer
|
fillFlow = new FillFlowContainer
|
||||||
{
|
{
|
||||||
Width = relativeWidth,
|
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
@ -118,8 +102,7 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[SetUpSteps]
|
public override void SetUpSteps()
|
||||||
public void SetUpSteps()
|
|
||||||
{
|
{
|
||||||
AddToggleStep("toggle scoring mode", v => config.SetValue(OsuSetting.ScoreDisplayMode, v ? ScoringMode.Classic : ScoringMode.Standardised));
|
AddToggleStep("toggle scoring mode", v => config.SetValue(OsuSetting.ScoreDisplayMode, v ? ScoringMode.Classic : ScoringMode.Standardised));
|
||||||
}
|
}
|
@ -17,13 +17,12 @@ using osu.Game.Rulesets.Osu.Mods;
|
|||||||
using osu.Game.Screens;
|
using osu.Game.Screens;
|
||||||
using osu.Game.Screens.Footer;
|
using osu.Game.Screens.Footer;
|
||||||
using osu.Game.Screens.Menu;
|
using osu.Game.Screens.Menu;
|
||||||
using osu.Game.Screens.SelectV2;
|
|
||||||
using osu.Game.Screens.SelectV2.Footer;
|
using osu.Game.Screens.SelectV2.Footer;
|
||||||
using osuTK.Input;
|
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]
|
[Cached]
|
||||||
private readonly ScreenFooter screenScreenFooter;
|
private readonly ScreenFooter screenScreenFooter;
|
||||||
@ -31,7 +30,7 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
[Cached]
|
[Cached]
|
||||||
private readonly OsuLogo logo;
|
private readonly OsuLogo logo;
|
||||||
|
|
||||||
public TestSceneSongSelectV2()
|
public TestSceneSongSelect()
|
||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
@ -63,8 +62,8 @@ namespace osu.Game.Tests.Visual.SongSelect
|
|||||||
{
|
{
|
||||||
base.SetUpSteps();
|
base.SetUpSteps();
|
||||||
|
|
||||||
AddStep("load screen", () => Stack.Push(new SongSelectV2()));
|
AddStep("load screen", () => Stack.Push(new Screens.SelectV2.SongSelectV2()));
|
||||||
AddUntilStep("wait for load", () => Stack.CurrentScreen is SongSelectV2 songSelect && songSelect.IsLoaded);
|
AddUntilStep("wait for load", () => Stack.CurrentScreen is Screens.SelectV2.SongSelectV2 songSelect && songSelect.IsLoaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Footer
|
#region Footer
|
@ -5,19 +5,18 @@ using System.Linq;
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Screens.Menu;
|
using osu.Game.Screens.Menu;
|
||||||
using osu.Game.Screens.SelectV2;
|
|
||||||
using osuTK.Input;
|
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()
|
public override void SetUpSteps()
|
||||||
{
|
{
|
||||||
base.SetUpSteps();
|
base.SetUpSteps();
|
||||||
AddStep("press enter", () => InputManager.Key(Key.Enter));
|
AddStep("press enter", () => InputManager.Key(Key.Enter));
|
||||||
AddWaitStep("wait", 5);
|
AddWaitStep("wait", 5);
|
||||||
PushAndConfirm(() => new SongSelectV2());
|
PushAndConfirm(() => new Screens.SelectV2.SongSelectV2());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
88
osu.Game/Screens/SelectV2/Wedge/DifficultyNameContent.cs
Normal file
88
osu.Game/Screens/SelectV2/Wedge/DifficultyNameContent.cs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Online;
|
||||||
|
using osu.Game.Online.Chat;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.SelectV2.Wedge
|
||||||
|
{
|
||||||
|
public partial class LocalDifficultyNameContent : DifficultyNameContent
|
||||||
|
{
|
||||||
|
[Resolved]
|
||||||
|
private IBindable<WorkingBeatmap> beatmap { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private ILinkHandler? linkHandler { get; set; }
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
beatmap.BindValueChanged(b =>
|
||||||
|
{
|
||||||
|
DifficultyName.Text = b.NewValue.BeatmapInfo.DifficultyName;
|
||||||
|
|
||||||
|
// TODO: should be the mapper of the guest difficulty, but that isn't stored correctly yet (see https://github.com/ppy/osu/issues/12965)
|
||||||
|
MapperName.Text = b.NewValue.Metadata.Author.Username;
|
||||||
|
MapperLink.Action = () => linkHandler?.HandleLink(new LinkDetails(LinkAction.OpenUserProfile, b.NewValue.Metadata.Author));
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user