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();
}
}
}