104 lines
3.0 KiB
C#
104 lines
3.0 KiB
C#
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<PlaylistItemViewModel> _playlists = [];
|
|
public ObservableCollection<PlaylistItemViewModel> 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<PlaylistItemViewModel>(_playlistManager.Playlists.Select(p => new PlaylistItemViewModel(p)));
|
|
_selectedPlaylist = _playlists.FirstOrDefault(pv => pv.Playlist == _playlistManager.CurrentPlaylist);
|
|
}
|
|
|
|
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);
|
|
}
|
|
} |