1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-10 23:12:54 +08:00
osu-lazer/osu.Game/Screens/Menu/StorageErrorDialog.cs
Bartłomiej Dach 091d02b3a8
Fix retry button on storage unavailable dialog not reopening realm if retry succeeds
Related: https://github.com/ppy/osu/issues/30539

When starting up the game with a data location that points to an
unavailable external device, a new realm file is created in the default
location. Eventually a popup is shown that informs the user that the
external storage is unavailable, and the user has an option to try the
storage again. The button that invokes said option would check said
storage correctly, but would not do anything about realm, which means
the previously opened empty realm that is placed in the default location
would remain open, which means the retry essentially doesn't work
because the user's stuff isn't there after the retry.

To fix this, take out a `BlockAllOperations()`, which will flush all
open realms, and re-open the realm on the external location if the
custom storage restore succeeds.
2024-11-08 09:28:14 +01:00

90 lines
3.5 KiB
C#

// 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.Collections.Generic;
using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites;
using osu.Game.Database;
using osu.Game.IO;
using osu.Game.Localisation;
using osu.Game.Overlays;
using osu.Game.Overlays.Dialog;
namespace osu.Game.Screens.Menu
{
public partial class StorageErrorDialog : PopupDialog
{
[Resolved]
private IDialogOverlay dialogOverlay { get; set; } = null!;
[Resolved]
private RealmAccess realmAccess { get; set; } = null!;
public StorageErrorDialog(OsuStorage storage, OsuStorageError error)
{
HeaderText = StorageErrorDialogStrings.StorageError;
Icon = FontAwesome.Solid.ExclamationTriangle;
var buttons = new List<PopupDialogButton>();
switch (error)
{
case OsuStorageError.NotAccessible:
BodyText = StorageErrorDialogStrings.LocationIsNotAccessible(storage.CustomStoragePath);
buttons.AddRange(new PopupDialogButton[]
{
new PopupDialogCancelButton
{
Text = StorageErrorDialogStrings.TryAgain,
Action = () =>
{
bool success;
OsuStorageError nextError;
// blocking all operations has a side effect of closing & reopening the realm db,
// which is desirable here since the restoration of the old storage - if it succeeds - means the realm db has moved.
using (realmAccess.BlockAllOperations(@"restoration of previously unavailable storage"))
success = storage.TryChangeToCustomStorage(out nextError);
if (!success)
dialogOverlay.Push(new StorageErrorDialog(storage, nextError));
}
},
new PopupDialogCancelButton
{
Text = StorageErrorDialogStrings.UseDefaultLocation,
},
new PopupDialogOkButton
{
Text = StorageErrorDialogStrings.ResetToDefaultLocation,
Action = storage.ResetCustomStoragePath
},
});
break;
case OsuStorageError.AccessibleButEmpty:
BodyText = StorageErrorDialogStrings.LocationIsEmpty(storage.CustomStoragePath);
// Todo: Provide the option to search for the files similar to migration.
buttons.AddRange(new PopupDialogButton[]
{
new PopupDialogCancelButton
{
Text = StorageErrorDialogStrings.StartFresh
},
new PopupDialogOkButton
{
Text = StorageErrorDialogStrings.ResetToDefaultLocation,
Action = storage.ResetCustomStoragePath
},
});
break;
}
Buttons = buttons;
}
}
}