diff --git a/osu.Game/Beatmaps/BeatmapMetadata.cs b/osu.Game/Beatmaps/BeatmapMetadata.cs
index 747ffd0a40..89f9ebf47a 100644
--- a/osu.Game/Beatmaps/BeatmapMetadata.cs
+++ b/osu.Game/Beatmaps/BeatmapMetadata.cs
@@ -17,6 +17,7 @@ namespace osu.Game.Beatmaps
private int? onlineBeatmapSetID;
[NotMapped]
+ [JsonProperty(@"id")]
public int? OnlineBeatmapSetID
{
get { return onlineBeatmapSetID; }
diff --git a/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs b/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
index b3bdab2616..f2ca0c1a2f 100644
--- a/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
+++ b/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
@@ -9,7 +9,7 @@ using osu.Game.Rulesets;
namespace osu.Game.Online.API.Requests
{
- public class GetBeatmapSetsResponse : BeatmapMetadata
+ public class GetBeatmapSetsResponse : BeatmapMetadata // todo: this is a bit wrong...
{
[JsonProperty(@"covers")]
private BeatmapSetOnlineCovers covers { get; set; }
@@ -23,9 +23,6 @@ namespace osu.Game.Online.API.Requests
[JsonProperty(@"favourite_count")]
private int favouriteCount { get; set; }
- [JsonProperty(@"id")]
- private int onlineId { get; set; }
-
[JsonProperty(@"user_id")]
private long creatorId {
set { Author.Id = value; }
@@ -38,7 +35,7 @@ namespace osu.Game.Online.API.Requests
{
return new BeatmapSetInfo
{
- OnlineBeatmapSetID = onlineId,
+ OnlineBeatmapSetID = OnlineBeatmapSetID,
Metadata = this,
OnlineInfo = new BeatmapSetOnlineInfo
{
diff --git a/osu.Game/Overlays/DirectOverlay.cs b/osu.Game/Overlays/DirectOverlay.cs
index 14110724ea..d11f2342cd 100644
--- a/osu.Game/Overlays/DirectOverlay.cs
+++ b/osu.Game/Overlays/DirectOverlay.cs
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Linq;
+using System.Threading.Tasks;
using OpenTK;
using osu.Framework.Allocation;
using osu.Framework.Configuration;
@@ -65,9 +66,7 @@ namespace osu.Game.Overlays
ResultAmounts = new ResultCounts(distinctCount(artists), distinctCount(songs), distinctCount(tags));
- if (beatmapSets.Any() && panels == null)
- // real use case? currently only seems to be for test case
- recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
+ recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
}
}
@@ -274,13 +273,17 @@ namespace osu.Game.Overlays
Filter.DisplayStyleControl.Dropdown.Current.Value,
Filter.Tabs.Current.Value); //todo: sort direction (?)
- getSetsRequest.Success += r =>
+ getSetsRequest.Success += response =>
{
- BeatmapSets = r?.
- Select(response => response.ToBeatmapSet(rulesets)).
- Where(b => beatmaps.QueryBeatmapSet(q => q.OnlineBeatmapSetID == b.OnlineBeatmapSetID) == null);
+ Task.Run(() =>
+ {
+ var onlineIds = response.Select(r => r.OnlineBeatmapSetID).ToList();
+ var presentOnlineIds = beatmaps.QueryBeatmapSets(s => onlineIds.Contains(s.OnlineBeatmapSetID)).Select(r => r.OnlineBeatmapSetID).ToList();
+ var sets = response.Select(r => r.ToBeatmapSet(rulesets)).Where(b => !presentOnlineIds.Contains(b.OnlineBeatmapSetID)).ToList();
- recreatePanels(Filter.DisplayStyleControl.DisplayStyle.Value);
+ // may not need scheduling; loads async internally.
+ Schedule(() => BeatmapSets = sets);
+ });
};
api.Queue(getSetsRequest);
diff --git a/osu.Game/Rulesets/RulesetStore.cs b/osu.Game/Rulesets/RulesetStore.cs
index 4208d0edad..7aba62e4f1 100644
--- a/osu.Game/Rulesets/RulesetStore.cs
+++ b/osu.Game/Rulesets/RulesetStore.cs
@@ -41,7 +41,7 @@ namespace osu.Game.Rulesets
///
/// All available rulesets.
///
- public IEnumerable AvailableRulesets => GetContext().RulesetInfo.Where(r => r.Available);
+ public IEnumerable AvailableRulesets;
private static Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args) => loaded_assemblies.Keys.FirstOrDefault(a => a.FullName == args.Name);
@@ -93,6 +93,8 @@ namespace osu.Game.Rulesets
}
context.SaveChanges();
+
+ AvailableRulesets = context.RulesetInfo.Where(r => r.Available).ToList();
}
private static void loadRulesetFromFile(string file)