diff --git a/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs b/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs new file mode 100644 index 0000000..7742926 --- /dev/null +++ b/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs @@ -0,0 +1,47 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Harmonia.Core.Playlists; +using System; +using System.Linq; + +namespace Harmonia.WinUI.ViewModels; + +public partial class PlaylistItemViewModel : ObservableObject +{ + public Playlist Playlist { get; private set; } + + private string _summary = string.Empty; + public string Summary + { + get + { + return _summary; + } + set + { + SetProperty(ref _summary, value); + } + } + + public PlaylistItemViewModel(Playlist playlist) + { + Playlist = playlist; + Playlist.PlaylistUpdated += OnPlaylistUpdated; + UpdateMetaData(); + } + + public void Unsubscribe() + { + Playlist.PlaylistUpdated -= OnPlaylistUpdated; + } + + private void OnPlaylistUpdated(object? sender, EventArgs e) + { + UpdateMetaData(); + } + + private void UpdateMetaData() + { + TimeSpan total = TimeSpan.FromSeconds(Playlist.Songs.Sum(s => s.Song.Length.TotalSeconds)); + Summary = $"{Playlist.Songs.Count} songs / {total:h\\:mm\\:ss}"; + } +} \ No newline at end of file diff --git a/Harmonia.WinUI/ViewModels/PlaylistsViewModel.cs b/Harmonia.WinUI/ViewModels/PlaylistsViewModel.cs index 435b14b..79bf6db 100644 --- a/Harmonia.WinUI/ViewModels/PlaylistsViewModel.cs +++ b/Harmonia.WinUI/ViewModels/PlaylistsViewModel.cs @@ -1,6 +1,8 @@ -using Harmonia.Core.Playlists; +using CommunityToolkit.Mvvm.ComponentModel; +using Harmonia.Core.Playlists; using System; using System.Collections.ObjectModel; +using System.Linq; namespace Harmonia.WinUI.ViewModels; @@ -8,8 +10,8 @@ public partial class PlaylistsViewModel : ViewModelBase { private readonly IPlaylistManager _playlistManager; - private ObservableCollection _playlists = []; - public ObservableCollection Playlists + private ObservableCollection _playlists = []; + public ObservableCollection Playlists { get { @@ -21,8 +23,8 @@ public partial class PlaylistsViewModel : ViewModelBase } } - private Playlist? _selectedPlaylist = null; - public Playlist? SelectedPlaylist + private PlaylistItemViewModel? _selectedPlaylist = null; + public PlaylistItemViewModel? SelectedPlaylist { get { @@ -32,7 +34,7 @@ public partial class PlaylistsViewModel : ViewModelBase { if (SetProperty(ref _selectedPlaylist, value)) { - _playlistManager.CurrentPlaylist = value; + _playlistManager.CurrentPlaylist = value?.Playlist; } } } @@ -44,22 +46,28 @@ public partial class PlaylistsViewModel : ViewModelBase _playlistManager.PlaylistRemoved += OnPlaylistRemoved; _playlistManager.CurrentPlaylistChanged += OnCurrentPlaylistChanged; - _playlists = new(_playlistManager.Playlists); - _selectedPlaylist = _playlistManager.CurrentPlaylist; + _playlists = new ObservableCollection(_playlistManager.Playlists.Select(p => new PlaylistItemViewModel(p))); + _selectedPlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _playlistManager.CurrentPlaylist); } private void OnCurrentPlaylistChanged(object? sender, EventArgs e) { - SelectedPlaylist = _playlistManager.CurrentPlaylist; + SelectedPlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _playlistManager.CurrentPlaylist); } private void OnPlaylistAdded(object? sender, PlaylistAddedEventArgs e) { - Playlists.Add(e.Playlist); + Playlists.Add(new PlaylistItemViewModel(e.Playlist)); } private void OnPlaylistRemoved(object? sender, PlaylistRemovedEventArgs e) { - Playlists.Remove(e.Playlist); + var playlistView = Playlists.FirstOrDefault(pv => pv.Playlist == e.Playlist); + + if (playlistView != null) + { + playlistView.Unsubscribe(); + Playlists.Remove(playlistView); + } } } \ No newline at end of file diff --git a/Harmonia.WinUI/Views/PlaylistsView.xaml b/Harmonia.WinUI/Views/PlaylistsView.xaml index 2c4bf17..3ff4cf9 100644 --- a/Harmonia.WinUI/Views/PlaylistsView.xaml +++ b/Harmonia.WinUI/Views/PlaylistsView.xaml @@ -12,13 +12,33 @@ d:DataContext="{d:DesignInstance Type=vm:PlaylistsViewModel, IsDesignTimeCreatable=True}" mc:Ignorable="d"> - - - - - - - + + + + + + + + + + + + + + + + + + + + +