using Harmonia.Core.Player; using Harmonia.Core.Playlists; using Microsoft.UI.Dispatching; using System; using System.Collections.ObjectModel; using System.Linq; namespace Harmonia.WinUI.ViewModels; public partial class PlaylistsViewModel : ViewModelBase { private readonly IPlaylistManager _playlistManager; private readonly IAudioPlayer _audioPlayer; private readonly DispatcherQueue _dispatcherQueue; private ObservableCollection _playlists = []; public ObservableCollection Playlists { get { return _playlists; } set { SetProperty(ref _playlists, value); } } private PlaylistItemViewModel? _selectedPlaylist = null; public PlaylistItemViewModel? SelectedPlaylist { get { return _selectedPlaylist; } set { if (SetProperty(ref _selectedPlaylist, value)) { _playlistManager.CurrentPlaylist = value?.Playlist; } } } private PlaylistItemViewModel? _activePlaylist = null; public PlaylistItemViewModel? ActivePlaylist { get { return _activePlaylist; } set { SetProperty(ref _activePlaylist, value); } } public PlaylistsViewModel(IPlaylistManager playlistManager, IAudioPlayer audioPlayer) { _playlistManager = playlistManager; _playlistManager.PlaylistAdded += OnPlaylistAdded; _playlistManager.PlaylistRemoved += OnPlaylistRemoved; _playlistManager.CurrentPlaylistChanged += OnCurrentPlaylistChanged; _audioPlayer = audioPlayer; _audioPlayer.PlayingSongChanged += OnPlayingSongChanged; _dispatcherQueue = DispatcherQueue.GetForCurrentThread(); _playlists = new ObservableCollection(_playlistManager.Playlists.Select(p => new PlaylistItemViewModel(p))); _selectedPlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _playlistManager.CurrentPlaylist); _activePlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _audioPlayer.Playlist); } private void OnCurrentPlaylistChanged(object? sender, EventArgs e) { SelectedPlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _playlistManager.CurrentPlaylist); } private void OnPlaylistAdded(object? sender, PlaylistAddedEventArgs e) { Playlists.Add(new PlaylistItemViewModel(e.Playlist)); } private void OnPlaylistRemoved(object? sender, PlaylistRemovedEventArgs e) { var playlistView = Playlists.FirstOrDefault(pv => pv.Playlist == e.Playlist); if (playlistView != null) { playlistView.Unsubscribe(); Playlists.Remove(playlistView); } } private void OnPlayingSongChanged(object? sender, PlayingSongChangedEventArgs e) { _dispatcherQueue.TryEnqueue(UpdateActivePlaylist); } private void UpdateActivePlaylist() { ActivePlaylist = Playlists.FirstOrDefault(pv => pv.Playlist == _audioPlayer.Playlist); } }