diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneStarRatingRangeDisplay.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneStarRatingRangeDisplay.cs
index b53a61f881..5c11690cd6 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneStarRatingRangeDisplay.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneStarRatingRangeDisplay.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
SelectedRoom.Value = new Room();
- Child = new StarRatingRangeDisplay
+ Child = new StarRatingRangeDisplay(SelectedRoom.Value)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre
diff --git a/osu.Game/Online/Rooms/Room.cs b/osu.Game/Online/Rooms/Room.cs
index dd3a9b2e73..9d69e791c7 100644
--- a/osu.Game/Online/Rooms/Room.cs
+++ b/osu.Game/Online/Rooms/Room.cs
@@ -164,6 +164,15 @@ namespace osu.Game.Online.Rooms
set => SetField(ref playlistItemStats, value);
}
+ ///
+ /// Describes the range of difficulty of the room.
+ ///
+ public RoomDifficultyRange? DifficultyRange
+ {
+ get => difficultyRange;
+ set => SetField(ref difficultyRange, value);
+ }
+
///
/// The playlist queueing mode. Only valid for multiplayer rooms.
///
@@ -270,6 +279,9 @@ namespace osu.Game.Online.Rooms
[JsonProperty("playlist_item_stats")]
private RoomPlaylistItemStats? playlistItemStats;
+ [JsonProperty("difficulty_range")]
+ private RoomDifficultyRange? difficultyRange;
+
[JsonConverter(typeof(SnakeCaseStringEnumConverter))]
[JsonProperty("type")]
private MatchType type;
@@ -300,10 +312,6 @@ namespace osu.Game.Online.Rooms
[JsonProperty("playlist")]
public readonly BindableList Playlist = new BindableList();
- [JsonProperty("difficulty_range")]
- [Cached]
- public readonly Bindable DifficultyRange = new Bindable();
-
[Cached]
[JsonProperty("current_user_score")]
public readonly Bindable UserScore = new Bindable();
@@ -340,7 +348,7 @@ namespace osu.Game.Online.Rooms
UserScore.Value = other.UserScore.Value;
QueueMode = other.QueueMode;
AutoStartDuration = other.AutoStartDuration;
- DifficultyRange.Value = other.DifficultyRange.Value;
+ DifficultyRange = other.DifficultyRange;
PlaylistItemStats = other.PlaylistItemStats;
CurrentPlaylistItem = other.CurrentPlaylistItem;
AutoSkip = other.AutoSkip;
diff --git a/osu.Game/Screens/OnlinePlay/Components/StarRatingRangeDisplay.cs b/osu.Game/Screens/OnlinePlay/Components/StarRatingRangeDisplay.cs
index 2ee3bb30dd..13e3dc6d7c 100644
--- a/osu.Game/Screens/OnlinePlay/Components/StarRatingRangeDisplay.cs
+++ b/osu.Game/Screens/OnlinePlay/Components/StarRatingRangeDisplay.cs
@@ -1,9 +1,8 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-#nullable disable
-
using System;
+using System.ComponentModel;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Graphics;
@@ -13,22 +12,27 @@ using osu.Framework.Utils;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
+using osu.Game.Online.Rooms;
using osuTK;
+using Container = osu.Framework.Graphics.Containers.Container;
namespace osu.Game.Screens.OnlinePlay.Components
{
public partial class StarRatingRangeDisplay : OnlinePlayComposite
{
+ private readonly Room room;
+
[Resolved]
- private OsuColour colours { get; set; }
+ private OsuColour colours { get; set; } = null!;
- private StarRatingDisplay minDisplay;
- private Drawable minBackground;
- private StarRatingDisplay maxDisplay;
- private Drawable maxBackground;
+ private StarRatingDisplay minDisplay = null!;
+ private Drawable minBackground = null!;
+ private StarRatingDisplay maxDisplay = null!;
+ private Drawable maxBackground = null!;
- public StarRatingRangeDisplay()
+ public StarRatingRangeDisplay(Room room)
{
+ this.room = room;
AutoSizeAxes = Axes.Both;
}
@@ -76,8 +80,16 @@ namespace osu.Game.Screens.OnlinePlay.Components
{
base.LoadComplete();
- DifficultyRange.BindValueChanged(_ => updateRange());
- Playlist.BindCollectionChanged((_, _) => updateRange(), true);
+ Playlist.BindCollectionChanged((_, _) => updateRange());
+
+ room.PropertyChanged += onRoomPropertyChanged;
+ updateRange();
+ }
+
+ private void onRoomPropertyChanged(object? sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(Room.DifficultyRange))
+ updateRange();
}
private void updateRange()
@@ -85,11 +97,11 @@ namespace osu.Game.Screens.OnlinePlay.Components
StarDifficulty minDifficulty;
StarDifficulty maxDifficulty;
- if (DifficultyRange.Value != null && Playlist.Count == 0)
+ if (room.DifficultyRange != null && Playlist.Count == 0)
{
// When Playlist is empty (in lounge) we take retrieved range
- minDifficulty = new StarDifficulty(DifficultyRange.Value.Min, 0);
- maxDifficulty = new StarDifficulty(DifficultyRange.Value.Max, 0);
+ minDifficulty = new StarDifficulty(room.DifficultyRange.Min, 0);
+ maxDifficulty = new StarDifficulty(room.DifficultyRange.Max, 0);
}
else
{
@@ -107,5 +119,11 @@ namespace osu.Game.Screens.OnlinePlay.Components
minBackground.Colour = colours.ForStarDifficulty(minDifficulty.Stars);
maxBackground.Colour = colours.ForStarDifficulty(maxDifficulty.Stars);
}
+
+ protected override void Dispose(bool isDisposing)
+ {
+ base.Dispose(isDisposing);
+ room.PropertyChanged -= onRoomPropertyChanged;
+ }
}
}
diff --git a/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs b/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
index ddfbe00227..c368666ac2 100644
--- a/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Lounge/Components/DrawableRoom.cs
@@ -360,7 +360,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge.Components
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
},
- new StarRatingRangeDisplay
+ new StarRatingRangeDisplay(Room)
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
diff --git a/osu.Game/Screens/OnlinePlay/OnlinePlayComposite.cs b/osu.Game/Screens/OnlinePlay/OnlinePlayComposite.cs
index 46debb5b9d..66e43c50b7 100644
--- a/osu.Game/Screens/OnlinePlay/OnlinePlayComposite.cs
+++ b/osu.Game/Screens/OnlinePlay/OnlinePlayComposite.cs
@@ -17,9 +17,6 @@ namespace osu.Game.Screens.OnlinePlay
[Resolved(typeof(Room))]
protected BindableList Playlist { get; private set; } = null!;
- [Resolved(typeof(Room))]
- protected Bindable DifficultyRange { get; private set; } = null!;
-
[Resolved(typeof(Room))]
protected BindableList RecentParticipants { get; private set; } = null!;