// 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.Linq; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Graphics.Containers; using osuTK; namespace osu.Game.Overlays.Music { public class Playlist : OsuRearrangeableListContainer> { public Action> RequestSelection; public readonly Bindable> SelectedSet = new Bindable>(); public new MarginPadding Padding { get => base.Padding; set => base.Padding = value; } public void Filter(FilterCriteria criteria) { var items = (SearchContainer>>)ListContainer; foreach (var item in items.OfType()) { if (criteria.Collection == null) item.InSelectedCollection = true; else { item.InSelectedCollection = item.Model.Value.Beatmaps.Select(b => b.MD5Hash) .Any(criteria.Collection.BeatmapMD5Hashes.Contains); } } items.SearchTerm = criteria.SearchText; } public Live FirstVisibleSet => Items.FirstOrDefault(i => ((PlaylistItem)ItemMap[i]).MatchingFilter); protected override OsuRearrangeableListItem> CreateOsuDrawable(Live item) => new PlaylistItem(item) { SelectedSet = { BindTarget = SelectedSet }, RequestSelection = set => RequestSelection?.Invoke(set) }; protected override FillFlowContainer>> CreateListFillFlowContainer() => new SearchContainer>> { Spacing = new Vector2(0, 3), LayoutDuration = 200, LayoutEasing = Easing.OutQuint, }; } }