diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 47a7c2ae11..618049e72c 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -573,7 +573,9 @@ namespace osu.Game
Origin = Anchor.BottomLeft,
Action = () =>
{
- if ((ScreenStack.CurrentScreen as IOsuScreen)?.AllowBackButton == true)
+ var currentScreen = ScreenStack.CurrentScreen as IOsuScreen;
+
+ if (currentScreen?.AllowBackButton == true && !currentScreen.OnBackButton())
ScreenStack.Exit();
}
},
diff --git a/osu.Game/Screens/IOsuScreen.cs b/osu.Game/Screens/IOsuScreen.cs
index 22fe0ad816..761f842c22 100644
--- a/osu.Game/Screens/IOsuScreen.cs
+++ b/osu.Game/Screens/IOsuScreen.cs
@@ -56,5 +56,14 @@ namespace osu.Game.Screens
/// Whether mod rate adjustments are allowed to be applied.
///
bool AllowRateAdjustments { get; }
+
+ ///
+ /// Invoked when the back button has been pressed to close any overlays before exiting this .
+ ///
+ ///
+ /// Return true to block this from being exited after closing an overlay.
+ /// Return false if this should continue exiting.
+ ///
+ bool OnBackButton();
}
}
diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs
index 3178e35581..269eab5772 100644
--- a/osu.Game/Screens/Multi/Multiplayer.cs
+++ b/osu.Game/Screens/Multi/Multiplayer.cs
@@ -250,12 +250,6 @@ namespace osu.Game.Screens.Multi
{
roomManager.PartRoom();
- if (screenStack.CurrentScreen != null && !(screenStack.CurrentScreen is LoungeSubScreen))
- {
- screenStack.Exit();
- return true;
- }
-
waves.Hide();
this.Delay(WaveContainer.DISAPPEAR_DURATION).FadeOut();
@@ -269,6 +263,20 @@ namespace osu.Game.Screens.Multi
return false;
}
+ public override bool OnBackButton()
+ {
+ if ((screenStack.CurrentScreen as IMultiplayerSubScreen)?.OnBackButton() == true)
+ return true;
+
+ if (screenStack.CurrentScreen != null && !(screenStack.CurrentScreen is LoungeSubScreen))
+ {
+ screenStack.Exit();
+ return true;
+ }
+
+ return false;
+ }
+
protected override void LogoExiting(OsuLogo logo)
{
base.LogoExiting(logo);
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 35bb4fa34f..872a1cd39a 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -258,5 +258,7 @@ namespace osu.Game.Screens
/// Note that the instance created may not be the used instance if it matches the BackgroundMode equality clause.
///
protected virtual BackgroundScreen CreateBackground() => null;
+
+ public virtual bool OnBackButton() => false;
}
}
diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs
index 49ce07b708..44458d8c8e 100644
--- a/osu.Game/Screens/Ranking/ResultsScreen.cs
+++ b/osu.Game/Screens/Ranking/ResultsScreen.cs
@@ -194,6 +194,13 @@ namespace osu.Game.Screens.Ranking
}
public override bool OnExiting(IScreen next)
+ {
+ Background.FadeTo(1, 250);
+
+ return base.OnExiting(next);
+ }
+
+ public override bool OnBackButton()
{
if (statisticsPanel.State.Value == Visibility.Visible)
{
@@ -201,9 +208,7 @@ namespace osu.Game.Screens.Ranking
return true;
}
- Background.FadeTo(1, 250);
-
- return base.OnExiting(next);
+ return false;
}
private void addScore(ScoreInfo score)
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index e3705b15fa..74a5ee8309 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -599,12 +599,6 @@ namespace osu.Game.Screens.Select
public override bool OnExiting(IScreen next)
{
- if (ModSelect.State.Value == Visibility.Visible)
- {
- ModSelect.Hide();
- return true;
- }
-
if (base.OnExiting(next))
return true;
@@ -620,6 +614,17 @@ namespace osu.Game.Screens.Select
return false;
}
+ public override bool OnBackButton()
+ {
+ if (ModSelect.State.Value == Visibility.Visible)
+ {
+ ModSelect.Hide();
+ return true;
+ }
+
+ return false;
+ }
+
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);