diff --git a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs
index 2b252f9db7..89bc659f63 100644
--- a/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs
+++ b/osu.Game/Screens/OnlinePlay/Playlists/PlaylistsResultsScreen.cs
@@ -32,6 +32,9 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
[Resolved]
private IAPIProvider api { get; set; }
+ [Resolved]
+ private ScoreManager scoreManager { get; set; }
+
public PlaylistsResultsScreen(ScoreInfo score, long roomId, PlaylistItem playlistItem, bool allowRetry, bool allowWatchingReplay = true)
: base(score, allowRetry, allowWatchingReplay)
{
@@ -166,23 +169,28 @@ namespace osu.Game.Screens.OnlinePlay.Playlists
/// An optional pivot around which the scores were retrieved.
private void performSuccessCallback([NotNull] Action> callback, [NotNull] List scores, [CanBeNull] MultiplayerScores pivot = null)
{
- var scoreInfos = new List(scores.Select(s => s.CreateScoreInfo(playlistItem)));
+ var scoreInfos = scores.Select(s => s.CreateScoreInfo(playlistItem)).ToArray();
- // Select a score if we don't already have one selected.
- // Note: This is done before the callback so that the panel list centres on the selected score before panels are added (eliminating initial scroll).
- if (SelectedScore.Value == null)
+ // Score panels calculate total score before displaying, which can take some time. In order to count that calculation as part of the loading spinner display duration,
+ // calculate the total scores locally before invoking the success callback.
+ scoreManager.OrderByTotalScoreAsync(scoreInfos).ContinueWith(_ => Schedule(() =>
{
- Schedule(() =>
+ // Select a score if we don't already have one selected.
+ // Note: This is done before the callback so that the panel list centres on the selected score before panels are added (eliminating initial scroll).
+ if (SelectedScore.Value == null)
{
- // Prefer selecting the local user's score, or otherwise default to the first visible score.
- SelectedScore.Value = scoreInfos.FirstOrDefault(s => s.User.Id == api.LocalUser.Value.Id) ?? scoreInfos.FirstOrDefault();
- });
- }
+ Schedule(() =>
+ {
+ // Prefer selecting the local user's score, or otherwise default to the first visible score.
+ SelectedScore.Value = scoreInfos.FirstOrDefault(s => s.User.Id == api.LocalUser.Value.Id) ?? scoreInfos.FirstOrDefault();
+ });
+ }
- // Invoke callback to add the scores. Exclude the user's current score which was added previously.
- callback.Invoke(scoreInfos.Where(s => s.OnlineScoreID != Score?.OnlineScoreID));
+ // Invoke callback to add the scores. Exclude the user's current score which was added previously.
+ callback.Invoke(scoreInfos.Where(s => s.OnlineScoreID != Score?.OnlineScoreID));
- hideLoadingSpinners(pivot);
+ hideLoadingSpinners(pivot);
+ }));
}
private void hideLoadingSpinners([CanBeNull] MultiplayerScores pivot = null)
diff --git a/osu.Game/Screens/Ranking/ResultsScreen.cs b/osu.Game/Screens/Ranking/ResultsScreen.cs
index d44d1f2cc9..822ee1cf90 100644
--- a/osu.Game/Screens/Ranking/ResultsScreen.cs
+++ b/osu.Game/Screens/Ranking/ResultsScreen.cs
@@ -52,8 +52,7 @@ namespace osu.Game.Screens.Ranking
private Drawable bottomPanel;
private Container detachedPanelContainer;
- private bool fetchedInitialScores;
- private APIRequest nextPageRequest;
+ private bool lastFetchCompleted;
private readonly bool allowRetry;
private readonly bool allowWatchingReplay;
@@ -191,8 +190,10 @@ namespace osu.Game.Screens.Ranking
{
base.Update();
- if (fetchedInitialScores && nextPageRequest == null)
+ if (lastFetchCompleted)
{
+ APIRequest nextPageRequest = null;
+
if (ScorePanelList.IsScrolledToStart)
nextPageRequest = FetchNextPage(-1, fetchScoresCallback);
else if (ScorePanelList.IsScrolledToEnd)
@@ -200,10 +201,7 @@ namespace osu.Game.Screens.Ranking
if (nextPageRequest != null)
{
- // Scheduled after children to give the list a chance to update its scroll position and not potentially trigger a second request too early.
- nextPageRequest.Success += () => ScheduleAfterChildren(() => nextPageRequest = null);
- nextPageRequest.Failure += _ => ScheduleAfterChildren(() => nextPageRequest = null);
-
+ lastFetchCompleted = false;
api.Queue(nextPageRequest);
}
}
@@ -229,7 +227,7 @@ namespace osu.Game.Screens.Ranking
foreach (var s in scores)
addScore(s);
- fetchedInitialScores = true;
+ lastFetchCompleted = true;
});
public override void OnEntering(IScreen last)