diff --git a/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs b/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs
index 29bcc7df9e..6d014ca1ca 100644
--- a/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs
+++ b/osu.Game.Tests/Visual/Background/TestSceneUserDimBackgrounds.cs
@@ -68,10 +68,10 @@ namespace osu.Game.Tests.Visual.Background
[SetUp]
public virtual void SetUp() => Schedule(() =>
{
- Child = new OsuScreenStack(songSelect = new DummySongSelect())
- {
- RelativeSizeAxes = Axes.Both
- };
+ var stack = new OsuScreenStack { RelativeSizeAxes = Axes.Both };
+ Child = stack;
+
+ stack.Push(songSelect = new DummySongSelect());
});
///
@@ -277,7 +277,7 @@ namespace osu.Game.Tests.Visual.Background
private void setupUserSettings()
{
- AddUntilStep("Song select has selection", () => songSelect.Carousel.SelectedBeatmap != null);
+ AddUntilStep("Song select has selection", () => songSelect.Carousel?.SelectedBeatmap != null);
AddStep("Set default user settings", () =>
{
SelectedMods.Value = SelectedMods.Value.Concat(new[] { new OsuModNoFail() }).ToArray();
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
index ee58219cd3..fc03dc6ed3 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
@@ -2,12 +2,16 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Testing;
using osu.Game.Configuration;
using osu.Game.Rulesets.Mods;
using osu.Game.Screens.Play;
+using osuTK.Input;
namespace osu.Game.Tests.Visual.Gameplay
{
@@ -15,7 +19,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
private HUDOverlay hudOverlay;
- private Drawable hideTarget => hudOverlay.KeyCounter; // best way of checking hideTargets without exposing.
+ // best way to check without exposing.
+ private Drawable hideTarget => hudOverlay.KeyCounter;
+ private FillFlowContainer keyCounterFlow => hudOverlay.KeyCounter.ChildrenOfType>().First();
[Resolved]
private OsuConfigManager config { get; set; }
@@ -28,6 +34,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddAssert("showhud is set", () => hudOverlay.ShowHud.Value);
AddAssert("hidetarget is visible", () => hideTarget.IsPresent);
+ AddAssert("key counter flow is visible", () => keyCounterFlow.IsPresent);
AddAssert("pause button is visible", () => hudOverlay.HoldToQuit.IsPresent);
}
@@ -50,6 +57,9 @@ namespace osu.Game.Tests.Visual.Gameplay
AddUntilStep("hidetarget is hidden", () => !hideTarget.IsPresent);
AddAssert("pause button is still visible", () => hudOverlay.HoldToQuit.IsPresent);
+
+ // Key counter flow container should not be affected by this, only the key counter display will be hidden as checked above.
+ AddAssert("key counter flow not affected", () => keyCounterFlow.IsPresent);
}
[Test]
@@ -68,12 +78,40 @@ namespace osu.Game.Tests.Visual.Gameplay
AddAssert("config unchanged", () => originalConfigValue == config.Get(OsuSetting.ShowInterface));
}
+ [Test]
+ public void TestChangeHUDVisibilityOnHiddenKeyCounter()
+ {
+ bool keyCounterVisibleValue = false;
+
+ createNew();
+ AddStep("save keycounter visible value", () => keyCounterVisibleValue = config.Get(OsuSetting.KeyOverlay));
+
+ AddStep("set keycounter visible false", () =>
+ {
+ config.Set(OsuSetting.KeyOverlay, false);
+ hudOverlay.KeyCounter.AlwaysVisible.Value = false;
+ });
+
+ AddStep("set showhud false", () => hudOverlay.ShowHud.Value = false);
+ AddUntilStep("hidetarget is hidden", () => !hideTarget.IsPresent);
+ AddAssert("key counters hidden", () => !keyCounterFlow.IsPresent);
+
+ AddStep("set showhud true", () => hudOverlay.ShowHud.Value = true);
+ AddUntilStep("hidetarget is visible", () => hideTarget.IsPresent);
+ AddAssert("key counters still hidden", () => !keyCounterFlow.IsPresent);
+
+ AddStep("return value", () => config.Set(OsuSetting.KeyOverlay, keyCounterVisibleValue));
+ }
+
private void createNew(Action action = null)
{
AddStep("create overlay", () =>
{
Child = hudOverlay = new HUDOverlay(null, null, null, Array.Empty());
+ // Add any key just to display the key counter visually.
+ hudOverlay.KeyCounter.Add(new KeyCounterKeyboard(Key.Space));
+
action?.Invoke(hudOverlay);
});
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs
index ad5950d9fc..33ecbed62e 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestScenePlayerLoader.cs
@@ -207,9 +207,11 @@ namespace osu.Game.Tests.Visual.Gameplay
{
RelativeSizeAxes = Axes.Both;
+ OsuScreenStack stack;
+
InternalChildren = new Drawable[]
{
- new OsuScreenStack(screen)
+ stack = new OsuScreenStack
{
RelativeSizeAxes = Axes.Both,
},
@@ -224,6 +226,8 @@ namespace osu.Game.Tests.Visual.Gameplay
Origin = Anchor.TopLeft,
}
};
+
+ stack.Push(screen);
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneResults.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneResults.cs
index 7790126db5..2b7a32ba17 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneResults.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneResults.cs
@@ -75,10 +75,16 @@ namespace osu.Game.Tests.Visual.Gameplay
public void ResultsWithoutPlayer()
{
TestSoloResults screen = null;
+ OsuScreenStack stack;
- AddStep("load results", () => Child = new OsuScreenStack(screen = createResultsScreen())
+ AddStep("load results", () =>
{
- RelativeSizeAxes = Axes.Both
+ Child = stack = new OsuScreenStack
+ {
+ RelativeSizeAxes = Axes.Both
+ };
+
+ stack.Push(screen = createResultsScreen());
});
AddUntilStep("wait for loaded", () => screen.IsLoaded);
AddAssert("retry overlay not present", () => screen.RetryOverlay == null);
@@ -102,11 +108,14 @@ namespace osu.Game.Tests.Visual.Gameplay
public TestResultsContainer(IScreen screen)
{
RelativeSizeAxes = Axes.Both;
+ OsuScreenStack stack;
- InternalChild = new OsuScreenStack(screen)
+ InternalChild = stack = new OsuScreenStack
{
RelativeSizeAxes = Axes.Both,
};
+
+ stack.Push(screen);
}
}
diff --git a/osu.Game.Tests/Visual/Menus/IntroTestScene.cs b/osu.Game.Tests/Visual/Menus/IntroTestScene.cs
index d03d341ee4..5870ef9813 100644
--- a/osu.Game.Tests/Visual/Menus/IntroTestScene.cs
+++ b/osu.Game.Tests/Visual/Menus/IntroTestScene.cs
@@ -31,7 +31,7 @@ namespace osu.Game.Tests.Visual.Menus
protected IntroTestScene()
{
- Drawable introStack = null;
+ OsuScreenStack introStack = null;
Children = new Drawable[]
{
@@ -57,10 +57,12 @@ namespace osu.Game.Tests.Visual.Menus
introStack?.Expire();
- Add(introStack = new OsuScreenStack(CreateScreen())
+ Add(introStack = new OsuScreenStack
{
RelativeSizeAxes = Axes.Both,
});
+
+ introStack.Push(CreateScreen());
});
}
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiHeader.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiHeader.cs
index 3f89f636b1..76ab402b72 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiHeader.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiHeader.cs
@@ -16,7 +16,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
int index = 0;
- OsuScreenStack screenStack = new OsuScreenStack(new TestMultiplayerSubScreen(index)) { RelativeSizeAxes = Axes.Both };
+ OsuScreenStack screenStack = new OsuScreenStack { RelativeSizeAxes = Axes.Both };
+
+ screenStack.Push(new TestMultiplayerSubScreen(index));
Children = new Drawable[]
{
diff --git a/osu.Game.Tests/Visual/Online/TestSceneBeatmapRulesetSelector.cs b/osu.Game.Tests/Visual/Online/TestSceneBeatmapRulesetSelector.cs
index 1f8df438fb..8b077c8de3 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneBeatmapRulesetSelector.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneBeatmapRulesetSelector.cs
@@ -5,6 +5,7 @@ using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics.UserInterface;
using osu.Game.Beatmaps;
+using osu.Game.Overlays;
using osu.Game.Overlays.BeatmapSet;
using osu.Game.Rulesets;
using System;
@@ -21,6 +22,9 @@ namespace osu.Game.Tests.Visual.Online
typeof(BeatmapRulesetTabItem),
};
+ [Cached]
+ private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue);
+
private readonly TestRulesetSelector selector;
public TestSceneBeatmapRulesetSelector()
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsCountryFilter.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsCountryFilter.cs
index 7ac65181f9..79862deb16 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsCountryFilter.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneRankingsCountryFilter.cs
@@ -11,6 +11,8 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osuTK.Graphics;
using osu.Game.Graphics.Sprites;
+using osu.Game.Overlays;
+using osu.Framework.Allocation;
namespace osu.Game.Tests.Visual.Online
{
@@ -22,6 +24,9 @@ namespace osu.Game.Tests.Visual.Online
typeof(CountryPill)
};
+ [Cached]
+ private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
+
public TestSceneRankingsCountryFilter()
{
var countryBindable = new Bindable();
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsDismissableFlag.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsDismissableFlag.cs
deleted file mode 100644
index cd954cd6bd..0000000000
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsDismissableFlag.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using System.Collections.Generic;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Sprites;
-using osu.Game.Graphics;
-using osu.Game.Graphics.Sprites;
-using osu.Game.Overlays.Rankings;
-using osu.Game.Users;
-using osuTK;
-
-namespace osu.Game.Tests.Visual.Online
-{
- public class TestSceneRankingsDismissableFlag : OsuTestScene
- {
- public override IReadOnlyList RequiredTypes => new[]
- {
- typeof(DismissableFlag),
- };
-
- public TestSceneRankingsDismissableFlag()
- {
- DismissableFlag flag;
- SpriteText text;
-
- var countryA = new Country
- {
- FlagName = "BY",
- FullName = "Belarus"
- };
-
- var countryB = new Country
- {
- FlagName = "US",
- FullName = "United States"
- };
-
- AddRange(new Drawable[]
- {
- flag = new DismissableFlag
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Size = new Vector2(30, 20),
- Country = countryA,
- },
- text = new OsuSpriteText
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Text = "Invoked",
- Font = OsuFont.GetFont(size: 30),
- Alpha = 0,
- }
- });
-
- flag.Action += () => text.FadeIn().Then().FadeOut(1000, Easing.OutQuint);
-
- AddStep("Trigger click", () => flag.Click());
- AddStep("Change to country 2", () => flag.Country = countryB);
- AddStep("Change to country 1", () => flag.Country = countryA);
- }
- }
-}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsHeader.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsHeader.cs
index e708934bc3..898e461bde 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsHeader.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneRankingsHeader.cs
@@ -3,8 +3,9 @@
using System;
using System.Collections.Generic;
+using osu.Framework.Allocation;
using osu.Framework.Bindables;
-using osu.Framework.Graphics;
+using osu.Game.Overlays;
using osu.Game.Overlays.Rankings;
using osu.Game.Rulesets;
using osu.Game.Users;
@@ -15,24 +16,23 @@ namespace osu.Game.Tests.Visual.Online
{
public override IReadOnlyList RequiredTypes => new[]
{
- typeof(DismissableFlag),
- typeof(HeaderTitle),
- typeof(RankingsRulesetSelector),
- typeof(RankingsScopeSelector),
- typeof(RankingsHeader),
+ typeof(RankingsOverlayHeader),
+ typeof(CountryFilter),
+ typeof(CountryPill)
};
+ [Cached]
+ private readonly OverlayColourProvider overlayColour = new OverlayColourProvider(OverlayColourScheme.Green);
+
public TestSceneRankingsHeader()
{
var countryBindable = new Bindable();
var ruleset = new Bindable();
var scope = new Bindable();
- Add(new RankingsHeader
+ Add(new RankingsOverlayHeader
{
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Scope = { BindTarget = scope },
+ Current = { BindTarget = scope },
Country = { BindTarget = countryBindable },
Ruleset = { BindTarget = ruleset },
Spotlights = new[]
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsHeaderTitle.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsHeaderTitle.cs
deleted file mode 100644
index 0edf104da0..0000000000
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsHeaderTitle.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using System.Collections.Generic;
-using osu.Framework.Bindables;
-using osu.Framework.Graphics;
-using osu.Game.Overlays.Rankings;
-using osu.Game.Users;
-
-namespace osu.Game.Tests.Visual.Online
-{
- public class TestSceneRankingsHeaderTitle : OsuTestScene
- {
- public override IReadOnlyList RequiredTypes => new[]
- {
- typeof(DismissableFlag),
- typeof(HeaderTitle),
- };
-
- public TestSceneRankingsHeaderTitle()
- {
- var countryBindable = new Bindable();
- var scope = new Bindable();
-
- Add(new HeaderTitle
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Country = { BindTarget = countryBindable },
- Scope = { BindTarget = scope },
- });
-
- var countryA = new Country
- {
- FlagName = "BY",
- FullName = "Belarus"
- };
-
- var countryB = new Country
- {
- FlagName = "US",
- FullName = "United States"
- };
-
- AddStep("Set country 1", () => countryBindable.Value = countryA);
- AddStep("Set country 2", () => countryBindable.Value = countryB);
- AddStep("Set null country", () => countryBindable.Value = null);
- AddStep("Set scope to Performance", () => scope.Value = RankingsScope.Performance);
- AddStep("Set scope to Spotlights", () => scope.Value = RankingsScope.Spotlights);
- AddStep("Set scope to Score", () => scope.Value = RankingsScope.Score);
- AddStep("Set scope to Country", () => scope.Value = RankingsScope.Country);
- }
- }
-}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsOverlay.cs
index 568e36df4c..a769ebe4a9 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneRankingsOverlay.cs
@@ -25,7 +25,8 @@ namespace osu.Game.Tests.Visual.Online
typeof(TableRowBackground),
typeof(UserBasedTable),
typeof(RankingsTable<>),
- typeof(RankingsOverlay)
+ typeof(RankingsOverlay),
+ typeof(RankingsOverlayHeader)
};
[Cached]
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsRulesetSelector.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsRulesetSelector.cs
deleted file mode 100644
index 84515bd3a4..0000000000
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsRulesetSelector.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using System.Collections.Generic;
-using osu.Game.Overlays.Rankings;
-using osu.Framework.Graphics;
-using osu.Game.Rulesets;
-using osu.Framework.Bindables;
-using osu.Game.Rulesets.Osu;
-using osu.Game.Rulesets.Mania;
-using osu.Game.Rulesets.Taiko;
-using osu.Game.Rulesets.Catch;
-
-namespace osu.Game.Tests.Visual.Online
-{
- public class TestSceneRankingsRulesetSelector : OsuTestScene
- {
- public override IReadOnlyList RequiredTypes => new[]
- {
- typeof(RankingsRulesetSelector),
- };
-
- public TestSceneRankingsRulesetSelector()
- {
- var current = new Bindable();
-
- Add(new RankingsRulesetSelector
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Current = { BindTarget = current }
- });
-
- AddStep("Select osu!", () => current.Value = new OsuRuleset().RulesetInfo);
- AddStep("Select mania", () => current.Value = new ManiaRuleset().RulesetInfo);
- AddStep("Select taiko", () => current.Value = new TaikoRuleset().RulesetInfo);
- AddStep("Select catch", () => current.Value = new CatchRuleset().RulesetInfo);
- }
- }
-}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsScopeSelector.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsScopeSelector.cs
deleted file mode 100644
index 3693d6b5b4..0000000000
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsScopeSelector.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-using System.Collections.Generic;
-using osu.Framework.Graphics;
-using osu.Framework.Bindables;
-using osu.Framework.Graphics.Shapes;
-using osu.Framework.Allocation;
-using osu.Game.Graphics;
-using osu.Game.Overlays.Rankings;
-
-namespace osu.Game.Tests.Visual.Online
-{
- public class TestSceneRankingsScopeSelector : OsuTestScene
- {
- public override IReadOnlyList RequiredTypes => new[]
- {
- typeof(RankingsScopeSelector),
- };
-
- private readonly Box background;
-
- public TestSceneRankingsScopeSelector()
- {
- var scope = new Bindable();
-
- AddRange(new Drawable[]
- {
- background = new Box
- {
- RelativeSizeAxes = Axes.Both
- },
- new RankingsScopeSelector
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Current = scope,
- }
- });
-
- AddStep(@"Select country", () => scope.Value = RankingsScope.Country);
- AddStep(@"Select performance", () => scope.Value = RankingsScope.Performance);
- AddStep(@"Select score", () => scope.Value = RankingsScope.Score);
- AddStep(@"Select spotlights", () => scope.Value = RankingsScope.Spotlights);
- }
-
- [BackgroundDependencyLoader]
- private void load(OsuColour colours)
- {
- background.Colour = colours.GreySeafoam;
- }
- }
-}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsSpotlightSelector.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsSpotlightSelector.cs
new file mode 100644
index 0000000000..e46c8a4a71
--- /dev/null
+++ b/osu.Game.Tests/Visual/Online/TestSceneRankingsSpotlightSelector.cs
@@ -0,0 +1,87 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+using osu.Framework.Allocation;
+using osu.Game.Online.API;
+using osu.Game.Online.API.Requests;
+using osu.Game.Online.API.Requests.Responses;
+using osu.Game.Overlays;
+using osu.Game.Overlays.Rankings;
+
+namespace osu.Game.Tests.Visual.Online
+{
+ public class TestSceneRankingsSpotlightSelector : OsuTestScene
+ {
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(SpotlightSelector),
+ };
+
+ protected override bool UseOnlineAPI => true;
+
+ [Cached]
+ private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
+
+ [Resolved]
+ private IAPIProvider api { get; set; }
+
+ private readonly SpotlightSelector selector;
+
+ public TestSceneRankingsSpotlightSelector()
+ {
+ Add(selector = new SpotlightSelector());
+ }
+
+ [Test]
+ public void TestLocalSpotlights()
+ {
+ var spotlights = new[]
+ {
+ new APISpotlight
+ {
+ Name = "Spotlight 1",
+ StartDate = DateTimeOffset.Now,
+ EndDate = DateTimeOffset.Now,
+ },
+ new APISpotlight
+ {
+ Name = "Spotlight 2",
+ StartDate = DateTimeOffset.Now,
+ EndDate = DateTimeOffset.Now,
+ },
+ new APISpotlight
+ {
+ Name = "Spotlight 3",
+ StartDate = DateTimeOffset.Now,
+ EndDate = DateTimeOffset.Now,
+ },
+ };
+
+ AddStep("load spotlights", () => selector.Spotlights = spotlights);
+ AddStep("change to spotlight 3", () => selector.Current.Value = spotlights[2]);
+ }
+
+ [Test]
+ public void TestOnlineSpotlights()
+ {
+ List spotlights = null;
+
+ AddStep("retrieve spotlights", () =>
+ {
+ var req = new GetSpotlightsRequest();
+ req.Success += res => spotlights = res.Spotlights;
+
+ api.Perform(req);
+ });
+
+ AddStep("set spotlights", () =>
+ {
+ if (spotlights != null)
+ selector.Spotlights = spotlights;
+ });
+ }
+ }
+}
diff --git a/osu.Game.Tests/Visual/Online/TestSceneRankingsTables.cs b/osu.Game.Tests/Visual/Online/TestSceneRankingsTables.cs
index 93da2a439e..656402e713 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneRankingsTables.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneRankingsTables.cs
@@ -16,6 +16,7 @@ using osu.Game.Rulesets.Mania;
using osu.Game.Rulesets.Taiko;
using osu.Game.Rulesets.Catch;
using osu.Framework.Allocation;
+using osu.Game.Overlays;
namespace osu.Game.Tests.Visual.Online
{
@@ -36,6 +37,9 @@ namespace osu.Game.Tests.Visual.Online
[Resolved]
private IAPIProvider api { get; set; }
+ [Cached]
+ private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Green);
+
private readonly BasicScrollContainer scrollFlow;
private readonly DimmedLoadingLayer loading;
private CancellationTokenSource cancellationToken;
@@ -64,6 +68,7 @@ namespace osu.Game.Tests.Visual.Online
AddStep("Mania scores", () => createScoreTable(new ManiaRuleset().RulesetInfo));
AddStep("Taiko country scores", () => createCountryTable(new TaikoRuleset().RulesetInfo));
AddStep("Catch US performance page 10", () => createPerformanceTable(new CatchRuleset().RulesetInfo, "US", 10));
+ AddStep("Osu spotlight table (chart 271)", () => createSpotlightTable(new OsuRuleset().RulesetInfo, 271));
}
private void createCountryTable(RulesetInfo ruleset, int page = 1)
@@ -108,6 +113,20 @@ namespace osu.Game.Tests.Visual.Online
api.Queue(request);
}
+ private void createSpotlightTable(RulesetInfo ruleset, int spotlight)
+ {
+ onLoadStarted();
+
+ request = new GetSpotlightRankingsRequest(ruleset, spotlight);
+ ((GetSpotlightRankingsRequest)request).Success += rankings => Schedule(() =>
+ {
+ var table = new ScoresTable(1, rankings.Users);
+ loadTable(table);
+ });
+
+ api.Queue(request);
+ }
+
private void onLoadStarted()
{
loading.Show();
diff --git a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs
index 1b136d9e41..3c959e05c1 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs
@@ -3,11 +3,13 @@
using System;
using System.Collections.Generic;
+using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Utils;
using osu.Game.Online.API.Requests.Responses;
+using osu.Game.Overlays;
using osu.Game.Overlays.BeatmapSet.Scores;
using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Scoring;
@@ -27,6 +29,9 @@ namespace osu.Game.Tests.Visual.Online
typeof(ScoreTableRowBackground),
};
+ [Cached]
+ private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue);
+
public TestSceneScoresContainer()
{
TestScoresContainer scoresContainer;
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
index cd0ce26ea5..d56324dbe8 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs
@@ -60,7 +60,6 @@ namespace osu.Game.Tests.Visual.UserInterface
{
modSelect = new TestModSelectOverlay
{
- RelativeSizeAxes = Axes.X,
Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre,
SelectedMods = { BindTarget = SelectedMods }
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
index a89b4f5ba9..22ba972390 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSettings.cs
@@ -79,7 +79,6 @@ namespace osu.Game.Tests.Visual.UserInterface
{
Child = modSelect = new TestModSelectOverlay
{
- RelativeSizeAxes = Axes.X,
Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre,
SelectedMods = { BindTarget = SelectedMods }
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs
index c899ccb9eb..1cd68d1fdd 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneOverlayHeader.cs
@@ -53,7 +53,7 @@ namespace osu.Game.Tests.Visual.UserInterface
addHeader("Orange OverlayHeader (no background)", new TestNoBackgroundHeader(), OverlayColourScheme.Orange);
addHeader("Blue OverlayHeader", new TestNoControlHeader(), OverlayColourScheme.Blue);
- addHeader("Green TabControlOverlayHeader (string)", new TestStringTabControlHeader(), OverlayColourScheme.Green);
+ addHeader("Green TabControlOverlayHeader (string) with ruleset selector", new TestStringTabControlHeader(), OverlayColourScheme.Green);
addHeader("Pink TabControlOverlayHeader (enum)", new TestEnumTabControlHeader(), OverlayColourScheme.Pink);
addHeader("Red BreadcrumbControlOverlayHeader (no background)", new TestBreadcrumbControlHeader(), OverlayColourScheme.Red);
}
@@ -116,6 +116,8 @@ namespace osu.Game.Tests.Visual.UserInterface
protected override ScreenTitle CreateTitle() => new TestTitle();
+ protected override Drawable CreateTitleContent() => new OverlayRulesetSelector();
+
public TestStringTabControlHeader()
{
TabControl.AddItem("tab1");
diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
index 7386e0fa1f..77a7d819a9 100644
--- a/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
+++ b/osu.Game.Tests/Visual/UserInterface/TestSceneScreenBreadcrumbControl.cs
@@ -25,7 +25,9 @@ namespace osu.Game.Tests.Visual.UserInterface
OsuSpriteText titleText;
IScreen startScreen = new TestScreenOne();
- screenStack = new OsuScreenStack(startScreen) { RelativeSizeAxes = Axes.Both };
+
+ screenStack = new OsuScreenStack { RelativeSizeAxes = Axes.Both };
+ screenStack.Push(startScreen);
Children = new Drawable[]
{
diff --git a/osu.Game/Graphics/UserInterface/ScreenBreadcrumbControl.cs b/osu.Game/Graphics/UserInterface/ScreenBreadcrumbControl.cs
index 3e0a6c3265..e85525b2f8 100644
--- a/osu.Game/Graphics/UserInterface/ScreenBreadcrumbControl.cs
+++ b/osu.Game/Graphics/UserInterface/ScreenBreadcrumbControl.cs
@@ -17,7 +17,8 @@ namespace osu.Game.Graphics.UserInterface
stack.ScreenPushed += onPushed;
stack.ScreenExited += onExited;
- onPushed(null, stack.CurrentScreen);
+ if (stack.CurrentScreen != null)
+ onPushed(null, stack.CurrentScreen);
Current.ValueChanged += current => current.NewValue.MakeCurrent();
}
diff --git a/osu.Game/Online/API/Requests/GetSpotlightRankingsRequest.cs b/osu.Game/Online/API/Requests/GetSpotlightRankingsRequest.cs
new file mode 100644
index 0000000000..a279db134f
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetSpotlightRankingsRequest.cs
@@ -0,0 +1,30 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.IO.Network;
+using osu.Game.Rulesets;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetSpotlightRankingsRequest : GetRankingsRequest
+ {
+ private readonly int spotlight;
+
+ public GetSpotlightRankingsRequest(RulesetInfo ruleset, int spotlight)
+ : base(ruleset, 1)
+ {
+ this.spotlight = spotlight;
+ }
+
+ protected override WebRequest CreateWebRequest()
+ {
+ var req = base.CreateWebRequest();
+
+ req.AddParameter("spotlight", spotlight.ToString());
+
+ return req;
+ }
+
+ protected override string TargetPostfix() => "charts";
+ }
+}
diff --git a/osu.Game/Online/API/Requests/GetSpotlightRankingsResponse.cs b/osu.Game/Online/API/Requests/GetSpotlightRankingsResponse.cs
new file mode 100644
index 0000000000..2259314a9f
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetSpotlightRankingsResponse.cs
@@ -0,0 +1,22 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Collections.Generic;
+using Newtonsoft.Json;
+using osu.Game.Online.API.Requests.Responses;
+using osu.Game.Users;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetSpotlightRankingsResponse
+ {
+ [JsonProperty("ranking")]
+ public List Users;
+
+ [JsonProperty("spotlight")]
+ public APISpotlight Spotlight;
+
+ [JsonProperty("beatmapsets")]
+ public List BeatmapSets;
+ }
+}
diff --git a/osu.Game/Online/API/Requests/GetSpotlightsRequest.cs b/osu.Game/Online/API/Requests/GetSpotlightsRequest.cs
new file mode 100644
index 0000000000..6fafb3933c
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetSpotlightsRequest.cs
@@ -0,0 +1,20 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Collections.Generic;
+using Newtonsoft.Json;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetSpotlightsRequest : APIRequest
+ {
+ protected override string Target => "spotlights";
+ }
+
+ public class SpotlightsCollection
+ {
+ [JsonProperty("spotlights")]
+ public List Spotlights;
+ }
+}
diff --git a/osu.Game/Online/API/Requests/Responses/APISpotlight.cs b/osu.Game/Online/API/Requests/Responses/APISpotlight.cs
new file mode 100644
index 0000000000..3a002e57b2
--- /dev/null
+++ b/osu.Game/Online/API/Requests/Responses/APISpotlight.cs
@@ -0,0 +1,31 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using Newtonsoft.Json;
+
+namespace osu.Game.Online.API.Requests.Responses
+{
+ public class APISpotlight
+ {
+ [JsonProperty("id")]
+ public int Id;
+
+ [JsonProperty("name")]
+ public string Name;
+
+ [JsonProperty("type")]
+ public string Type;
+
+ [JsonProperty("mode_specific")]
+ public bool ModeSpecific;
+
+ [JsonProperty(@"start_date")]
+ public DateTimeOffset StartDate;
+
+ [JsonProperty(@"end_date")]
+ public DateTimeOffset EndDate;
+
+ public override string ToString() => Name;
+ }
+}
diff --git a/osu.Game/Online/Leaderboards/LeaderboardScore.cs b/osu.Game/Online/Leaderboards/LeaderboardScore.cs
index c8b2f2327b..c9131883bb 100644
--- a/osu.Game/Online/Leaderboards/LeaderboardScore.cs
+++ b/osu.Game/Online/Leaderboards/LeaderboardScore.cs
@@ -277,7 +277,7 @@ namespace osu.Game.Online.Leaderboards
protected virtual IEnumerable GetStatistics(ScoreInfo model) => new[]
{
new LeaderboardScoreStatistic(FontAwesome.Solid.Link, "Max Combo", model.MaxCombo.ToString()),
- new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", string.Format(model.Accuracy % 1 == 0 ? @"{0:0%}" : @"{0:0.00%}", model.Accuracy))
+ new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", model.DisplayAccuracy)
};
protected override bool OnHover(HoverEvent e)
diff --git a/osu.Game/Overlays/BeatmapSet/BeatmapRulesetSelector.cs b/osu.Game/Overlays/BeatmapSet/BeatmapRulesetSelector.cs
index a0bedc848e..005d21726b 100644
--- a/osu.Game/Overlays/BeatmapSet/BeatmapRulesetSelector.cs
+++ b/osu.Game/Overlays/BeatmapSet/BeatmapRulesetSelector.cs
@@ -2,17 +2,14 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Bindables;
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.UserInterface;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
-using osuTK;
using System.Linq;
namespace osu.Game.Overlays.BeatmapSet
{
- public class BeatmapRulesetSelector : RulesetSelector
+ public class BeatmapRulesetSelector : OverlayRulesetSelector
{
private readonly Bindable beatmapSet = new Bindable();
@@ -28,21 +25,9 @@ namespace osu.Game.Overlays.BeatmapSet
}
}
- public BeatmapRulesetSelector()
- {
- AutoSizeAxes = Axes.Both;
- }
-
protected override TabItem CreateTabItem(RulesetInfo value) => new BeatmapRulesetTabItem(value)
{
BeatmapSet = { BindTarget = beatmapSet }
};
-
- protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer
- {
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(10, 0),
- };
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/BeatmapRulesetTabItem.cs b/osu.Game/Overlays/BeatmapSet/BeatmapRulesetTabItem.cs
index cdea49afe7..cb258edced 100644
--- a/osu.Game/Overlays/BeatmapSet/BeatmapRulesetTabItem.cs
+++ b/osu.Game/Overlays/BeatmapSet/BeatmapRulesetTabItem.cs
@@ -3,143 +3,74 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
-using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Graphics.UserInterface;
-using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
using osu.Game.Rulesets;
-using osuTK;
-using osuTK.Graphics;
using System.Linq;
namespace osu.Game.Overlays.BeatmapSet
{
- public class BeatmapRulesetTabItem : TabItem
+ public class BeatmapRulesetTabItem : OverlayRulesetTabItem
{
- private readonly OsuSpriteText name, count;
- private readonly Box bar;
-
public readonly Bindable BeatmapSet = new Bindable();
- public override bool PropagatePositionalInputSubTree => Enabled.Value && !Active.Value && base.PropagatePositionalInputSubTree;
+ [Resolved]
+ private OverlayColourProvider colourProvider { get; set; }
+
+ private OsuSpriteText count;
+ private Container countContainer;
public BeatmapRulesetTabItem(RulesetInfo value)
: base(value)
{
- AutoSizeAxes = Axes.Both;
+ }
- FillFlowContainer nameContainer;
-
- Children = new Drawable[]
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ Add(countContainer = new Container
{
- nameContainer = new FillFlowContainer
+ AutoSizeAxes = Axes.Both,
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Masking = true,
+ CornerRadius = 4f,
+ Children = new Drawable[]
{
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Horizontal,
- Margin = new MarginPadding { Bottom = 7.5f },
- Spacing = new Vector2(2.5f),
- Children = new Drawable[]
+ new Box
{
- name = new OsuSpriteText
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Text = value.Name,
- Font = OsuFont.Default.With(size: 18),
- },
- new Container
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- AutoSizeAxes = Axes.Both,
- Masking = true,
- CornerRadius = 4f,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = Color4.Black.Opacity(0.5f),
- },
- count = new OsuSpriteText
- {
- Alpha = 0,
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Margin = new MarginPadding { Horizontal = 5f },
- Font = OsuFont.Default.With(weight: FontWeight.SemiBold),
- }
- }
- }
+ RelativeSizeAxes = Axes.Both,
+ Colour = colourProvider.Background6
+ },
+ count = new OsuSpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Margin = new MarginPadding { Horizontal = 5f },
+ Font = OsuFont.Default.With(weight: FontWeight.SemiBold),
+ Colour = colourProvider.Foreground1,
}
- },
- bar = new Box
- {
- Anchor = Anchor.BottomCentre,
- Origin = Anchor.BottomCentre,
- RelativeSizeAxes = Axes.X,
- },
- new HoverClickSounds(),
- };
+ }
+ });
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
BeatmapSet.BindValueChanged(setInfo =>
{
var beatmapsCount = setInfo.NewValue?.Beatmaps.Count(b => b.Ruleset.Equals(Value)) ?? 0;
count.Text = beatmapsCount.ToString();
- count.Alpha = beatmapsCount > 0 ? 1f : 0f;
+ countContainer.FadeTo(beatmapsCount > 0 ? 1 : 0);
Enabled.Value = beatmapsCount > 0;
}, true);
-
- Enabled.BindValueChanged(v => nameContainer.Alpha = v.NewValue ? 1f : 0.5f, true);
}
-
- [Resolved]
- private OsuColour colour { get; set; }
-
- protected override void LoadComplete()
- {
- base.LoadComplete();
-
- count.Colour = colour.Gray9;
- bar.Colour = colour.Blue;
-
- updateState();
- }
-
- private void updateState()
- {
- var isHoveredOrActive = IsHovered || Active.Value;
-
- bar.ResizeHeightTo(isHoveredOrActive ? 4 : 0, 200, Easing.OutQuint);
-
- name.Colour = isHoveredOrActive ? colour.GrayE : colour.GrayC;
- name.Font = name.Font.With(weight: Active.Value ? FontWeight.Bold : FontWeight.Regular);
- }
-
- #region Hovering and activation logic
-
- protected override void OnActivated() => updateState();
-
- protected override void OnDeactivated() => updateState();
-
- protected override bool OnHover(HoverEvent e)
- {
- updateState();
- return false;
- }
-
- protected override void OnHoverLost(HoverLostEvent e) => updateState();
-
- #endregion
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs b/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs
new file mode 100644
index 0000000000..e5e3e276d5
--- /dev/null
+++ b/osu.Game/Overlays/BeatmapSet/BeatmapSetHeader.cs
@@ -0,0 +1,35 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Bindables;
+using osu.Framework.Graphics;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Rulesets;
+
+namespace osu.Game.Overlays.BeatmapSet
+{
+ public class BeatmapSetHeader : OverlayHeader
+ {
+ public readonly Bindable Ruleset = new Bindable();
+
+ public BeatmapRulesetSelector RulesetSelector { get; private set; }
+
+ protected override ScreenTitle CreateTitle() => new BeatmapHeaderTitle();
+
+ protected override Drawable CreateTitleContent() => RulesetSelector = new BeatmapRulesetSelector
+ {
+ Current = Ruleset
+ };
+
+ private class BeatmapHeaderTitle : ScreenTitle
+ {
+ public BeatmapHeaderTitle()
+ {
+ Title = @"beatmap";
+ Section = @"info";
+ }
+
+ protected override Drawable CreateIcon() => new ScreenTitleTextureIcon(@"Icons/changelog");
+ }
+ }
+}
diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs
index 7b42e7e459..7c5c5a9d55 100644
--- a/osu.Game/Overlays/BeatmapSet/Header.cs
+++ b/osu.Game/Overlays/BeatmapSet/Header.cs
@@ -26,11 +26,9 @@ namespace osu.Game.Overlays.BeatmapSet
public class Header : BeatmapDownloadTrackingComposite
{
private const float transition_duration = 200;
- private const float tabs_height = 50;
private const float buttons_height = 45;
private const float buttons_spacing = 5;
- private readonly Box tabsBg;
private readonly UpdateableBeatmapSetCover cover;
private readonly OsuSpriteText title, artist;
private readonly AuthorInfo author;
@@ -41,14 +39,13 @@ namespace osu.Game.Overlays.BeatmapSet
public bool DownloadButtonsVisible => downloadButtonsContainer.Any();
- public readonly BeatmapRulesetSelector RulesetSelector;
+ public BeatmapRulesetSelector RulesetSelector => beatmapSetHeader.RulesetSelector;
public readonly BeatmapPicker Picker;
private readonly FavouriteButton favouriteButton;
-
private readonly FillFlowContainer fadeContent;
-
private readonly LoadingAnimation loading;
+ private readonly BeatmapSetHeader beatmapSetHeader;
[Cached(typeof(IBindable))]
private readonly Bindable ruleset = new Bindable();
@@ -69,154 +66,145 @@ namespace osu.Game.Overlays.BeatmapSet
Offset = new Vector2(0f, 1f),
};
- InternalChildren = new Drawable[]
+ InternalChild = new FillFlowContainer
{
- new Container
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
{
- RelativeSizeAxes = Axes.X,
- Height = tabs_height,
- Children = new Drawable[]
+ beatmapSetHeader = new BeatmapSetHeader
{
- tabsBg = new Box
- {
- RelativeSizeAxes = Axes.Both,
- },
- RulesetSelector = new BeatmapRulesetSelector
- {
- Current = ruleset,
- Anchor = Anchor.BottomCentre,
- Origin = Anchor.BottomCentre,
- }
+ Ruleset = { BindTarget = ruleset },
},
- },
- new Container
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Padding = new MarginPadding { Top = tabs_height },
- Children = new Drawable[]
+ new Container
{
- new Container
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Children = new Drawable[]
{
- RelativeSizeAxes = Axes.Both,
- Children = new Drawable[]
+ new Container
{
- cover = new UpdateableBeatmapSetCover
+ RelativeSizeAxes = Axes.Both,
+ Children = new Drawable[]
{
- RelativeSizeAxes = Axes.Both,
- Masking = true,
- },
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = ColourInfo.GradientVertical(Color4.Black.Opacity(0.3f), Color4.Black.Opacity(0.8f)),
- },
- },
- },
- new Container
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Padding = new MarginPadding
- {
- Top = 20,
- Bottom = 30,
- Left = BeatmapSetOverlay.X_PADDING,
- Right = BeatmapSetOverlay.X_PADDING + BeatmapSetOverlay.RIGHT_WIDTH,
- },
- Children = new Drawable[]
- {
- fadeContent = new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Vertical,
- Children = new Drawable[]
+ cover = new UpdateableBeatmapSetCover
{
- new Container
+ RelativeSizeAxes = Axes.Both,
+ Masking = true,
+ },
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = ColourInfo.GradientVertical(Color4.Black.Opacity(0.3f), Color4.Black.Opacity(0.8f)),
+ },
+ },
+ },
+ new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Padding = new MarginPadding
+ {
+ Top = 20,
+ Bottom = 30,
+ Left = BeatmapSetOverlay.X_PADDING,
+ Right = BeatmapSetOverlay.X_PADDING + BeatmapSetOverlay.RIGHT_WIDTH,
+ },
+ Children = new Drawable[]
+ {
+ fadeContent = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
{
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Child = Picker = new BeatmapPicker(),
- },
- new FillFlowContainer
- {
- Direction = FillDirection.Horizontal,
- AutoSizeAxes = Axes.Both,
- Children = new Drawable[]
+ new Container
{
- title = new OsuSpriteText
- {
- Font = OsuFont.GetFont(size: 37, weight: FontWeight.Bold, italics: true)
- },
- externalLink = new ExternalLinkButton
- {
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Margin = new MarginPadding { Left = 3, Bottom = 4 }, //To better lineup with the font
- },
- }
- },
- artist = new OsuSpriteText { Font = OsuFont.GetFont(size: 25, weight: FontWeight.SemiBold, italics: true) },
- new Container
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Margin = new MarginPadding { Top = 20 },
- Child = author = new AuthorInfo(),
- },
- beatmapAvailability = new BeatmapAvailability(),
- new Container
- {
- RelativeSizeAxes = Axes.X,
- Height = buttons_height,
- Margin = new MarginPadding { Top = 10 },
- Children = new Drawable[]
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Child = Picker = new BeatmapPicker(),
+ },
+ new FillFlowContainer
{
- favouriteButton = new FavouriteButton
+ Direction = FillDirection.Horizontal,
+ AutoSizeAxes = Axes.Both,
+ Children = new Drawable[]
{
- BeatmapSet = { BindTarget = BeatmapSet }
- },
- downloadButtonsContainer = new FillFlowContainer
+ title = new OsuSpriteText
+ {
+ Font = OsuFont.GetFont(size: 37, weight: FontWeight.Bold, italics: true)
+ },
+ externalLink = new ExternalLinkButton
+ {
+ Anchor = Anchor.BottomLeft,
+ Origin = Anchor.BottomLeft,
+ Margin = new MarginPadding { Left = 3, Bottom = 4 }, //To better lineup with the font
+ },
+ }
+ },
+ artist = new OsuSpriteText { Font = OsuFont.GetFont(size: 25, weight: FontWeight.SemiBold, italics: true) },
+ new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Margin = new MarginPadding { Top = 20 },
+ Child = author = new AuthorInfo(),
+ },
+ beatmapAvailability = new BeatmapAvailability(),
+ new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ Height = buttons_height,
+ Margin = new MarginPadding { Top = 10 },
+ Children = new Drawable[]
{
- RelativeSizeAxes = Axes.Both,
- Padding = new MarginPadding { Left = buttons_height + buttons_spacing },
- Spacing = new Vector2(buttons_spacing),
+ favouriteButton = new FavouriteButton
+ {
+ BeatmapSet = { BindTarget = BeatmapSet }
+ },
+ downloadButtonsContainer = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.Both,
+ Padding = new MarginPadding { Left = buttons_height + buttons_spacing },
+ Spacing = new Vector2(buttons_spacing),
+ },
},
},
},
},
- },
- }
- },
- loading = new LoadingAnimation
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Scale = new Vector2(1.5f),
- },
- new FillFlowContainer
- {
- Anchor = Anchor.BottomRight,
- Origin = Anchor.BottomRight,
- AutoSizeAxes = Axes.Both,
- Margin = new MarginPadding { Top = BeatmapSetOverlay.TOP_PADDING, Right = BeatmapSetOverlay.X_PADDING },
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(10),
- Children = new Drawable[]
+ }
+ },
+ loading = new LoadingAnimation
{
- onlineStatusPill = new BeatmapSetOnlineStatusPill
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Scale = new Vector2(1.5f),
+ },
+ new FillFlowContainer
+ {
+ Anchor = Anchor.BottomRight,
+ Origin = Anchor.BottomRight,
+ AutoSizeAxes = Axes.Both,
+ Margin = new MarginPadding { Top = BeatmapSetOverlay.TOP_PADDING, Right = BeatmapSetOverlay.X_PADDING },
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(10),
+ Children = new Drawable[]
{
- Anchor = Anchor.TopRight,
- Origin = Anchor.TopRight,
- TextSize = 14,
- TextPadding = new MarginPadding { Horizontal = 25, Vertical = 8 }
+ onlineStatusPill = new BeatmapSetOnlineStatusPill
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ TextSize = 14,
+ TextPadding = new MarginPadding { Horizontal = 25, Vertical = 8 }
+ },
+ Details = new Details(),
},
- Details = new Details(),
},
},
},
- },
+ }
};
Picker.Beatmap.ValueChanged += b =>
@@ -229,8 +217,6 @@ namespace osu.Game.Overlays.BeatmapSet
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- tabsBg.Colour = colours.Gray3;
-
State.BindValueChanged(_ => updateDownloadButtons());
BeatmapSet.BindValueChanged(setInfo =>
diff --git a/osu.Game/Overlays/BeatmapSet/Info.cs b/osu.Game/Overlays/BeatmapSet/Info.cs
index 16d6236051..d7392b31e1 100644
--- a/osu.Game/Overlays/BeatmapSet/Info.cs
+++ b/osu.Game/Overlays/BeatmapSet/Info.cs
@@ -24,6 +24,7 @@ namespace osu.Game.Overlays.BeatmapSet
private const float spacing = 20;
private readonly Box successRateBackground;
+ private readonly Box background;
private readonly SuccessRate successRate;
public readonly Bindable BeatmapSet = new Bindable();
@@ -50,10 +51,9 @@ namespace osu.Game.Overlays.BeatmapSet
Children = new Drawable[]
{
- new Box
+ background = new Box
{
- RelativeSizeAxes = Axes.Both,
- Colour = Color4.White,
+ RelativeSizeAxes = Axes.Both
},
new Container
{
@@ -126,14 +126,14 @@ namespace osu.Game.Overlays.BeatmapSet
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- successRateBackground.Colour = colours.GrayE;
+ successRateBackground.Colour = colourProvider.Background4;
+ background.Colour = colourProvider.Background5;
}
private class MetadataSection : FillFlowContainer
{
- private readonly OsuSpriteText header;
private readonly TextFlowContainer textFlow;
public string Text
@@ -148,7 +148,7 @@ namespace osu.Game.Overlays.BeatmapSet
this.FadeIn(transition_duration);
textFlow.Clear();
- textFlow.AddText(value, s => s.Font = s.Font.With(size: 14));
+ textFlow.AddText(value, s => s.Font = s.Font.With(size: 12));
}
}
@@ -160,11 +160,10 @@ namespace osu.Game.Overlays.BeatmapSet
InternalChildren = new Drawable[]
{
- header = new OsuSpriteText
+ new OsuSpriteText
{
Text = title,
- Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
- Shadow = false,
+ Font = OsuFont.GetFont(size: 14, weight: FontWeight.Black),
Margin = new MarginPadding { Top = 20 },
},
textFlow = new OsuTextFlowContainer
@@ -174,12 +173,6 @@ namespace osu.Game.Overlays.BeatmapSet
},
};
}
-
- [BackgroundDependencyLoader]
- private void load(OsuColour colours)
- {
- header.Colour = textFlow.Colour = colours.Gray5;
- }
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
index d263483046..bb85b4a37b 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs
@@ -7,8 +7,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.Events;
-using osu.Game.Graphics;
using osu.Game.Scoring;
using osuTK;
using osuTK.Graphics;
@@ -17,11 +15,6 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
public class DrawableTopScore : CompositeDrawable
{
- private const float fade_duration = 100;
-
- private Color4 backgroundIdleColour;
- private Color4 backgroundHoveredColour;
-
private readonly Box background;
public DrawableTopScore(ScoreInfo score, int position = 1)
@@ -30,7 +23,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
AutoSizeAxes = Axes.Y;
Masking = true;
- CornerRadius = 10;
+ CornerRadius = 5;
EdgeEffect = new EdgeEffectParameters
{
Type = EdgeEffectType.Shadow,
@@ -49,7 +42,12 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Padding = new MarginPadding(10),
+ Padding = new MarginPadding
+ {
+ Vertical = 10,
+ Left = 10,
+ Right = 25,
+ },
Children = new Drawable[]
{
new AutoSizingGrid
@@ -84,24 +82,9 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- backgroundIdleColour = colours.Gray3;
- backgroundHoveredColour = colours.Gray4;
-
- background.Colour = backgroundIdleColour;
- }
-
- protected override bool OnHover(HoverEvent e)
- {
- background.FadeColour(backgroundHoveredColour, fade_duration, Easing.OutQuint);
- return base.OnHover(e);
- }
-
- protected override void OnHoverLost(HoverLostEvent e)
- {
- background.FadeColour(backgroundIdleColour, fade_duration, Easing.OutQuint);
- base.OnHoverLost(e);
+ background.Colour = colourProvider.Background4;
}
private class AutoSizingGrid : GridContainer
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
index f6723839b2..7a17412722 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTable.cs
@@ -23,7 +23,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
private const float horizontal_inset = 20;
private const float row_height = 25;
- private const int text_size = 14;
+ private const int text_size = 12;
private readonly FillFlowContainer backgroundFlow;
@@ -116,7 +116,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
new OsuSpriteText
{
Margin = new MarginPadding { Right = horizontal_inset },
- Text = $@"{score.Accuracy:P2}",
+ Text = score.DisplayAccuracy,
Font = OsuFont.GetFont(size: text_size),
Colour = score.Accuracy == 1 ? highAccuracyColour : Color4.White
},
@@ -190,7 +190,13 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
public HeaderText(string text)
{
Text = text.ToUpper();
- Font = OsuFont.GetFont(size: 12, weight: FontWeight.Black);
+ Font = OsuFont.GetFont(size: 10, weight: FontWeight.Bold);
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ Colour = colourProvider.Foreground1;
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTableRowBackground.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTableRowBackground.cs
index 724a7f8b55..14ea3e6b38 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoreTableRowBackground.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoreTableRowBackground.cs
@@ -48,18 +48,18 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours, IAPIProvider api)
+ private void load(OsuColour colours, OverlayColourProvider colourProvider, IAPIProvider api)
{
var isOwnScore = api.LocalUser.Value.Id == score.UserID;
if (isOwnScore)
background.Colour = colours.GreenDarker;
else if (index % 2 == 0)
- background.Colour = colours.Gray3;
+ background.Colour = colourProvider.Background4;
else
background.Alpha = 0;
- hoveredBackground.Colour = isOwnScore ? colours.GreenDark : colours.Gray4;
+ hoveredBackground.Colour = isOwnScore ? colours.GreenDark : colourProvider.Background3;
}
protected override bool OnHover(HoverEvent e)
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
index 0378d364b8..0a3b5d9457 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
@@ -5,7 +5,6 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
using osuTK;
using System.Linq;
@@ -179,9 +178,9 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- background.Colour = colours.Gray2;
+ background.Colour = colourProvider.Background5;
user.BindTo(api.LocalUser);
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
index b9664d7c2f..8a17fef367 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreStatisticsSection.cs
@@ -23,9 +23,11 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
public class TopScoreStatisticsSection : CompositeDrawable
{
private const float margin = 10;
+ private const float top_columns_min_width = 64;
+ private const float bottom_columns_min_width = 45;
- private readonly FontUsage smallFont = OsuFont.GetFont(size: 20);
- private readonly FontUsage largeFont = OsuFont.GetFont(size: 25);
+ private readonly FontUsage smallFont = OsuFont.GetFont(size: 16);
+ private readonly FontUsage largeFont = OsuFont.GetFont(size: 22);
private readonly TextColumn totalScoreColumn;
private readonly TextColumn accuracyColumn;
@@ -44,9 +46,24 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Spacing = new Vector2(10, 0),
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(10, 8),
Children = new Drawable[]
{
+ new FillFlowContainer
+ {
+ Anchor = Anchor.TopRight,
+ Origin = Anchor.TopRight,
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(margin, 0),
+ Children = new Drawable[]
+ {
+ totalScoreColumn = new TextColumn("total score", largeFont, top_columns_min_width),
+ accuracyColumn = new TextColumn("accuracy", largeFont, top_columns_min_width),
+ maxComboColumn = new TextColumn("max combo", largeFont, top_columns_min_width)
+ }
+ },
new FillFlowContainer
{
Anchor = Anchor.TopRight,
@@ -62,24 +79,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
Direction = FillDirection.Horizontal,
Spacing = new Vector2(margin, 0),
},
- ppColumn = new TextColumn("pp", smallFont),
+ ppColumn = new TextColumn("pp", smallFont, bottom_columns_min_width),
modsColumn = new ModsInfoColumn(),
}
},
- new FillFlowContainer
- {
- Anchor = Anchor.TopRight,
- Origin = Anchor.TopRight,
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(margin, 0),
- Children = new Drawable[]
- {
- totalScoreColumn = new TextColumn("total score", largeFont),
- accuracyColumn = new TextColumn("accuracy", largeFont),
- maxComboColumn = new TextColumn("max combo", largeFont)
- }
- },
}
};
}
@@ -92,16 +95,18 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
set
{
totalScoreColumn.Text = $@"{value.TotalScore:N0}";
- accuracyColumn.Text = $@"{value.Accuracy:P2}";
+ accuracyColumn.Text = value.DisplayAccuracy;
maxComboColumn.Text = $@"{value.MaxCombo:N0}x";
ppColumn.Text = $@"{value.PP:N0}";
- statisticsColumns.ChildrenEnumerable = value.Statistics.Select(kvp => createStatisticsColumn(kvp.Key, kvp.Value));
+ statisticsColumns.ChildrenEnumerable = value.Statistics
+ .OrderByDescending(pair => pair.Key)
+ .Select(kvp => createStatisticsColumn(kvp.Key, kvp.Value));
modsColumn.Mods = value.Mods;
}
}
- private TextColumn createStatisticsColumn(HitResult hitResult, int count) => new TextColumn(hitResult.GetDescription(), smallFont)
+ private TextColumn createStatisticsColumn(HitResult hitResult, int count) => new TextColumn(hitResult.GetDescription(), smallFont, bottom_columns_min_width)
{
Text = count.ToString()
};
@@ -109,8 +114,9 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
private class InfoColumn : CompositeDrawable
{
private readonly Box separator;
+ private readonly OsuSpriteText text;
- public InfoColumn(string title, Drawable content)
+ public InfoColumn(string title, Drawable content, float? minWidth = null)
{
AutoSizeAxes = Axes.Both;
@@ -118,18 +124,20 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
- Spacing = new Vector2(0, 2),
+ Spacing = new Vector2(0, 1),
Children = new[]
{
- new OsuSpriteText
+ text = new OsuSpriteText
{
- Font = OsuFont.GetFont(size: 12, weight: FontWeight.Black),
+ Font = OsuFont.GetFont(size: 10, weight: FontWeight.Bold),
Text = title.ToUpper()
},
separator = new Box
{
- RelativeSizeAxes = Axes.X,
- Height = 2
+ RelativeSizeAxes = minWidth == null ? Axes.X : Axes.None,
+ Width = minWidth ?? 1f,
+ Height = 2,
+ Margin = new MarginPadding { Top = 2 }
},
content
}
@@ -137,9 +145,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- separator.Colour = colours.Gray5;
+ text.Colour = colourProvider.Foreground1;
+ separator.Colour = colourProvider.Background3;
}
}
@@ -147,13 +156,13 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
private readonly SpriteText text;
- public TextColumn(string title, FontUsage font)
- : this(title, new OsuSpriteText { Font = font })
+ public TextColumn(string title, FontUsage font, float? minWidth = null)
+ : this(title, new OsuSpriteText { Font = font }, minWidth)
{
}
- private TextColumn(string title, SpriteText text)
- : base(title, text)
+ private TextColumn(string title, SpriteText text, float? minWidth = null)
+ : base(title, text, minWidth)
{
this.text = text;
}
@@ -189,15 +198,11 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
set
{
modsContainer.Clear();
-
- foreach (Mod mod in value)
+ modsContainer.Children = value.Select(mod => new ModIcon(mod)
{
- modsContainer.Add(new ModIcon(mod)
- {
- AutoSizeAxes = Axes.Both,
- Scale = new Vector2(0.3f),
- });
- }
+ AutoSizeAxes = Axes.Both,
+ Scale = new Vector2(0.25f),
+ }).ToList();
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreUserSection.cs b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreUserSection.cs
index 38a909411a..72a7efd777 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/TopScoreUserSection.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/TopScoreUserSection.cs
@@ -1,7 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
@@ -51,13 +50,13 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Font = OsuFont.GetFont(size: 24, weight: FontWeight.Bold, italics: true)
+ Font = OsuFont.GetFont(size: 18, weight: FontWeight.Bold)
},
rank = new UpdateableRank(ScoreRank.D)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Size = new Vector2(40),
+ Size = new Vector2(28),
FillMode = FillMode.Fit,
},
}
@@ -66,7 +65,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Size = new Vector2(80),
+ Size = new Vector2(70),
Masking = true,
CornerRadius = 5,
EdgeEffect = new EdgeEffectParameters
@@ -87,7 +86,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
Spacing = new Vector2(0, 3),
Children = new Drawable[]
{
- usernameText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(size: 20, weight: FontWeight.Bold, italics: true))
+ usernameText = new LinkFlowContainer(s => s.Font = OsuFont.GetFont(size: 18, weight: FontWeight.Bold, italics: true))
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
@@ -97,13 +96,13 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
- Font = OsuFont.GetFont(size: 15, weight: FontWeight.Bold)
+ Font = OsuFont.GetFont(size: 10, weight: FontWeight.Bold)
},
flag = new UpdateableFlag
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
- Size = new Vector2(20, 13),
+ Size = new Vector2(19, 13),
ShowPlaceholderOnNull = false,
},
}
@@ -112,12 +111,6 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
};
}
- [BackgroundDependencyLoader]
- private void load(OsuColour colours)
- {
- rankText.Colour = colours.Yellow;
- }
-
public int ScorePosition
{
set => rankText.Text = $"#{value}";
diff --git a/osu.Game/Overlays/BeatmapSet/SuccessRate.cs b/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
index cd81013c30..1dcc847760 100644
--- a/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
+++ b/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
@@ -17,7 +17,7 @@ namespace osu.Game.Overlays.BeatmapSet
protected readonly FailRetryGraph Graph;
private readonly FillFlowContainer header;
- private readonly OsuSpriteText successRateLabel, successPercent, graphLabel;
+ private readonly OsuSpriteText successPercent;
private readonly Bar successRate;
private readonly Container percentContainer;
@@ -60,7 +60,7 @@ namespace osu.Game.Overlays.BeatmapSet
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- successRateLabel = new OsuSpriteText
+ new OsuSpriteText
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
@@ -85,7 +85,7 @@ namespace osu.Game.Overlays.BeatmapSet
Font = OsuFont.GetFont(size: 13),
},
},
- graphLabel = new OsuSpriteText
+ new OsuSpriteText
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
@@ -107,7 +107,6 @@ namespace osu.Game.Overlays.BeatmapSet
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- successRateLabel.Colour = successPercent.Colour = graphLabel.Colour = colours.Gray5;
successRate.AccentColour = colours.Green;
successRate.BackgroundColour = colours.GrayD;
diff --git a/osu.Game/Overlays/BeatmapSetOverlay.cs b/osu.Game/Overlays/BeatmapSetOverlay.cs
index e4e928df18..f747cfff16 100644
--- a/osu.Game/Overlays/BeatmapSetOverlay.cs
+++ b/osu.Game/Overlays/BeatmapSetOverlay.cs
@@ -9,7 +9,6 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
using osu.Game.Beatmaps;
-using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Online.API.Requests;
using osu.Game.Overlays.BeatmapSet;
@@ -33,6 +32,8 @@ namespace osu.Game.Overlays
// receive input outside our bounds so we can trigger a close event on ourselves.
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
+ private readonly Box background;
+
public BeatmapSetOverlay()
: base(OverlayColourScheme.Blue)
{
@@ -41,10 +42,9 @@ namespace osu.Game.Overlays
Children = new Drawable[]
{
- new Box
+ background = new Box
{
- RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.Gray(0.2f)
+ RelativeSizeAxes = Axes.Both
},
scroll = new OsuScrollContainer
{
@@ -55,10 +55,20 @@ namespace osu.Game.Overlays
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 20),
Children = new Drawable[]
{
- Header = new Header(),
- info = new Info(),
+ new ReverseChildIDFillFlowContainer
+ {
+ AutoSizeAxes = Axes.Y,
+ RelativeSizeAxes = Axes.X,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ Header = new Header(),
+ info = new Info()
+ }
+ },
new ScoresContainer
{
Beatmap = { BindTarget = Header.Picker.Beatmap }
@@ -83,6 +93,8 @@ namespace osu.Game.Overlays
private void load(RulesetStore rulesets)
{
this.rulesets = rulesets;
+
+ background.Colour = ColourProvider.Background6;
}
protected override void PopOutComplete()
diff --git a/osu.Game/Overlays/Changelog/ChangelogHeader.cs b/osu.Game/Overlays/Changelog/ChangelogHeader.cs
index 4165a180da..8663ec586b 100644
--- a/osu.Game/Overlays/Changelog/ChangelogHeader.cs
+++ b/osu.Game/Overlays/Changelog/ChangelogHeader.cs
@@ -14,7 +14,7 @@ namespace osu.Game.Overlays.Changelog
{
public class ChangelogHeader : BreadcrumbControlOverlayHeader
{
- public readonly Bindable Current = new Bindable();
+ public readonly Bindable Build = new Bindable();
public Action ListingSelected;
@@ -25,18 +25,18 @@ namespace osu.Game.Overlays.Changelog
public ChangelogHeader()
{
TabControl.AddItem(listing_string);
- TabControl.Current.ValueChanged += e =>
+ Current.ValueChanged += e =>
{
if (e.NewValue == listing_string)
ListingSelected?.Invoke();
};
- Current.ValueChanged += showBuild;
+ Build.ValueChanged += showBuild;
Streams.Current.ValueChanged += e =>
{
- if (e.NewValue?.LatestBuild != null && !e.NewValue.Equals(Current.Value?.UpdateStream))
- Current.Value = e.NewValue.LatestBuild;
+ if (e.NewValue?.LatestBuild != null && !e.NewValue.Equals(Build.Value?.UpdateStream))
+ Build.Value = e.NewValue.LatestBuild;
};
}
@@ -50,7 +50,7 @@ namespace osu.Game.Overlays.Changelog
if (e.NewValue != null)
{
TabControl.AddItem(e.NewValue.ToString());
- TabControl.Current.Value = e.NewValue.ToString();
+ Current.Value = e.NewValue.ToString();
updateCurrentStream();
@@ -58,7 +58,7 @@ namespace osu.Game.Overlays.Changelog
}
else
{
- TabControl.Current.Value = listing_string;
+ Current.Value = listing_string;
Streams.Current.Value = null;
title.Version = null;
}
@@ -86,10 +86,10 @@ namespace osu.Game.Overlays.Changelog
private void updateCurrentStream()
{
- if (Current.Value == null)
+ if (Build.Value == null)
return;
- Streams.Current.Value = Streams.Items.FirstOrDefault(s => s.Name == Current.Value.UpdateStream.Name);
+ Streams.Current.Value = Streams.Items.FirstOrDefault(s => s.Name == Build.Value.UpdateStream.Name);
}
private class ChangelogHeaderTitle : ScreenTitle
diff --git a/osu.Game/Overlays/ChangelogOverlay.cs b/osu.Game/Overlays/ChangelogOverlay.cs
index 90ba206077..6a8cb29d3e 100644
--- a/osu.Game/Overlays/ChangelogOverlay.cs
+++ b/osu.Game/Overlays/ChangelogOverlay.cs
@@ -78,7 +78,7 @@ namespace osu.Game.Overlays
sampleBack = audio.Samples.Get(@"UI/generic-select-soft");
- Header.Current.BindTo(Current);
+ Header.Build.BindTo(Current);
Current.BindValueChanged(e =>
{
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 6afe398172..466c953151 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -30,6 +30,8 @@ namespace osu.Game.Overlays.Mods
{
public class ModSelectOverlay : WaveOverlayContainer
{
+ public const float HEIGHT = 510;
+
protected readonly TriangleButton DeselectAllButton;
protected readonly TriangleButton CustomiseButton;
protected readonly TriangleButton CloseButton;
@@ -66,7 +68,8 @@ namespace osu.Game.Overlays.Mods
Waves.ThirdWaveColour = OsuColour.FromHex(@"005774");
Waves.FourthWaveColour = OsuColour.FromHex(@"003a4e");
- Height = 510;
+ RelativeSizeAxes = Axes.Both;
+
Padding = new MarginPadding { Horizontal = -OsuScreen.HORIZONTAL_OVERFLOW_PADDING };
Children = new Drawable[]
@@ -85,8 +88,7 @@ namespace osu.Game.Overlays.Mods
new Triangles
{
TriangleScale = 5,
- RelativeSizeAxes = Axes.X,
- Height = Height, //set the height from the start to ensure correct triangle density.
+ RelativeSizeAxes = Axes.Both,
ColourLight = new Color4(53, 66, 82, 255),
ColourDark = new Color4(41, 54, 70, 255),
},
diff --git a/osu.Game/Overlays/News/NewsHeader.cs b/osu.Game/Overlays/News/NewsHeader.cs
index b525ba7a82..b55e3ffba0 100644
--- a/osu.Game/Overlays/News/NewsHeader.cs
+++ b/osu.Game/Overlays/News/NewsHeader.cs
@@ -14,7 +14,7 @@ namespace osu.Game.Overlays.News
private NewsHeaderTitle title;
- public readonly Bindable Current = new Bindable(null);
+ public readonly Bindable Post = new Bindable(null);
public Action ShowFrontPage;
@@ -22,13 +22,13 @@ namespace osu.Game.Overlays.News
{
TabControl.AddItem(front_page_string);
- TabControl.Current.ValueChanged += e =>
+ Current.ValueChanged += e =>
{
if (e.NewValue == front_page_string)
ShowFrontPage?.Invoke();
};
- Current.ValueChanged += showPost;
+ Post.ValueChanged += showPost;
}
private void showPost(ValueChangedEvent e)
@@ -39,13 +39,13 @@ namespace osu.Game.Overlays.News
if (e.NewValue != null)
{
TabControl.AddItem(e.NewValue);
- TabControl.Current.Value = e.NewValue;
+ Current.Value = e.NewValue;
title.IsReadingPost = true;
}
else
{
- TabControl.Current.Value = front_page_string;
+ Current.Value = front_page_string;
title.IsReadingPost = false;
}
}
diff --git a/osu.Game/Overlays/NewsOverlay.cs b/osu.Game/Overlays/NewsOverlay.cs
index 6dde300556..71c205ff63 100644
--- a/osu.Game/Overlays/NewsOverlay.cs
+++ b/osu.Game/Overlays/NewsOverlay.cs
@@ -60,7 +60,7 @@ namespace osu.Game.Overlays
},
};
- header.Current.BindTo(Current);
+ header.Post.BindTo(Current);
Current.TriggerChange();
}
diff --git a/osu.Game/Overlays/OverlayHeader.cs b/osu.Game/Overlays/OverlayHeader.cs
index 5596f71dd0..bedf8e5435 100644
--- a/osu.Game/Overlays/OverlayHeader.cs
+++ b/osu.Game/Overlays/OverlayHeader.cs
@@ -50,14 +50,29 @@ namespace osu.Game.Overlays
RelativeSizeAxes = Axes.Both,
Colour = Color4.Gray,
},
- title = CreateTitle().With(title =>
+ new Container
{
- title.Margin = new MarginPadding
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Padding = new MarginPadding
{
+ Horizontal = UserProfileOverlay.CONTENT_X_MARGIN,
Vertical = 10,
- Left = UserProfileOverlay.CONTENT_X_MARGIN
- };
- })
+ },
+ Children = new[]
+ {
+ title = CreateTitle().With(title =>
+ {
+ title.Anchor = Anchor.CentreLeft;
+ title.Origin = Anchor.CentreLeft;
+ }),
+ CreateTitleContent().With(content =>
+ {
+ content.Anchor = Anchor.CentreRight;
+ content.Origin = Anchor.CentreRight;
+ })
+ }
+ }
}
},
}
@@ -75,10 +90,16 @@ namespace osu.Game.Overlays
}
[NotNull]
- protected virtual Drawable CreateContent() => Drawable.Empty();
+ protected virtual Drawable CreateContent() => Empty();
[NotNull]
- protected virtual Drawable CreateBackground() => Drawable.Empty();
+ protected virtual Drawable CreateBackground() => Empty();
+
+ ///
+ /// Creates a on the opposite side of the . Used mostly to create .
+ ///
+ [NotNull]
+ protected virtual Drawable CreateTitleContent() => Empty();
protected abstract ScreenTitle CreateTitle();
}
diff --git a/osu.Game/Overlays/OverlayRulesetTabItem.cs b/osu.Game/Overlays/OverlayRulesetTabItem.cs
index f8a9d14f62..9b4dd5ba1e 100644
--- a/osu.Game/Overlays/OverlayRulesetTabItem.cs
+++ b/osu.Game/Overlays/OverlayRulesetTabItem.cs
@@ -61,12 +61,14 @@ namespace osu.Game.Overlays
Enabled.Value = true;
}
- [BackgroundDependencyLoader]
- private void load()
+ protected override void LoadComplete()
{
- updateState();
+ base.LoadComplete();
+ Enabled.BindValueChanged(_ => updateState(), true);
}
+ public override bool PropagatePositionalInputSubTree => Enabled.Value && !Active.Value && base.PropagatePositionalInputSubTree;
+
protected override bool OnHover(HoverEvent e)
{
base.OnHover(e);
@@ -87,7 +89,9 @@ namespace osu.Game.Overlays
private void updateState()
{
text.Font = text.Font.With(weight: Active.Value ? FontWeight.Bold : FontWeight.Medium);
- AccentColour = IsHovered || Active.Value ? Color4.White : colourProvider.Highlight1;
+ AccentColour = Enabled.Value ? getActiveColour() : colourProvider.Foreground1;
}
+
+ private Color4 getActiveColour() => IsHovered || Active.Value ? Color4.White : colourProvider.Highlight1;
}
}
diff --git a/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
index 19a24dd576..6ed4fc3187 100644
--- a/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/TopHeaderContainer.cs
@@ -1,7 +1,6 @@
// Copyright (c) ppy Pty Ltd . 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.Bindables;
using osu.Framework.Graphics;
@@ -178,7 +177,7 @@ namespace osu.Game.Overlays.Profile.Header
if (user?.Statistics != null)
{
userStats.Add(new UserStatsLine("Ranked Score", user.Statistics.RankedScore.ToString("#,##0")));
- userStats.Add(new UserStatsLine("Hit Accuracy", Math.Round(user.Statistics.Accuracy, 2).ToString("#0.00'%'")));
+ userStats.Add(new UserStatsLine("Hit Accuracy", user.Statistics.DisplayAccuracy));
userStats.Add(new UserStatsLine("Play Count", user.Statistics.PlayCount.ToString("#,##0")));
userStats.Add(new UserStatsLine("Total Score", user.Statistics.TotalScore.ToString("#,##0")));
userStats.Add(new UserStatsLine("Total Hits", user.Statistics.TotalHits.ToString("#,##0")));
diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs
index c9f787bb26..0eee34a304 100644
--- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs
+++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableProfileScore.cs
@@ -182,7 +182,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
protected OsuSpriteText CreateDrawableAccuracy() => new OsuSpriteText
{
- Text = $"{Score.Accuracy:0.00%}",
+ Text = Score.DisplayAccuracy,
Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold, italics: true),
Colour = colours.Yellow,
};
diff --git a/osu.Game/Overlays/Rankings/CountryFilter.cs b/osu.Game/Overlays/Rankings/CountryFilter.cs
index 2b12457ccc..4bdefb06ef 100644
--- a/osu.Game/Overlays/Rankings/CountryFilter.cs
+++ b/osu.Game/Overlays/Rankings/CountryFilter.cs
@@ -76,9 +76,9 @@ namespace osu.Game.Overlays.Rankings
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- background.Colour = colours.GreySeafoam;
+ background.Colour = colourProvider.Dark3;
}
protected override void LoadComplete()
diff --git a/osu.Game/Overlays/Rankings/CountryPill.cs b/osu.Game/Overlays/Rankings/CountryPill.cs
index 410d316006..1b19bbd95e 100644
--- a/osu.Game/Overlays/Rankings/CountryPill.cs
+++ b/osu.Game/Overlays/Rankings/CountryPill.cs
@@ -100,9 +100,9 @@ namespace osu.Game.Overlays.Rankings
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- background.Colour = colours.GreySeafoamDarker;
+ background.Colour = colourProvider.Background5;
}
protected override void LoadComplete()
@@ -154,9 +154,9 @@ namespace osu.Game.Overlays.Rankings
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- IdleColour = colours.GreySeafoamLighter;
+ IdleColour = colourProvider.Light2;
HoverColour = Color4.White;
}
}
diff --git a/osu.Game/Overlays/Rankings/DismissableFlag.cs b/osu.Game/Overlays/Rankings/DismissableFlag.cs
deleted file mode 100644
index 7a55b0bba6..0000000000
--- a/osu.Game/Overlays/Rankings/DismissableFlag.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Sprites;
-using osu.Game.Users.Drawables;
-using osuTK.Graphics;
-using osuTK;
-using osu.Framework.Input.Events;
-using System;
-
-namespace osu.Game.Overlays.Rankings
-{
- public class DismissableFlag : UpdateableFlag
- {
- private const int duration = 200;
-
- public Action Action;
-
- private readonly SpriteIcon hoverIcon;
-
- public DismissableFlag()
- {
- AddInternal(hoverIcon = new SpriteIcon
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- Depth = -1,
- Alpha = 0,
- Size = new Vector2(10),
- Icon = FontAwesome.Solid.Times,
- });
- }
-
- protected override bool OnHover(HoverEvent e)
- {
- hoverIcon.FadeIn(duration, Easing.OutQuint);
- this.FadeColour(Color4.Gray, duration, Easing.OutQuint);
- return base.OnHover(e);
- }
-
- protected override void OnHoverLost(HoverLostEvent e)
- {
- base.OnHoverLost(e);
- hoverIcon.FadeOut(duration, Easing.OutQuint);
- this.FadeColour(Color4.White, duration, Easing.OutQuint);
- }
-
- protected override bool OnClick(ClickEvent e)
- {
- Action?.Invoke();
- return true;
- }
- }
-}
diff --git a/osu.Game/Overlays/Rankings/HeaderTitle.cs b/osu.Game/Overlays/Rankings/HeaderTitle.cs
deleted file mode 100644
index b08a2a3900..0000000000
--- a/osu.Game/Overlays/Rankings/HeaderTitle.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Bindables;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Sprites;
-using osu.Game.Users;
-using osu.Framework.Graphics;
-using osuTK;
-using osu.Game.Graphics;
-using osu.Framework.Allocation;
-using osu.Game.Graphics.Sprites;
-
-namespace osu.Game.Overlays.Rankings
-{
- public class HeaderTitle : CompositeDrawable
- {
- private const int spacing = 10;
- private const int flag_margin = 5;
- private const int text_size = 40;
-
- public readonly Bindable Scope = new Bindable();
- public readonly Bindable Country = new Bindable();
-
- private readonly SpriteText scopeText;
- private readonly DismissableFlag flag;
-
- public HeaderTitle()
- {
- AutoSizeAxes = Axes.Both;
- InternalChild = new FillFlowContainer
- {
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(spacing, 0),
- Children = new Drawable[]
- {
- flag = new DismissableFlag
- {
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Margin = new MarginPadding { Bottom = flag_margin },
- Size = new Vector2(30, 20),
- },
- scopeText = new OsuSpriteText
- {
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Font = OsuFont.GetFont(size: text_size, weight: FontWeight.Light)
- },
- new OsuSpriteText
- {
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Font = OsuFont.GetFont(size: text_size, weight: FontWeight.Light),
- Text = @"Ranking"
- }
- }
- };
-
- flag.Action += () => Country.Value = null;
- }
-
- [BackgroundDependencyLoader]
- private void load(OsuColour colours)
- {
- scopeText.Colour = colours.Lime;
- }
-
- protected override void LoadComplete()
- {
- Scope.BindValueChanged(onScopeChanged, true);
- Country.BindValueChanged(onCountryChanged, true);
- base.LoadComplete();
- }
-
- private void onScopeChanged(ValueChangedEvent scope) => scopeText.Text = scope.NewValue.ToString();
-
- private void onCountryChanged(ValueChangedEvent country)
- {
- if (country.NewValue == null)
- {
- flag.Hide();
- return;
- }
-
- flag.Country = country.NewValue;
- flag.Show();
- }
- }
-}
diff --git a/osu.Game/Overlays/Rankings/RankingsHeader.cs b/osu.Game/Overlays/Rankings/RankingsHeader.cs
deleted file mode 100644
index 6aa3e75df9..0000000000
--- a/osu.Game/Overlays/Rankings/RankingsHeader.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics;
-using osu.Framework.Allocation;
-using osu.Framework.Bindables;
-using osu.Game.Rulesets;
-using osu.Game.Users;
-using osu.Framework.Graphics.Sprites;
-using osu.Framework.Graphics.Textures;
-using osuTK;
-using osu.Game.Graphics.UserInterface;
-using System.Collections.Generic;
-
-namespace osu.Game.Overlays.Rankings
-{
- public class RankingsHeader : CompositeDrawable
- {
- private const int content_height = 250;
-
- public IEnumerable Spotlights
- {
- get => dropdown.Items;
- set => dropdown.Items = value;
- }
-
- public readonly Bindable Scope = new Bindable();
- public readonly Bindable Ruleset = new Bindable();
- public readonly Bindable Country = new Bindable();
- public readonly Bindable Spotlight = new Bindable();
-
- private readonly OsuDropdown dropdown;
-
- public RankingsHeader()
- {
- RelativeSizeAxes = Axes.X;
- AutoSizeAxes = Axes.Y;
-
- AddInternal(new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Children = new Drawable[]
- {
- new RankingsRulesetSelector
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Current = Ruleset
- },
- new Container
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- RelativeSizeAxes = Axes.X,
- Height = content_height,
- Children = new Drawable[]
- {
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Masking = true,
- Child = new HeaderBackground(),
- },
- new FillFlowContainer
- {
- AutoSizeAxes = Axes.Y,
- RelativeSizeAxes = Axes.X,
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(0, 20),
- Children = new Drawable[]
- {
- new RankingsScopeSelector
- {
- Margin = new MarginPadding { Top = 10 },
- Current = Scope
- },
- new HeaderTitle
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Margin = new MarginPadding { Top = 10 },
- Scope = { BindTarget = Scope },
- Country = { BindTarget = Country },
- },
- dropdown = new OsuDropdown
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- RelativeSizeAxes = Axes.X,
- Width = 0.8f,
- Current = Spotlight,
- }
- }
- },
- }
- }
- }
- });
- }
-
- protected override void LoadComplete()
- {
- Scope.BindValueChanged(onScopeChanged, true);
- base.LoadComplete();
- }
-
- private void onScopeChanged(ValueChangedEvent scope) =>
- dropdown.FadeTo(scope.NewValue == RankingsScope.Spotlights ? 1 : 0, 200, Easing.OutQuint);
-
- private class HeaderBackground : Sprite
- {
- public HeaderBackground()
- {
- Anchor = Anchor.Centre;
- Origin = Anchor.Centre;
- RelativeSizeAxes = Axes.Both;
- FillMode = FillMode.Fill;
- }
-
- [BackgroundDependencyLoader]
- private void load(TextureStore textures)
- {
- Texture = textures.Get(@"Headers/rankings");
- }
- }
- }
-}
diff --git a/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs
new file mode 100644
index 0000000000..94afe4e5a5
--- /dev/null
+++ b/osu.Game/Overlays/Rankings/RankingsOverlayHeader.cs
@@ -0,0 +1,135 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Bindables;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Rulesets;
+using osu.Game.Users;
+using System.Collections.Generic;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Framework.Allocation;
+
+namespace osu.Game.Overlays.Rankings
+{
+ public class RankingsOverlayHeader : TabControlOverlayHeader
+ {
+ public readonly Bindable Ruleset = new Bindable();
+ public readonly Bindable Spotlight = new Bindable();
+ public readonly Bindable Country = new Bindable();
+
+ public IEnumerable Spotlights
+ {
+ get => spotlightsContainer.Spotlights;
+ set => spotlightsContainer.Spotlights = value;
+ }
+
+ protected override ScreenTitle CreateTitle() => new RankingsTitle
+ {
+ Scope = { BindTarget = Current }
+ };
+
+ protected override Drawable CreateTitleContent() => new OverlayRulesetSelector
+ {
+ Current = Ruleset
+ };
+
+ private SpotlightsContainer spotlightsContainer;
+
+ protected override Drawable CreateContent() => new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Children = new Drawable[]
+ {
+ new CountryFilter
+ {
+ Current = Country
+ },
+ spotlightsContainer = new SpotlightsContainer
+ {
+ Spotlight = { BindTarget = Spotlight }
+ }
+ }
+ };
+
+ protected override void LoadComplete()
+ {
+ Current.BindValueChanged(onCurrentChanged, true);
+ base.LoadComplete();
+ }
+
+ private void onCurrentChanged(ValueChangedEvent scope) =>
+ spotlightsContainer.FadeTo(scope.NewValue == RankingsScope.Spotlights ? 1 : 0, 200, Easing.OutQuint);
+
+ private class RankingsTitle : ScreenTitle
+ {
+ public readonly Bindable Scope = new Bindable();
+
+ public RankingsTitle()
+ {
+ Title = "ranking";
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ Scope.BindValueChanged(scope => Section = scope.NewValue.ToString().ToLowerInvariant(), true);
+ }
+
+ protected override Drawable CreateIcon() => new ScreenTitleTextureIcon(@"Icons/rankings");
+ }
+
+ private class SpotlightsContainer : CompositeDrawable
+ {
+ public readonly Bindable Spotlight = new Bindable();
+
+ public IEnumerable Spotlights
+ {
+ get => dropdown.Items;
+ set => dropdown.Items = value;
+ }
+
+ private readonly OsuDropdown dropdown;
+ private readonly Box background;
+
+ public SpotlightsContainer()
+ {
+ Height = 100;
+ RelativeSizeAxes = Axes.X;
+ InternalChildren = new Drawable[]
+ {
+ background = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ dropdown = new OsuDropdown
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ RelativeSizeAxes = Axes.X,
+ Width = 0.8f,
+ Current = Spotlight,
+ Y = 20,
+ }
+ };
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ background.Colour = colourProvider.Dark3;
+ }
+ }
+ }
+
+ public enum RankingsScope
+ {
+ Performance,
+ Spotlights,
+ Score,
+ Country
+ }
+}
diff --git a/osu.Game/Overlays/Rankings/RankingsRulesetSelector.cs b/osu.Game/Overlays/Rankings/RankingsRulesetSelector.cs
deleted file mode 100644
index 3d25e3995a..0000000000
--- a/osu.Game/Overlays/Rankings/RankingsRulesetSelector.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) ppy Pty Ltd . 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.UserInterface;
-using osu.Game.Graphics;
-using osu.Game.Graphics.UserInterface;
-using osu.Game.Rulesets;
-using osuTK;
-using System.Linq;
-
-namespace osu.Game.Overlays.Rankings
-{
- public class RankingsRulesetSelector : PageTabControl
- {
- protected override TabItem CreateTabItem(RulesetInfo value) => new RankingsTabItem(value);
-
- protected override Dropdown CreateDropdown() => null;
-
- public RankingsRulesetSelector()
- {
- AutoSizeAxes = Axes.X;
- }
-
- [BackgroundDependencyLoader]
- private void load(OsuColour colours, RulesetStore rulesets)
- {
- foreach (var r in rulesets.AvailableRulesets)
- AddItem(r);
-
- AccentColour = colours.Lime;
-
- SelectTab(TabContainer.FirstOrDefault());
- }
-
- protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer
- {
- AutoSizeAxes = Axes.X,
- RelativeSizeAxes = Axes.Y,
- Direction = FillDirection.Horizontal,
- Spacing = new Vector2(20, 0),
- };
-
- private class RankingsTabItem : PageTabItem
- {
- public RankingsTabItem(RulesetInfo value)
- : base(value)
- {
- }
-
- protected override string CreateText() => $"{Value.Name}";
- }
- }
-}
diff --git a/osu.Game/Overlays/Rankings/RankingsScopeSelector.cs b/osu.Game/Overlays/Rankings/RankingsScopeSelector.cs
deleted file mode 100644
index 2095bcc61c..0000000000
--- a/osu.Game/Overlays/Rankings/RankingsScopeSelector.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using osu.Game.Graphics.UserInterface;
-using osu.Framework.Allocation;
-using osuTK.Graphics;
-
-namespace osu.Game.Overlays.Rankings
-{
- public class RankingsScopeSelector : GradientLineTabControl
- {
- [BackgroundDependencyLoader]
- private void load()
- {
- AccentColour = LineColour = Color4.Black;
- }
- }
-
- public enum RankingsScope
- {
- Performance,
- Spotlights,
- Score,
- Country
- }
-}
diff --git a/osu.Game/Overlays/Rankings/SpotlightSelector.cs b/osu.Game/Overlays/Rankings/SpotlightSelector.cs
new file mode 100644
index 0000000000..e34c01113e
--- /dev/null
+++ b/osu.Game/Overlays/Rankings/SpotlightSelector.cs
@@ -0,0 +1,161 @@
+// Copyright (c) ppy Pty Ltd . 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.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
+using osu.Game.Graphics;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Online.API.Requests.Responses;
+using osuTK;
+using System;
+using System.Collections.Generic;
+using osu.Framework.Graphics.UserInterface;
+
+namespace osu.Game.Overlays.Rankings
+{
+ public class SpotlightSelector : CompositeDrawable, IHasCurrentValue
+ {
+ private readonly Box background;
+ private readonly SpotlightsDropdown dropdown;
+
+ private readonly BindableWithCurrent current = new BindableWithCurrent();
+
+ public Bindable Current
+ {
+ get => current.Current;
+ set => current.Current = value;
+ }
+
+ public IEnumerable Spotlights
+ {
+ get => dropdown.Items;
+ set => dropdown.Items = value;
+ }
+
+ private readonly InfoColumn startDateColumn;
+ private readonly InfoColumn endDateColumn;
+
+ public SpotlightSelector()
+ {
+ RelativeSizeAxes = Axes.X;
+ Height = 100;
+
+ InternalChildren = new Drawable[]
+ {
+ background = new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Padding = new MarginPadding { Horizontal = UserProfileOverlay.CONTENT_X_MARGIN, Vertical = 10 },
+ Children = new Drawable[]
+ {
+ dropdown = new SpotlightsDropdown
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ RelativeSizeAxes = Axes.X,
+ Current = Current,
+ Depth = -float.MaxValue
+ },
+ new FillFlowContainer
+ {
+ Anchor = Anchor.BottomRight,
+ Origin = Anchor.BottomRight,
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(15, 0),
+ Children = new Drawable[]
+ {
+ startDateColumn = new InfoColumn(@"Start Date"),
+ endDateColumn = new InfoColumn(@"End Date"),
+ }
+ }
+ }
+ },
+ };
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ background.Colour = colourProvider.Dark3;
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+
+ Current.BindValueChanged(onCurrentChanged);
+ }
+
+ private void onCurrentChanged(ValueChangedEvent spotlight)
+ {
+ startDateColumn.Value = dateToString(spotlight.NewValue.StartDate);
+ endDateColumn.Value = dateToString(spotlight.NewValue.EndDate);
+ }
+
+ private string dateToString(DateTimeOffset date) => date.ToString("yyyy-MM-dd");
+
+ private class InfoColumn : FillFlowContainer
+ {
+ public string Value
+ {
+ set => valueText.Text = value;
+ }
+
+ private readonly OsuSpriteText valueText;
+
+ public InfoColumn(string name)
+ {
+ AutoSizeAxes = Axes.Both;
+ Direction = FillDirection.Vertical;
+ Children = new Drawable[]
+ {
+ new OsuSpriteText
+ {
+ Text = name,
+ Font = OsuFont.GetFont(size: 10),
+ },
+ new Container
+ {
+ AutoSizeAxes = Axes.X,
+ Height = 20,
+ Child = valueText = new OsuSpriteText
+ {
+ Anchor = Anchor.BottomLeft,
+ Origin = Anchor.BottomLeft,
+ Font = OsuFont.GetFont(size: 18, weight: FontWeight.Light),
+ }
+ }
+ };
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ valueText.Colour = colourProvider.Content2;
+ }
+ }
+
+ private class SpotlightsDropdown : OsuDropdown
+ {
+ private DropdownMenu menu;
+
+ protected override DropdownMenu CreateMenu() => menu = base.CreateMenu().With(m => m.MaxHeight = 400);
+
+ [BackgroundDependencyLoader]
+ private void load(OverlayColourProvider colourProvider)
+ {
+ menu.BackgroundColour = colourProvider.Background5;
+ AccentColour = colourProvider.Background6;
+ }
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Rankings/Tables/RankingsTable.cs b/osu.Game/Overlays/Rankings/Tables/RankingsTable.cs
index f947c5585c..943897581e 100644
--- a/osu.Game/Overlays/Rankings/Tables/RankingsTable.cs
+++ b/osu.Game/Overlays/Rankings/Tables/RankingsTable.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Overlays.Rankings.Tables
{
public abstract class RankingsTable : TableContainer
{
- protected const int TEXT_SIZE = 14;
+ protected const int TEXT_SIZE = 12;
private const float horizontal_inset = 20;
private const float row_height = 25;
private const int items_per_page = 50;
@@ -60,7 +60,7 @@ namespace osu.Game.Overlays.Rankings.Tables
private static TableColumn[] mainHeaders => new[]
{
- new TableColumn(string.Empty, Anchor.Centre, new Dimension(GridSizeMode.Absolute, 50)), // place
+ new TableColumn(string.Empty, Anchor.Centre, new Dimension(GridSizeMode.Absolute, 40)), // place
new TableColumn(string.Empty, Anchor.CentreLeft, new Dimension(GridSizeMode.Distributed)), // flag and username (country name)
};
@@ -77,7 +77,7 @@ namespace osu.Game.Overlays.Rankings.Tables
private OsuSpriteText createIndexDrawable(int index) => new OsuSpriteText
{
Text = $"#{index + 1}",
- Font = OsuFont.GetFont(size: TEXT_SIZE, weight: FontWeight.Bold)
+ Font = OsuFont.GetFont(size: TEXT_SIZE, weight: FontWeight.SemiBold)
};
private FillFlowContainer createMainContent(TModel item) => new FillFlowContainer
@@ -112,10 +112,10 @@ namespace osu.Game.Overlays.Rankings.Tables
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
if (Text != highlighted)
- Colour = colours.GreySeafoamLighter;
+ Colour = colourProvider.Foreground1;
}
}
@@ -131,9 +131,9 @@ namespace osu.Game.Overlays.Rankings.Tables
protected class ColoredRowText : RowText
{
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- Colour = colours.GreySeafoamLighter;
+ Colour = colourProvider.Foreground1;
}
}
}
diff --git a/osu.Game/Overlays/Rankings/Tables/TableRowBackground.cs b/osu.Game/Overlays/Rankings/Tables/TableRowBackground.cs
index 04e1c22dae..fe87a8b3d4 100644
--- a/osu.Game/Overlays/Rankings/Tables/TableRowBackground.cs
+++ b/osu.Game/Overlays/Rankings/Tables/TableRowBackground.cs
@@ -6,7 +6,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Events;
-using osu.Game.Graphics;
using osuTK.Graphics;
namespace osu.Game.Overlays.Rankings.Tables
@@ -35,10 +34,10 @@ namespace osu.Game.Overlays.Rankings.Tables
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours)
+ private void load(OverlayColourProvider colourProvider)
{
- background.Colour = idleColour = colours.GreySeafoam;
- hoverColour = colours.GreySeafoamLight;
+ background.Colour = idleColour = colourProvider.Background4;
+ hoverColour = colourProvider.Background3;
}
protected override bool OnHover(HoverEvent e)
diff --git a/osu.Game/Overlays/Rankings/Tables/UserBasedTable.cs b/osu.Game/Overlays/Rankings/Tables/UserBasedTable.cs
index 019a278771..0e77d7d764 100644
--- a/osu.Game/Overlays/Rankings/Tables/UserBasedTable.cs
+++ b/osu.Game/Overlays/Rankings/Tables/UserBasedTable.cs
@@ -8,6 +8,7 @@ using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Users;
+using osu.Game.Scoring;
namespace osu.Game.Overlays.Rankings.Tables
{
@@ -40,13 +41,13 @@ namespace osu.Game.Overlays.Rankings.Tables
protected sealed override Drawable[] CreateAdditionalContent(UserStatistics item) => new[]
{
- new ColoredRowText { Text = $@"{item.Accuracy:F2}%", },
+ new ColoredRowText { Text = item.DisplayAccuracy, },
new ColoredRowText { Text = $@"{item.PlayCount:N0}", },
}.Concat(CreateUniqueContent(item)).Concat(new[]
{
- new ColoredRowText { Text = $@"{item.GradesCount.SS + item.GradesCount.SSPlus:N0}", },
- new ColoredRowText { Text = $@"{item.GradesCount.S + item.GradesCount.SPlus:N0}", },
- new ColoredRowText { Text = $@"{item.GradesCount.A:N0}", }
+ new ColoredRowText { Text = $@"{item.GradesCount[ScoreRank.XH] + item.GradesCount[ScoreRank.X]:N0}", },
+ new ColoredRowText { Text = $@"{item.GradesCount[ScoreRank.SH] + item.GradesCount[ScoreRank.S]:N0}", },
+ new ColoredRowText { Text = $@"{item.GradesCount[ScoreRank.A]:N0}", }
}).ToArray();
protected abstract TableColumn[] CreateUniqueHeaders();
diff --git a/osu.Game/Overlays/RankingsOverlay.cs b/osu.Game/Overlays/RankingsOverlay.cs
index 1ab18b8c15..84470d9caa 100644
--- a/osu.Game/Overlays/RankingsOverlay.cs
+++ b/osu.Game/Overlays/RankingsOverlay.cs
@@ -6,7 +6,6 @@ using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
-using osu.Game.Graphics;
using osu.Game.Overlays.Rankings;
using osu.Game.Users;
using osu.Game.Rulesets;
@@ -27,6 +26,7 @@ namespace osu.Game.Overlays
private readonly BasicScrollContainer scrollFlow;
private readonly Container tableContainer;
private readonly DimmedLoadingLayer loading;
+ private readonly Box background;
private APIRequest lastRequest;
private CancellationTokenSource cancellationToken;
@@ -39,10 +39,9 @@ namespace osu.Game.Overlays
{
Children = new Drawable[]
{
- new Box
+ background = new Box
{
- RelativeSizeAxes = Axes.Both,
- Colour = OsuColour.Gray(0.1f),
+ RelativeSizeAxes = Axes.Both
},
scrollFlow = new BasicScrollContainer
{
@@ -55,12 +54,13 @@ namespace osu.Game.Overlays
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- new RankingsHeader
+ new RankingsOverlayHeader
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
+ Depth = -float.MaxValue,
Country = { BindTarget = Country },
- Scope = { BindTarget = Scope },
+ Current = { BindTarget = Scope },
Ruleset = { BindTarget = ruleset }
},
new Container
@@ -86,6 +86,12 @@ namespace osu.Game.Overlays
};
}
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ background.Colour = ColourProvider.Background5;
+ }
+
protected override void LoadComplete()
{
Country.BindValueChanged(_ =>
diff --git a/osu.Game/Overlays/TabControlOverlayHeader.cs b/osu.Game/Overlays/TabControlOverlayHeader.cs
index b410739b25..b199a2a0cf 100644
--- a/osu.Game/Overlays/TabControlOverlayHeader.cs
+++ b/osu.Game/Overlays/TabControlOverlayHeader.cs
@@ -3,6 +3,7 @@
using JetBrains.Annotations;
using osu.Framework.Allocation;
+using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
@@ -17,10 +18,18 @@ namespace osu.Game.Overlays
/// An overlay header which contains a .
///
/// The type of item to be represented by tabs.
- public abstract class TabControlOverlayHeader : OverlayHeader
+ public abstract class TabControlOverlayHeader : OverlayHeader, IHasCurrentValue
{
protected OsuTabControl TabControl;
+ private readonly BindableWithCurrent current = new BindableWithCurrent();
+
+ public Bindable Current
+ {
+ get => current.Current;
+ set => current.Current = value;
+ }
+
private readonly Box controlBackground;
protected TabControlOverlayHeader()
@@ -35,7 +44,11 @@ namespace osu.Game.Overlays
{
RelativeSizeAxes = Axes.Both,
},
- TabControl = CreateTabControl().With(control => control.Margin = new MarginPadding { Left = UserProfileOverlay.CONTENT_X_MARGIN })
+ TabControl = CreateTabControl().With(control =>
+ {
+ control.Margin = new MarginPadding { Left = UserProfileOverlay.CONTENT_X_MARGIN };
+ control.Current = Current;
+ })
}
});
}
diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs
index c37bab9086..bed9104cad 100644
--- a/osu.Game/Scoring/ScoreInfo.cs
+++ b/osu.Game/Scoring/ScoreInfo.cs
@@ -13,6 +13,7 @@ using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring;
using osu.Game.Users;
+using osu.Game.Utils;
namespace osu.Game.Scoring
{
@@ -31,6 +32,9 @@ namespace osu.Game.Scoring
[Column(TypeName = "DECIMAL(1,4)")]
public double Accuracy { get; set; }
+ [JsonIgnore]
+ public string DisplayAccuracy => Accuracy.FormatAccuracy();
+
[JsonProperty(@"pp")]
public double? PP { get; set; }
diff --git a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
index bab9672d65..73a40d9579 100644
--- a/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
+++ b/osu.Game/Screens/Multi/Match/Components/MatchLeaderboardScore.cs
@@ -28,7 +28,7 @@ namespace osu.Game.Screens.Multi.Match.Components
protected override IEnumerable GetStatistics(ScoreInfo model) => new[]
{
- new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", string.Format(model.Accuracy % 1 == 0 ? @"{0:0%}" : @"{0:0.00%}", model.Accuracy)),
+ new LeaderboardScoreStatistic(FontAwesome.Solid.Crosshairs, "Accuracy", model.DisplayAccuracy),
new LeaderboardScoreStatistic(FontAwesome.Solid.Sync, "Total Attempts", score.TotalAttempts.ToString()),
new LeaderboardScoreStatistic(FontAwesome.Solid.Check, "Completed Beatmaps", score.CompletedBeatmaps.ToString()),
};
diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs
index 86d52ff791..9d6a459d14 100644
--- a/osu.Game/Screens/Multi/Multiplayer.cs
+++ b/osu.Game/Screens/Multi/Multiplayer.cs
@@ -96,7 +96,7 @@ namespace osu.Game.Screens.Multi
{
RelativeSizeAxes = Axes.Both,
Padding = new MarginPadding { Top = Header.HEIGHT },
- Child = screenStack = new OsuScreenStack(loungeSubScreen = new LoungeSubScreen()) { RelativeSizeAxes = Axes.Both }
+ Child = screenStack = new OsuScreenStack { RelativeSizeAxes = Axes.Both }
},
new Header(screenStack),
createButton = new HeaderButton
@@ -120,6 +120,8 @@ namespace osu.Game.Screens.Multi
}
};
+ screenStack.Push(loungeSubScreen = new LoungeSubScreen());
+
screenStack.ScreenPushed += screenPushed;
screenStack.ScreenExited += screenExited;
}
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 6394fb8d23..61e94ae969 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Internal;
using osu.Framework.Allocation;
@@ -95,15 +96,30 @@ namespace osu.Game.Screens
public Bindable> Mods { get; private set; }
+ private OsuScreenDependencies screenDependencies;
+
+ internal void CreateLeasedDependencies(IReadOnlyDependencyContainer dependencies) => createDependencies(dependencies);
+
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
- var screenDependencies = new OsuScreenDependencies(DisallowExternalBeatmapRulesetChanges, parent);
+ if (screenDependencies == null)
+ {
+ if (DisallowExternalBeatmapRulesetChanges)
+ throw new InvalidOperationException($"Screens that specify {nameof(DisallowExternalBeatmapRulesetChanges)} must be pushed immediately.");
+
+ createDependencies(parent);
+ }
+
+ return base.CreateChildDependencies(screenDependencies);
+ }
+
+ private void createDependencies(IReadOnlyDependencyContainer dependencies)
+ {
+ screenDependencies = new OsuScreenDependencies(DisallowExternalBeatmapRulesetChanges, dependencies);
Beatmap = screenDependencies.Beatmap;
Ruleset = screenDependencies.Ruleset;
Mods = screenDependencies.Mods;
-
- return base.CreateChildDependencies(screenDependencies);
}
protected BackgroundScreen Background => backgroundStack?.CurrentScreen as BackgroundScreen;
diff --git a/osu.Game/Screens/OsuScreenStack.cs b/osu.Game/Screens/OsuScreenStack.cs
index 0844e32d46..a05933ef0e 100644
--- a/osu.Game/Screens/OsuScreenStack.cs
+++ b/osu.Game/Screens/OsuScreenStack.cs
@@ -13,22 +13,11 @@ namespace osu.Game.Screens
[Cached]
private BackgroundScreenStack backgroundScreenStack;
- private ParallaxContainer parallaxContainer;
+ private readonly ParallaxContainer parallaxContainer;
protected float ParallaxAmount => parallaxContainer.ParallaxAmount;
public OsuScreenStack()
- {
- initializeStack();
- }
-
- public OsuScreenStack(IScreen baseScreen)
- : base(baseScreen)
- {
- initializeStack();
- }
-
- private void initializeStack()
{
InternalChild = parallaxContainer = new ParallaxContainer
{
@@ -36,13 +25,32 @@ namespace osu.Game.Screens
Child = backgroundScreenStack = new BackgroundScreenStack { RelativeSizeAxes = Axes.Both },
};
- ScreenPushed += onScreenChange;
- ScreenExited += onScreenChange;
+ ScreenPushed += screenPushed;
+ ScreenExited += screenExited;
}
- private void onScreenChange(IScreen prev, IScreen next)
+ private void screenPushed(IScreen prev, IScreen next)
{
- parallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * ((IOsuScreen)next)?.BackgroundParallaxAmount ?? 1.0f;
+ if (LoadState < LoadState.Ready)
+ {
+ // dependencies must be present to stay in a sane state.
+ // this is generally only ever hit by test scenes.
+ Schedule(() => screenPushed(prev, next));
+ return;
+ }
+
+ // create dependencies synchronously to ensure leases are in a sane state.
+ ((OsuScreen)next).CreateLeasedDependencies((prev as OsuScreen)?.Dependencies ?? Dependencies);
+
+ setParallax(next);
}
+
+ private void screenExited(IScreen prev, IScreen next)
+ {
+ setParallax(next);
+ }
+
+ private void setParallax(IScreen next) =>
+ parallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * ((IOsuScreen)next)?.BackgroundParallaxAmount ?? 1.0f;
}
}
diff --git a/osu.Game/Screens/Play/KeyCounterDisplay.cs b/osu.Game/Screens/Play/KeyCounterDisplay.cs
index 9c107f0293..2ed4afafd3 100644
--- a/osu.Game/Screens/Play/KeyCounterDisplay.cs
+++ b/osu.Game/Screens/Play/KeyCounterDisplay.cs
@@ -14,18 +14,32 @@ using osuTK.Graphics;
namespace osu.Game.Screens.Play
{
- public class KeyCounterDisplay : FillFlowContainer
+ public class KeyCounterDisplay : Container
{
private const int duration = 100;
private const double key_fade_time = 80;
- public readonly Bindable Visible = new Bindable(true);
private readonly Bindable configVisibility = new Bindable();
+ protected readonly FillFlowContainer KeyFlow;
+
+ protected override Container Content => KeyFlow;
+
+ ///
+ /// Whether the key counter should be visible regardless of the configuration value.
+ /// This is true by default, but can be changed.
+ ///
+ public readonly Bindable AlwaysVisible = new Bindable(true);
+
public KeyCounterDisplay()
{
- Direction = FillDirection.Horizontal;
AutoSizeAxes = Axes.Both;
+
+ InternalChild = KeyFlow = new FillFlowContainer
+ {
+ Direction = FillDirection.Horizontal,
+ AutoSizeAxes = Axes.Both,
+ };
}
public override void Add(KeyCounter key)
@@ -49,7 +63,7 @@ namespace osu.Game.Screens.Play
{
base.LoadComplete();
- Visible.BindValueChanged(_ => updateVisibility());
+ AlwaysVisible.BindValueChanged(_ => updateVisibility());
configVisibility.BindValueChanged(_ => updateVisibility(), true);
}
@@ -100,7 +114,9 @@ namespace osu.Game.Screens.Play
}
}
- private void updateVisibility() => this.FadeTo(Visible.Value || configVisibility.Value ? 1 : 0, duration);
+ private void updateVisibility() =>
+ // Isolate changing visibility of the key counters from fading this component.
+ KeyFlow.FadeTo(AlwaysVisible.Value || configVisibility.Value ? 1 : 0, duration);
public override bool HandleNonPositionalInput => receptor == null;
public override bool HandlePositionalInput => receptor == null;
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 7228e22382..aecd35f7dc 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -219,7 +219,7 @@ namespace osu.Game.Screens.Play
IsPaused = { BindTarget = GameplayClockContainer.IsPaused }
},
PlayerSettingsOverlay = { PlaybackSettings = { UserPlaybackRate = { BindTarget = GameplayClockContainer.UserPlaybackRate } } },
- KeyCounter = { Visible = { BindTarget = DrawableRuleset.HasReplayLoaded } },
+ KeyCounter = { AlwaysVisible = { BindTarget = DrawableRuleset.HasReplayLoaded } },
RequestSeek = GameplayClockContainer.Seek,
Anchor = Anchor.Centre,
Origin = Anchor.Centre
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index d063988b3f..05f1872be9 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -211,7 +211,7 @@ namespace osu.Game.Screens.Ranking
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.BottomCentre,
- Text = $"{Score.Accuracy:P2}",
+ Text = Score.DisplayAccuracy,
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 40),
RelativePositionAxes = Axes.X,
X = 0.9f,
diff --git a/osu.Game/Screens/Select/LocalScoreDeleteDialog.cs b/osu.Game/Screens/Select/LocalScoreDeleteDialog.cs
index 99e76124e8..085ea372c0 100644
--- a/osu.Game/Screens/Select/LocalScoreDeleteDialog.cs
+++ b/osu.Game/Screens/Select/LocalScoreDeleteDialog.cs
@@ -32,8 +32,7 @@ namespace osu.Game.Screens.Select
BeatmapInfo beatmap = beatmapManager.QueryBeatmap(b => b.ID == score.BeatmapInfoID);
Debug.Assert(beatmap != null);
- string accuracy = string.Format(score.Accuracy == 1 ? "{0:0%}" : "{0:0.00%}", score.Accuracy);
- BodyText = $"{score.User} ({accuracy}, {score.Rank})";
+ BodyText = $"{score.User} ({score.DisplayAccuracy}, {score.Rank})";
Icon = FontAwesome.Regular.TrashAlt;
HeaderText = "Confirm deletion of local score";
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 18f13c5e1d..f1dd125362 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -68,10 +68,7 @@ namespace osu.Game.Screens.Select
SampleConfirm?.Play();
- LoadComponentAsync(player = new PlayerLoader(() => new Player()), l =>
- {
- if (this.IsCurrentScreen()) this.Push(player);
- });
+ this.Push(player = new PlayerLoader(() => new Player()));
return true;
}
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index b3e24c87df..5037081b5e 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -224,23 +224,37 @@ namespace osu.Game.Screens.Select
if (ShowFooter)
{
- AddRangeInternal(new[]
+ AddRangeInternal(new Drawable[]
{
- FooterPanels = new Container
+ new GridContainer // used for max height implementation
{
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Margin = new MarginPadding { Bottom = Footer.HEIGHT },
- Children = new Drawable[]
+ RelativeSizeAxes = Axes.Both,
+ RowDimensions = new[]
{
- BeatmapOptions = new BeatmapOptionsOverlay(),
- ModSelect = new ModSelectOverlay
+ new Dimension(),
+ new Dimension(GridSizeMode.Relative, 1f, maxSize: ModSelectOverlay.HEIGHT + Footer.HEIGHT),
+ },
+ Content = new[]
+ {
+ null,
+ new Drawable[]
{
- RelativeSizeAxes = Axes.X,
- Origin = Anchor.BottomCentre,
- Anchor = Anchor.BottomCentre,
+ FooterPanels = new Container
+ {
+ Anchor = Anchor.BottomLeft,
+ Origin = Anchor.BottomLeft,
+ RelativeSizeAxes = Axes.Both,
+ Padding = new MarginPadding { Bottom = Footer.HEIGHT },
+ Children = new Drawable[]
+ {
+ BeatmapOptions = new BeatmapOptionsOverlay(),
+ ModSelect = new ModSelectOverlay
+ {
+ Origin = Anchor.BottomCentre,
+ Anchor = Anchor.BottomCentre,
+ }
+ }
+ }
}
}
},
diff --git a/osu.Game/Users/UserStatistics.cs b/osu.Game/Users/UserStatistics.cs
index 24f1f0b30e..8b7699d0ad 100644
--- a/osu.Game/Users/UserStatistics.cs
+++ b/osu.Game/Users/UserStatistics.cs
@@ -4,6 +4,7 @@
using System;
using Newtonsoft.Json;
using osu.Game.Scoring;
+using osu.Game.Utils;
using static osu.Game.Users.User;
namespace osu.Game.Users
@@ -29,7 +30,7 @@ namespace osu.Game.Users
public decimal? PP;
[JsonProperty(@"pp_rank")] // the API sometimes only returns this value in condensed user responses
- private int rank
+ private int? rank
{
set => Ranks.Global = value;
}
@@ -43,6 +44,9 @@ namespace osu.Game.Users
[JsonProperty(@"hit_accuracy")]
public decimal Accuracy;
+ [JsonIgnore]
+ public string DisplayAccuracy => Accuracy.FormatAccuracy();
+
[JsonProperty(@"play_count")]
public int PlayCount;
@@ -67,13 +71,13 @@ namespace osu.Game.Users
public struct Grades
{
[JsonProperty(@"ssh")]
- public int SSPlus;
+ public int? SSPlus;
[JsonProperty(@"ss")]
public int SS;
[JsonProperty(@"sh")]
- public int SPlus;
+ public int? SPlus;
[JsonProperty(@"s")]
public int S;
@@ -88,13 +92,13 @@ namespace osu.Game.Users
switch (rank)
{
case ScoreRank.XH:
- return SSPlus;
+ return SSPlus ?? 0;
case ScoreRank.X:
return SS;
case ScoreRank.SH:
- return SPlus;
+ return SPlus ?? 0;
case ScoreRank.S:
return S;
diff --git a/osu.Game/Utils/FormatUtils.cs b/osu.Game/Utils/FormatUtils.cs
new file mode 100644
index 0000000000..b3758b3375
--- /dev/null
+++ b/osu.Game/Utils/FormatUtils.cs
@@ -0,0 +1,24 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+namespace osu.Game.Utils
+{
+ public static class FormatUtils
+ {
+ ///
+ /// Turns the provided accuracy into a percentage with 2 decimal places.
+ /// Omits all decimal places when equals 1d.
+ ///
+ /// The accuracy to be formatted
+ /// formatted accuracy in percentage
+ public static string FormatAccuracy(this double accuracy) => accuracy == 1 ? "100%" : $"{accuracy:0.00%}";
+
+ ///
+ /// Turns the provided accuracy into a percentage with 2 decimal places.
+ /// Omits all decimal places when equals 100m.
+ ///
+ /// The accuracy to be formatted
+ /// formatted accuracy in percentage
+ public static string FormatAccuracy(this decimal accuracy) => accuracy == 100 ? "100%" : $"{accuracy:0.00}%";
+ }
+}