using OwlCore.Extensions;
using StrixMusic.Sdk.MediaPlayback;
using StrixMusic.Sdk.ViewModels;
using StrixMusic.Sdk.WinUI.Controls.Items.Abstract;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace StrixMusic.Sdk.WinUI.Controls.Items
{
///
/// A Templated for showing an in a list.
///
public partial class TrackItem : ItemControl
{
///
/// Initializes a new instance of the class.
///
public TrackItem()
{
DefaultStyleKey = typeof(TrackItem);
}
///
/// Backing dependency property for .
///
public static readonly DependencyProperty TrackProperty =
DependencyProperty.Register(nameof(Track), typeof(TrackViewModel), typeof(TrackItem),
new PropertyMetadata(null, (d, e) => d.Cast().OnTrackChanged((TrackViewModel?)e.OldValue, (TrackViewModel)e.NewValue)));
///
/// The track to display.
///
public TrackViewModel Track
{
get { return (TrackViewModel)GetValue(TrackProperty); }
set { SetValue(TrackProperty, value); }
}
///
protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
AttachHandlers();
}
private void AttachHandlers()
{
Unloaded += TrackItem_Unloaded;
}
private void DetachHandlers()
{
Unloaded -= TrackItem_Unloaded;
if (!(Track is null))
Track.PlaybackStateChanged -= OnPlaybackStateChanged;
}
private void TrackItem_Unloaded(object sender, RoutedEventArgs e) => DetachHandlers();
private void OnTrackChanged(TrackViewModel? oldValue, TrackViewModel newValue)
{
if (oldValue != null)
oldValue.PlaybackStateChanged -= OnPlaybackStateChanged;
if (!(newValue is null))
{
newValue.PlaybackStateChanged += OnPlaybackStateChanged;
PlaybackState = newValue.PlaybackState;
}
}
private void OnPlaybackStateChanged(object sender, PlaybackState e)
{
PlaybackState = e;
}
}
}