1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-15 02:33:02 +08:00

Merge branch 'master' into fix-slider-ticks-appearing-too-late

This commit is contained in:
Dan Balasescu 2022-09-26 18:21:08 +09:00 committed by GitHub
commit d2669762ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 48 additions and 38 deletions

View File

@ -185,10 +185,15 @@ namespace osu.Game.Online.Leaderboards
if (scores != null) if (scores != null)
this.scores.AddRange(scores); this.scores.AddRange(scores);
// 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. // 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". // 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. // This whole flow should be refactored in the future.
Scheduler.Add(applyNewScores, false); Scheduler.Add(applyNewScores, false);
}
void applyNewScores() void applyNewScores()
{ {

View File

@ -123,7 +123,7 @@ namespace osu.Game.Overlays.FirstRunSetup
beatmapSubscription?.Dispose(); beatmapSubscription?.Dispose();
} }
private void beatmapsChanged(IRealmCollection<BeatmapSetInfo> sender, ChangeSet? changes, Exception error) private void beatmapsChanged(IRealmCollection<BeatmapSetInfo> sender, ChangeSet? changes, Exception error) => Schedule(() =>
{ {
currentlyLoadedBeatmaps.Text = FirstRunSetupBeatmapScreenStrings.CurrentlyLoadedBeatmaps(sender.Count); currentlyLoadedBeatmaps.Text = FirstRunSetupBeatmapScreenStrings.CurrentlyLoadedBeatmaps(sender.Count);
@ -139,7 +139,7 @@ namespace osu.Game.Overlays.FirstRunSetup
currentlyLoadedBeatmaps.ScaleTo(1.1f) currentlyLoadedBeatmaps.ScaleTo(1.1f)
.ScaleTo(1, 1500, Easing.OutQuint); .ScaleTo(1, 1500, Easing.OutQuint);
} }
} });
private void downloadTutorial() private void downloadTutorial()
{ {

View File

@ -58,12 +58,11 @@ namespace osu.Game.Overlays
[Resolved] [Resolved]
private RealmAccess realm { get; set; } private RealmAccess realm { get; set; }
[BackgroundDependencyLoader] protected override void LoadComplete()
private void load()
{ {
// Todo: These binds really shouldn't be here, but are unlikely to cause any issues for now. base.LoadComplete();
// They are placed here for now since some tests rely on setting the beatmap _and_ their hierarchies inside their load(), which runs before the MusicController's load().
beatmap.BindValueChanged(beatmapChanged, true); beatmap.BindValueChanged(b => changeBeatmap(b.NewValue), true);
mods.BindValueChanged(_ => ResetTrackAdjustments(), true); mods.BindValueChanged(_ => ResetTrackAdjustments(), true);
} }
@ -263,8 +262,6 @@ namespace osu.Game.Overlays
private IQueryable<BeatmapSetInfo> getBeatmapSets() => realm.Realm.All<BeatmapSetInfo>().Where(s => !s.DeletePending); private IQueryable<BeatmapSetInfo> getBeatmapSets() => realm.Realm.All<BeatmapSetInfo>().Where(s => !s.DeletePending);
private void beatmapChanged(ValueChangedEvent<WorkingBeatmap> beatmap) => changeBeatmap(beatmap.NewValue);
private void changeBeatmap(WorkingBeatmap newWorking) private void changeBeatmap(WorkingBeatmap newWorking)
{ {
// This method can potentially be triggered multiple times as it is eagerly fired in next() / prev() to ensure correct execution order // This method can potentially be triggered multiple times as it is eagerly fired in next() / prev() to ensure correct execution order

View File

@ -215,21 +215,21 @@ namespace osu.Game.Overlays.Settings.Sections.Input
rotation.BindTo(tabletHandler.Rotation); rotation.BindTo(tabletHandler.Rotation);
areaOffset.BindTo(tabletHandler.AreaOffset); areaOffset.BindTo(tabletHandler.AreaOffset);
areaOffset.BindValueChanged(val => areaOffset.BindValueChanged(val => Schedule(() =>
{ {
offsetX.Value = val.NewValue.X; offsetX.Value = val.NewValue.X;
offsetY.Value = val.NewValue.Y; offsetY.Value = val.NewValue.Y;
}, true); }), true);
offsetX.BindValueChanged(val => areaOffset.Value = new Vector2(val.NewValue, areaOffset.Value.Y)); offsetX.BindValueChanged(val => areaOffset.Value = new Vector2(val.NewValue, areaOffset.Value.Y));
offsetY.BindValueChanged(val => areaOffset.Value = new Vector2(areaOffset.Value.X, val.NewValue)); offsetY.BindValueChanged(val => areaOffset.Value = new Vector2(areaOffset.Value.X, val.NewValue));
areaSize.BindTo(tabletHandler.AreaSize); areaSize.BindTo(tabletHandler.AreaSize);
areaSize.BindValueChanged(val => areaSize.BindValueChanged(val => Schedule(() =>
{ {
sizeX.Value = val.NewValue.X; sizeX.Value = val.NewValue.X;
sizeY.Value = val.NewValue.Y; sizeY.Value = val.NewValue.Y;
}, true); }), true);
sizeX.BindValueChanged(val => sizeX.BindValueChanged(val =>
{ {
@ -255,7 +255,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
}); });
tablet.BindTo(tabletHandler.Tablet); tablet.BindTo(tabletHandler.Tablet);
tablet.BindValueChanged(val => tablet.BindValueChanged(val => Schedule(() =>
{ {
Scheduler.AddOnce(updateVisibility); Scheduler.AddOnce(updateVisibility);
@ -274,7 +274,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
sizeY.Default = sizeY.MaxValue = tab.Size.Y; sizeY.Default = sizeY.MaxValue = tab.Size.Y;
areaSize.Default = new Vector2(sizeX.Default, sizeY.Default); areaSize.Default = new Vector2(sizeX.Default, sizeY.Default);
}, true); }), true);
} }
private void updateVisibility() private void updateVisibility()

View File

@ -58,6 +58,9 @@ namespace osu.Game.Rulesets.Configuration
pendingWrites.Clear(); pendingWrites.Clear();
} }
if (!changed.Any())
return true;
realm?.Write(r => realm?.Write(r =>
{ {
foreach (var c in changed) foreach (var c in changed)

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.Timing; using osu.Framework.Timing;
using osu.Game.Online.Multiplayer; using osu.Game.Online.Multiplayer;

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 System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
@ -12,6 +10,7 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions; using osu.Framework.Extensions;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Database; using osu.Game.Database;
using osu.Game.Graphics; using osu.Game.Graphics;
@ -34,19 +33,20 @@ namespace osu.Game.Screens.Play.HUD
public readonly SortedDictionary<int, BindableLong> TeamScores = new SortedDictionary<int, BindableLong>(); public readonly SortedDictionary<int, BindableLong> TeamScores = new SortedDictionary<int, BindableLong>();
[Resolved] [Resolved]
private OsuColour colours { get; set; } private OsuColour colours { get; set; } = null!;
[Resolved] [Resolved]
private SpectatorClient spectatorClient { get; set; } private SpectatorClient spectatorClient { get; set; } = null!;
[Resolved] [Resolved]
private MultiplayerClient multiplayerClient { get; set; } private MultiplayerClient multiplayerClient { get; set; } = null!;
[Resolved] [Resolved]
private UserLookupCache userLookupCache { get; set; } private UserLookupCache userLookupCache { get; set; } = null!;
private Bindable<ScoringMode> scoringMode = null!;
private readonly MultiplayerRoomUser[] playingUsers; private readonly MultiplayerRoomUser[] playingUsers;
private Bindable<ScoringMode> scoringMode;
private readonly IBindableList<int> playingUserIds = new BindableList<int>(); private readonly IBindableList<int> playingUserIds = new BindableList<int>();
@ -126,15 +126,18 @@ namespace osu.Game.Screens.Play.HUD
playingUserIds.BindCollectionChanged(playingUsersChanged); playingUserIds.BindCollectionChanged(playingUsersChanged);
} }
protected override GameplayLeaderboardScore CreateLeaderboardScoreDrawable(IUser user, bool isTracked) protected override GameplayLeaderboardScore CreateLeaderboardScoreDrawable(IUser? user, bool isTracked)
{ {
var leaderboardScore = base.CreateLeaderboardScoreDrawable(user, isTracked); var leaderboardScore = base.CreateLeaderboardScoreDrawable(user, isTracked);
if (user != null)
{
if (UserScores[user.OnlineID].Team is int team) if (UserScores[user.OnlineID].Team is int team)
{ {
leaderboardScore.BackgroundColour = getTeamColour(team).Lighten(1.2f); leaderboardScore.BackgroundColour = getTeamColour(team).Lighten(1.2f);
leaderboardScore.TextColour = Color4.White; leaderboardScore.TextColour = Color4.White;
} }
}
return leaderboardScore; return leaderboardScore;
} }
@ -189,7 +192,7 @@ namespace osu.Game.Screens.Play.HUD
{ {
base.Dispose(isDisposing); base.Dispose(isDisposing);
if (spectatorClient != null) if (spectatorClient.IsNotNull())
{ {
foreach (var user in playingUsers) foreach (var user in playingUsers)
spectatorClient.StopWatchingUser(user.UserID); spectatorClient.StopWatchingUser(user.UserID);

View File

@ -89,6 +89,8 @@ namespace osu.Game.Screens.Select.Leaderboards
private IDisposable scoreSubscription; private IDisposable scoreSubscription;
private GetScoresRequest scoreRetrievalRequest;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
{ {
@ -151,14 +153,14 @@ namespace osu.Game.Screens.Select.Leaderboards
else if (filterMods) else if (filterMods)
requestMods = mods.Value; requestMods = mods.Value;
var req = new GetScoresRequest(fetchBeatmapInfo, fetchRuleset, Scope, requestMods); scoreRetrievalRequest = new GetScoresRequest(fetchBeatmapInfo, fetchRuleset, Scope, requestMods);
req.Success += r => SetScores( scoreRetrievalRequest.Success += response => SetScores(
scoreManager.OrderByTotalScore(r.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo))), scoreManager.OrderByTotalScore(response.Scores.Select(s => s.ToScoreInfo(rulesets, fetchBeatmapInfo))),
r.UserScore?.CreateScoreInfo(rulesets, fetchBeatmapInfo) response.UserScore?.CreateScoreInfo(rulesets, fetchBeatmapInfo)
); );
return req; return scoreRetrievalRequest;
} }
protected override LeaderboardScore CreateDrawableScore(ScoreInfo model, int index) => new LeaderboardScore(model, index, IsOnlineScope) protected override LeaderboardScore CreateDrawableScore(ScoreInfo model, int index) => new LeaderboardScore(model, index, IsOnlineScope)
@ -218,7 +220,9 @@ namespace osu.Game.Screens.Select.Leaderboards
protected override void Dispose(bool isDisposing) protected override void Dispose(bool isDisposing)
{ {
base.Dispose(isDisposing); base.Dispose(isDisposing);
scoreSubscription?.Dispose(); scoreSubscription?.Dispose();
scoreRetrievalRequest?.Cancel();
} }
} }
} }