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.
// See the LICENCE file in the repository root for full licence text.
#nullable disable
using System;
using osu.Framework.Graphics.Sprites;
using osu.Game.Overlays.Dialog;
@ -16,7 +14,7 @@ public class ConfirmExitDialog : PopupDialog
/// </summary>
/// <param name="onConfirm">An action to perform on confirmation.</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!?";
BodyText = "Last chance to turn back";

View File

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