// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using JetBrains.Annotations; using osu.Framework.Bindables; namespace osu.Game.Collections { /// /// A filter. /// public class CollectionFilterMenuItem : IEquatable { /// /// The collection to filter beatmaps from. /// May be null to not filter by collection (include all beatmaps). /// [CanBeNull] public readonly BeatmapCollection Collection; /// /// The name of the collection. /// [NotNull] public readonly Bindable CollectionName; /// /// Creates a new . /// /// The collection to filter beatmaps from. public CollectionFilterMenuItem([CanBeNull] BeatmapCollection collection) { Collection = collection; CollectionName = Collection?.Name.GetBoundCopy() ?? new Bindable("All beatmaps"); } public bool Equals(CollectionFilterMenuItem other) { if (other == null) return false; // collections may have the same name, so compare first on reference equality. // this relies on the assumption that only one instance of the BeatmapCollection exists game-wide, managed by CollectionManager. if (Collection != null) return Collection == other.Collection; // fallback to name-based comparison. // this is required for special dropdown items which don't have a collection (all beatmaps / manage collections items below). return CollectionName.Value == other.CollectionName.Value; } public override int GetHashCode() => CollectionName.Value.GetHashCode(); } public class AllBeatmapsCollectionFilterMenuItem : CollectionFilterMenuItem { public AllBeatmapsCollectionFilterMenuItem() : base(null) { } } public class ManageCollectionsFilterMenuItem : CollectionFilterMenuItem { public ManageCollectionsFilterMenuItem() : base(null) { CollectionName.Value = "Manage collections..."; } } }