using System.Collections.ObjectModel; using System.Threading.Tasks; using OwlCore.Extensions; using StrixMusic.Sdk.ViewModels; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace StrixMusic.Shells.Groove.Controls.Collections { /// /// A for displaying s in the Groove Shell. /// public partial class GrooveTrackCollection : Control { /// /// Initializes a new instance of the class. /// public GrooveTrackCollection() { DefaultStyleKey = typeof(GrooveTrackCollection); Tracks = new ObservableCollection(); AttachEvents(); } /// /// The backing dependency propery for . /// public static readonly DependencyProperty TrackCollectionProperty = DependencyProperty.Register(nameof(TrackCollection), typeof(ITrackCollectionViewModel), typeof(GrooveTrackCollection), new PropertyMetadata(null, (d, e) => _ = d.Cast().OnTrackCollectionChangedAsync())); /// /// The track collection to display. /// public ITrackCollectionViewModel? TrackCollection { get { return (ITrackCollectionViewModel)GetValue(TrackCollectionProperty); } set { SetValue(TrackCollectionProperty, value); } } /// /// The tracks displayed in the collection, with additional properties. /// public ObservableCollection Tracks { get; set; } private void AttachEvents() { Unloaded += OnUnloaded; } private void DetachEvents() { if (TrackCollection != null) DetachEvents(TrackCollection.Tracks); Unloaded -= OnUnloaded; } private void AttachEvents(ObservableCollection tracks) { tracks.CollectionChanged += Tracks_CollectionChanged; } private void DetachEvents(ObservableCollection tracks) { tracks.CollectionChanged += Tracks_CollectionChanged; } private async Task OnTrackCollectionChangedAsync() { Tracks.Clear(); if (TrackCollection is null) return; await TrackCollection.InitTrackCollectionAsync(); foreach (var track in TrackCollection.Tracks) { Tracks.Add(new GrooveTrackViewModel(TrackCollection, track)); } AttachEvents(TrackCollection.Tracks); } private void Tracks_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { switch (e.Action) { case System.Collections.Specialized.NotifyCollectionChangedAction.Add: if (TrackCollection is null) return; foreach (var track in e.NewItems) Tracks.Add(new GrooveTrackViewModel(TrackCollection, (TrackViewModel)track)); break; case System.Collections.Specialized.NotifyCollectionChangedAction.Remove: for (int i = e.OldStartingIndex; i < e.OldItems.Count; i++) Tracks.RemoveAt(i); break; default: break; } } private void OnUnloaded(object sender, RoutedEventArgs e) { DetachEvents(); } } }