"Update" BeatmapCarousel

This commit is contained in:
Dean Herbert 2021-11-08 17:41:42 +09:00
parent 8696f82627
commit 3152d2d8a0
2 changed files with 51 additions and 18 deletions

View File

@ -873,8 +873,6 @@ namespace osu.Game.Tests.Visual.SongSelect
} }
} }
} }
protected override IEnumerable<BeatmapSetInfo> GetLoadableBeatmaps() => Enumerable.Empty<BeatmapSetInfo>();
} }
} }
} }

View File

@ -18,12 +18,14 @@ using osu.Framework.Threading;
using osu.Framework.Utils; using osu.Framework.Utils;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Database;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Cursor; using osu.Game.Graphics.Cursor;
using osu.Game.Input.Bindings; using osu.Game.Input.Bindings;
using osu.Game.Screens.Select.Carousel; using osu.Game.Screens.Select.Carousel;
using osuTK; using osuTK;
using osuTK.Input; using osuTK.Input;
using Realms;
namespace osu.Game.Screens.Select namespace osu.Game.Screens.Select
{ {
@ -172,17 +174,57 @@ namespace osu.Game.Screens.Select
RightClickScrollingEnabled.ValueChanged += enabled => Scroll.RightMouseScrollbar = enabled.NewValue; RightClickScrollingEnabled.ValueChanged += enabled => Scroll.RightMouseScrollbar = enabled.NewValue;
RightClickScrollingEnabled.TriggerChange(); RightClickScrollingEnabled.TriggerChange();
beatmaps.ItemUpdated += beatmapUpdated;
beatmaps.ItemRemoved += beatmapRemoved;
beatmaps.BeatmapHidden += beatmapHidden;
beatmaps.BeatmapRestored += beatmapRestored;
if (!beatmapSets.Any())
loadBeatmapSets(GetLoadableBeatmaps());
} }
protected virtual IEnumerable<BeatmapSetInfo> GetLoadableBeatmaps() => beatmaps.GetAllUsableBeatmapSetsEnumerable(); [Resolved]
private RealmContextFactory realmFactory { get; set; }
protected override void LoadComplete()
{
base.LoadComplete();
realmFactory.Context.All<BeatmapSetInfo>().Where(s => !s.DeletePending).QueryAsyncWithNotifications(beatmapSetsChanged);
realmFactory.Context.All<BeatmapInfo>().Where(b => !b.Hidden).QueryAsyncWithNotifications(beatmapsChanged);
}
private void beatmapRemoved(BeatmapSetInfo item) => RemoveBeatmapSet(item);
private void beatmapUpdated(BeatmapSetInfo item) => UpdateBeatmapSet(item);
private void beatmapSetsChanged(IRealmCollection<BeatmapSetInfo> sender, ChangeSet changes, Exception error)
{
if (changes == null)
{
// initial load
loadBeatmapSets(sender);
return;
}
foreach (int i in changes.NewModifiedIndices)
UpdateBeatmapSet(sender[i]);
// moves also appear as deletes / inserts but aren't important to us.
if (!changes.Moves.Any())
{
foreach (int i in changes.InsertedIndices)
UpdateBeatmapSet(sender[i]);
// TODO: This can not work, as we recently found out https://github.com/realm/realm-dotnet/discussions/2634#discussioncomment-1605595.
foreach (int i in changes.DeletedIndices)
RemoveBeatmapSet(sender[i]);
}
}
private void beatmapsChanged(IRealmCollection<BeatmapInfo> sender, ChangeSet changes, Exception error)
{
// we only care about actual changes in hidden status.
if (changes == null)
return;
// TODO: we can probably handle hidden items at a per-panel level (ie. start a realm subscription from there)?
// might be cleaner than handling via reconstruction of the whole set's panels.
foreach (int i in changes.NewModifiedIndices)
UpdateBeatmapSet(sender[i].BeatmapSet);
}
public void RemoveBeatmapSet(BeatmapSetInfo beatmapSet) => Schedule(() => public void RemoveBeatmapSet(BeatmapSetInfo beatmapSet) => Schedule(() =>
{ {
@ -617,11 +659,6 @@ namespace osu.Game.Screens.Select
return (firstIndex, lastIndex); return (firstIndex, lastIndex);
} }
private void beatmapRemoved(BeatmapSetInfo item) => RemoveBeatmapSet(item);
private void beatmapUpdated(BeatmapSetInfo item) => UpdateBeatmapSet(item);
private void beatmapRestored(BeatmapInfo b) => UpdateBeatmapSet(beatmaps.QueryBeatmapSet(s => s.ID == b.BeatmapSetInfoID));
private void beatmapHidden(BeatmapInfo b) => UpdateBeatmapSet(beatmaps.QueryBeatmapSet(s => s.ID == b.BeatmapSetInfoID));
private CarouselBeatmapSet createCarouselSet(BeatmapSetInfo beatmapSet) private CarouselBeatmapSet createCarouselSet(BeatmapSetInfo beatmapSet)
{ {
if (beatmapSet.Beatmaps.All(b => b.Hidden)) if (beatmapSet.Beatmaps.All(b => b.Hidden))
@ -888,8 +925,6 @@ namespace osu.Game.Screens.Select
{ {
beatmaps.ItemUpdated -= beatmapUpdated; beatmaps.ItemUpdated -= beatmapUpdated;
beatmaps.ItemRemoved -= beatmapRemoved; beatmaps.ItemRemoved -= beatmapRemoved;
beatmaps.BeatmapHidden -= beatmapHidden;
beatmaps.BeatmapRestored -= beatmapRestored;
} }
} }
} }