Add confirmation dialog when about to discard a playlist

The confirmation will only show if items have been added to the
playlist.

Closes https://github.com/ppy/osu/issues/19444.
This commit is contained in:
Dean Herbert 2022-07-29 16:22:54 +09:00
parent eb92c35335
commit 9d457535c6
3 changed files with 61 additions and 6 deletions

View File

@ -0,0 +1,39 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using osu.Framework.Graphics.Sprites;
using osu.Game.Overlays.Dialog;
namespace osu.Game.Screens.Menu
{
public class ConfirmDiscardChangesDialog : PopupDialog
{
/// <summary>
/// Construct a new discard changes confirmation dialog.
/// </summary>
/// <param name="onConfirm">An action to perform on confirmation.</param>
/// <param name="onCancel">An optional action to perform on cancel.</param>
public ConfirmDiscardChangesDialog(Action onConfirm, Action? onCancel = null)
{
HeaderText = "Are you sure you want to go back?";
BodyText = "This will discard any unsaved changes";
Icon = FontAwesome.Solid.ExclamationTriangle;
Buttons = new PopupDialogButton[]
{
new PopupDialogDangerousButton
{
Text = @"Yes",
Action = onConfirm
},
new PopupDialogCancelButton
{
Text = @"No I didn't mean to",
Action = onCancel
},
};
}
}
}

View File

@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
#nullable disable
using System; using System;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Overlays.Dialog; using osu.Game.Overlays.Dialog;
@ -16,7 +14,7 @@ namespace osu.Game.Screens.Menu
/// </summary> /// </summary>
/// <param name="onConfirm">An action to perform on confirmation.</param> /// <param name="onConfirm">An action to perform on confirmation.</param>
/// <param name="onCancel">An optional action to perform on cancel.</param> /// <param name="onCancel">An optional action to perform on cancel.</param>
public ConfirmExitDialog(Action onConfirm, Action onCancel = null) public ConfirmExitDialog(Action onConfirm, Action? onCancel = null)
{ {
HeaderText = "Are you sure you want to exit osu!?"; HeaderText = "Are you sure you want to exit osu!?";
BodyText = "Last chance to turn back"; BodyText = "Last chance to turn back";

View File

@ -28,6 +28,7 @@ using osu.Game.Overlays;
using osu.Game.Overlays.Mods; using osu.Game.Overlays.Mods;
using osu.Game.Rulesets; using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Mods;
using osu.Game.Screens.Menu;
using osu.Game.Screens.OnlinePlay.Match.Components; using osu.Game.Screens.OnlinePlay.Match.Components;
using osu.Game.Screens.OnlinePlay.Multiplayer; using osu.Game.Screens.OnlinePlay.Multiplayer;
@ -280,13 +281,30 @@ namespace osu.Game.Screens.OnlinePlay.Match
}; };
} }
[Resolved(canBeNull: true)]
private IDialogOverlay dialogOverlay { get; set; }
public override bool OnBackButton() public override bool OnBackButton()
{ {
if (Room.RoomID.Value == null) if (Room.RoomID.Value == null)
{ {
// room has not been created yet; exit immediately. if (dialogOverlay == null || Room.Playlist.Count == 0)
settingsOverlay.Hide(); {
return base.OnBackButton(); 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)
return true;
dialogOverlay?.Push(new ConfirmDiscardChangesDialog(() =>
{
settingsOverlay.Hide();
this.Exit();
}));
return true;
} }
if (UserModsSelectOverlay.State.Value == Visibility.Visible) if (UserModsSelectOverlay.State.Value == Visibility.Visible)