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 @@ public class BeatmapMetadata 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 @@ 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 @@ public class GetBeatmapSetsResponse : BeatmapMetadata [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 @@ public BeatmapSetInfo ToBeatmapSet(RulesetStore rulesets) { 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 @@ public IEnumerable BeatmapSets 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 @@ private void updateSearch() 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 @@ public RulesetStore(Func factory) /// /// 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 @@ protected void AddMissingRulesets() } context.SaveChanges(); + + AvailableRulesets = context.RulesetInfo.Where(r => r.Available).ToList(); } private static void loadRulesetFromFile(string file)