From 369ab10212c87ea468749e3e16cd2e7805cdc60e Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 30 Jul 2022 10:31:23 +0300 Subject: [PATCH] Fix exit confirmation dialog not blocking all exit cases --- .../Screens/OnlinePlay/Match/RoomSubScreen.cs | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs index 5b3ed0059d..1b90d557d1 100644 --- a/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs +++ b/osu.Game/Screens/OnlinePlay/Match/RoomSubScreen.cs @@ -288,23 +288,11 @@ namespace osu.Game.Screens.OnlinePlay.Match { if (Room.RoomID.Value == null) { - if (dialogOverlay == null || Room.Playlist.Count == 0) - { - settingsOverlay.Hide(); - return base.OnBackButton(); - } - - // if the dialog is already displayed, block exiting until the user explicitly makes a decision. - if (dialogOverlay.CurrentDialog is ConfirmDiscardChangesDialog) + if (!ensureExitConfirmed()) return true; - dialogOverlay?.Push(new ConfirmDiscardChangesDialog(() => - { - settingsOverlay.Hide(); - this.Exit(); - })); - - return true; + settingsOverlay.Hide(); + return base.OnBackButton(); } if (UserModsSelectOverlay.State.Value == Visibility.Visible) @@ -348,8 +336,13 @@ namespace osu.Game.Screens.OnlinePlay.Match Scheduler.AddOnce(updateRuleset); } + private bool exitConfirmed; + public override bool OnExiting(ScreenExitEvent e) { + if (!ensureExitConfirmed()) + return true; + RoomManager?.PartRoom(); Mods.Value = Array.Empty(); @@ -358,6 +351,28 @@ namespace osu.Game.Screens.OnlinePlay.Match return base.OnExiting(e); } + private bool ensureExitConfirmed() + { + if (exitConfirmed) + return true; + + if (dialogOverlay == null || Room.RoomID.Value != null || Room.Playlist.Count == 0) + return true; + + // if the dialog is already displayed, block exiting until the user explicitly makes a decision. + if (dialogOverlay.CurrentDialog is ConfirmDiscardChangesDialog) + return false; + + dialogOverlay.Push(new ConfirmDiscardChangesDialog(() => + { + exitConfirmed = true; + settingsOverlay.Hide(); + this.Exit(); + })); + + return false; + } + protected void StartPlay() { // User may be at song select or otherwise when the host starts gameplay.