Added randomize/reverse songs logic. Added initial UI-side locking logic.

This commit is contained in:
2026-08-03 22:38:16 -04:00
parent 99978c62c4
commit 2b78ac5667
6 changed files with 240 additions and 18 deletions

View File

@@ -147,6 +147,11 @@ public partial class PlaylistDetailViewModel : ViewModelBase
public IAsyncRelayCommand DeletePlaylistCommand { get; }
public IRelayCommand<SortItem> SortAllCommand { get; }
public IRelayCommand<SortItem> SortSelectedCommand { get; }
public IRelayCommand RandomizeAllCommand { get; }
public IRelayCommand RandomizeSelectedCommand { get; }
public IRelayCommand ReverseAllCommand { get; }
public IRelayCommand ReverseSelectedCommand { get; }
public IRelayCommand ToggleLockCommand { get; }
public bool IsUserUpdating { get; set; }
private bool _isUserInitiatingSongChange;
@@ -195,6 +200,11 @@ public partial class PlaylistDetailViewModel : ViewModelBase
DeletePlaylistCommand = new AsyncRelayCommand(DeletePlaylistAsync);
SortAllCommand = new RelayCommand<SortItem>(SortAllSongs);
SortSelectedCommand = new RelayCommand<SortItem>(SortSelectedSongs, _ => AreMultipleSongsSelected());
RandomizeAllCommand = new RelayCommand(RandomizeAllSongs);
RandomizeSelectedCommand = new RelayCommand(RandomizeSelectedSongs, AreMultipleSongsSelected);
ReverseAllCommand = new RelayCommand(ReverseAllSongs);
ReverseSelectedCommand = new RelayCommand(ReverseSelectedSongs, AreMultipleSongsSelected);
ToggleLockCommand = new RelayCommand(ToggleLock);
FilteredPlaylistSongs.CollectionChanged += OnFilteredPlaylistSongsCollectionChanged;
@@ -211,6 +221,8 @@ public partial class PlaylistDetailViewModel : ViewModelBase
PasteSongsCommand.NotifyCanExecuteChanged();
OpenFileLocationCommand.NotifyCanExecuteChanged();
SortSelectedCommand.NotifyCanExecuteChanged();
RandomizeSelectedCommand.NotifyCanExecuteChanged();
ReverseSelectedCommand.NotifyCanExecuteChanged();
}
private void OnFilteredPlaylistSongsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
@@ -669,7 +681,75 @@ public partial class PlaylistDetailViewModel : ViewModelBase
if (SelectedPlaylistSongs.Count < 2)
return;
string[] selectedPlaylistSongIds = [.. SelectedPlaylistSongs.Select(x => x.UID)];
Playlist.SortSongs([.. SelectedPlaylistSongs], [.. sortItem.SortOptions]);
RestoreSelectedSongs(selectedPlaylistSongIds);
}
private void RestoreSelectedSongs(string[] playlistSongIds)
{
_dispatcherQueue.TryEnqueue(() =>
{
PlaylistSong[] selectedPlaylistSongs = [.. Playlist?.Songs.Where(x => playlistSongIds.Contains(x.UID)) ?? []];
SelectedPlaylistSongs = new ObservableCollection<PlaylistSong>(selectedPlaylistSongs);
});
}
private void RandomizeAllSongs()
{
if (Playlist == null || Playlist.Songs.Count < 2)
return;
Playlist.Randomize([.. Playlist.Songs]);
}
private void RandomizeSelectedSongs()
{
if (Playlist == null || SelectedPlaylistSongs.Count < 2)
return;
string[] selectedPlaylistSongIds = [.. SelectedPlaylistSongs.Select(x => x.UID)];
Playlist.Randomize([.. SelectedPlaylistSongs]);
RestoreSelectedSongs(selectedPlaylistSongIds);
}
private void ReverseAllSongs()
{
if (Playlist == null || Playlist.Songs.Count < 2)
return;
Playlist.Reverse([.. Playlist.Songs]);
}
private void ReverseSelectedSongs()
{
if (Playlist == null || SelectedPlaylistSongs.Count < 2)
return;
string[] selectedPlaylistSongIds = [.. SelectedPlaylistSongs.Select(x => x.UID)];
Playlist.Reverse([.. SelectedPlaylistSongs]);
RestoreSelectedSongs(selectedPlaylistSongIds);
}
private void ToggleLock()
{
if (Playlist == null)
return;
if (Playlist.IsLocked)
{
Playlist.Unlock();
}
else
{
Playlist.Lock();
}
}
#endregion