mirror of
https://github.com/ppy/osu.git
synced 2025-02-06 21:52:58 +08:00
fix flow on error states
This commit is contained in:
parent
92f0beb350
commit
5cc7ad4cf1
@ -465,7 +465,11 @@ namespace osu.Game.Tests.Visual.SongSelect
|
||||
private partial class FailableScoresProvider : BeatmapLeaderboardScoresProvider
|
||||
{
|
||||
public new void SetErrorState(LeaderboardState state) => base.SetErrorState(state);
|
||||
public new void SetScores(IEnumerable<ScoreInfo>? scores, ScoreInfo? userScore = null) => base.SetScores(scores, userScore);
|
||||
public new void SetScores(IEnumerable<ScoreInfo>? scores, ScoreInfo? userScore = null)
|
||||
{
|
||||
SetState(LeaderboardState.Retrieving);
|
||||
base.SetScores(scores, userScore);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,17 +91,9 @@ namespace osu.Game.Online.Leaderboards
|
||||
LeaderboardScoresProvider.State.BindValueChanged(state => onStateChange(state.NewValue));
|
||||
}
|
||||
|
||||
private void setNewScores(LeaderboardState state)
|
||||
private void onStateChange(LeaderboardState state)
|
||||
{
|
||||
// Non-delayed schedule may potentially run inline (due to IsMainThread check passing) after leaderboard is disposed.
|
||||
// This is guarded against in BeatmapLeaderboard via web request cancellation, but let's be extra safe.
|
||||
if (!IsDisposed)
|
||||
{
|
||||
// Schedule needs to be non-delayed here for the weird logic in refetchScores to work.
|
||||
// If it is removed, the placeholder will be incorrectly updated to "no scores" rather than "retrieving".
|
||||
// This whole flow should be refactored in the future.
|
||||
Scheduler.Add(applyNewScores, false);
|
||||
}
|
||||
Schedule(applyNewScores);
|
||||
|
||||
void applyNewScores()
|
||||
{
|
||||
@ -129,7 +121,7 @@ namespace osu.Game.Online.Leaderboards
|
||||
.Expire();
|
||||
scoreFlowContainer = null;
|
||||
|
||||
if (state == LeaderboardState.NoScores)
|
||||
if (!LeaderboardScoresProvider.Scores.Any())
|
||||
{
|
||||
setPlaceholder(state);
|
||||
return;
|
||||
@ -162,21 +154,6 @@ namespace osu.Game.Online.Leaderboards
|
||||
}, (currentScoresAsyncLoadCancellationSource = new CancellationTokenSource()).Token);
|
||||
}
|
||||
|
||||
private void onStateChange(LeaderboardState state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case LeaderboardState.Success:
|
||||
case LeaderboardState.NoScores:
|
||||
setNewScores(state);
|
||||
break;
|
||||
|
||||
default:
|
||||
setPlaceholder(state);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#region Placeholder handling
|
||||
|
||||
private Placeholder? placeholder;
|
||||
|
@ -91,8 +91,7 @@ namespace osu.Game.Online.Leaderboards
|
||||
{
|
||||
Debug.Assert(ThreadSafety.IsUpdateThread);
|
||||
|
||||
ClearScores();
|
||||
SetState(LeaderboardState.Retrieving);
|
||||
PrepareScoresRetrieval();
|
||||
|
||||
currentFetchCancellationSource = new CancellationTokenSource();
|
||||
|
||||
@ -138,10 +137,12 @@ namespace osu.Game.Online.Leaderboards
|
||||
/// <returns>An <see cref="APIRequest"/> responsible for the fetch operation. This will be queued and performed automatically.</returns>
|
||||
protected abstract APIRequest? FetchScores(CancellationToken cancellationToken);
|
||||
|
||||
public void ClearScores()
|
||||
protected void PrepareScoresRetrieval()
|
||||
{
|
||||
cancelPendingWork();
|
||||
SetScores(null);
|
||||
|
||||
scores.Clear();
|
||||
SetState(LeaderboardState.Retrieving);
|
||||
}
|
||||
|
||||
private void cancelPendingWork()
|
||||
|
@ -40,7 +40,7 @@ namespace osu.Game.Screens.Select.Leaderboards
|
||||
|
||||
// Refetch is scheduled, which can cause scores to be outdated if the leaderboard is not currently updating.
|
||||
// As scores are potentially used by other components, clear them eagerly to ensure a more correct state.
|
||||
SetScores(null);
|
||||
PrepareScoresRetrieval();
|
||||
|
||||
RefetchScores();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user