From cd6f9c382e46bcbade1b27d66d16a2f71223dc74 Mon Sep 17 00:00:00 2001 From: Brian Bicknell Date: Mon, 3 Aug 2026 23:49:21 -0400 Subject: [PATCH] Added playlist renaming functionality. --- Harmonia.Core/Playlists/Playlist.cs | 18 +++++++++ .../Playlists/PlaylistUpdateAction.cs | 1 + Harmonia.WinUI/Messaging/IMessageService.cs | 1 + .../Messaging/WindowsMessageService.cs | 40 +++++++++++++++++++ .../ViewModels/PlaylistDetailViewModel.cs | 18 +++++++++ .../ViewModels/PlaylistItemViewModel.cs | 15 +++++++ Harmonia.WinUI/Views/PlaylistDetailView.xaml | 3 ++ Harmonia.WinUI/Views/PlaylistsView.xaml | 2 +- 8 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Harmonia.Core/Playlists/Playlist.cs b/Harmonia.Core/Playlists/Playlist.cs index 2f6cc8e..45aaa32 100644 --- a/Harmonia.Core/Playlists/Playlist.cs +++ b/Harmonia.Core/Playlists/Playlist.cs @@ -14,6 +14,24 @@ public class Playlist public event EventHandler? PlaylistUpdated; + public void SetName(string name) + { + if (string.Equals(Name, name, StringComparison.Ordinal)) + return; + + Name = name; + + PlaylistUpdatedEventArgs eventArgs = new() + { + Action = PlaylistUpdateAction.Rename, + Index = -1, + Count = 0, + Songs = [] + }; + + PlaylistUpdated?.Invoke(this, eventArgs); + } + public void Lock() { if (IsLocked) diff --git a/Harmonia.Core/Playlists/PlaylistUpdateAction.cs b/Harmonia.Core/Playlists/PlaylistUpdateAction.cs index 6df5e11..993b711 100644 --- a/Harmonia.Core/Playlists/PlaylistUpdateAction.cs +++ b/Harmonia.Core/Playlists/PlaylistUpdateAction.cs @@ -22,6 +22,7 @@ public enum PlaylistUpdateAction /// The tags of the songs in the collection were refreshed. /// Refresh, + Rename, Lock, Unlock } \ No newline at end of file diff --git a/Harmonia.WinUI/Messaging/IMessageService.cs b/Harmonia.WinUI/Messaging/IMessageService.cs index 1e42148..70ae6ae 100644 --- a/Harmonia.WinUI/Messaging/IMessageService.cs +++ b/Harmonia.WinUI/Messaging/IMessageService.cs @@ -5,4 +5,5 @@ namespace Harmonia.WinUI.Messaging; public interface IMessageService { Task ConfirmAsync(string title, string message); + Task InputTextAsync(string title, string message, string defaultText = ""); } \ No newline at end of file diff --git a/Harmonia.WinUI/Messaging/WindowsMessageService.cs b/Harmonia.WinUI/Messaging/WindowsMessageService.cs index 4cd86f5..74ae253 100644 --- a/Harmonia.WinUI/Messaging/WindowsMessageService.cs +++ b/Harmonia.WinUI/Messaging/WindowsMessageService.cs @@ -27,4 +27,44 @@ public class WindowsMessageService : IMessageService return result == ContentDialogResult.Primary; } + + public async Task InputTextAsync(string title, string message, string defaultText = "") + { + TextBox inputTextBox = new() + { + Text = defaultText, + Margin = new Thickness(0, 10, 0, 0) + }; + + inputTextBox.SelectAll(); + + ContentDialog dialog = new() + { + XamlRoot = MainWindow.Content.XamlRoot, + Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style, + Title = title, + Content = new StackPanel + { + Children = + { + new TextBlock { Text = message }, + inputTextBox + } + }, + PrimaryButtonText = "OK", + CloseButtonText = "Cancel", + DefaultButton = ContentDialogButton.Primary + }; + + ContentDialogResult result = await dialog.ShowAsync(); + + if (result == ContentDialogResult.Primary) + { + return inputTextBox.Text; + } + else + { + return string.Empty; + } + } } \ No newline at end of file diff --git a/Harmonia.WinUI/ViewModels/PlaylistDetailViewModel.cs b/Harmonia.WinUI/ViewModels/PlaylistDetailViewModel.cs index 6c6cdaa..a371f7a 100644 --- a/Harmonia.WinUI/ViewModels/PlaylistDetailViewModel.cs +++ b/Harmonia.WinUI/ViewModels/PlaylistDetailViewModel.cs @@ -158,6 +158,7 @@ public partial class PlaylistDetailViewModel : ViewModelBase public IRelayCommand RandomizeSelectedCommand { get; } public IRelayCommand ReverseAllCommand { get; } public IRelayCommand ReverseSelectedCommand { get; } + public IAsyncRelayCommand RenamePlaylistCommand { get; } public IRelayCommand LockPlaylistCommand { get; } public IRelayCommand UnlockPlaylistCommand { get; } @@ -212,6 +213,7 @@ public partial class PlaylistDetailViewModel : ViewModelBase RandomizeSelectedCommand = new RelayCommand(RandomizeSelectedSongs, AreMultipleSongsSelected); ReverseAllCommand = new RelayCommand(ReverseAllSongs); ReverseSelectedCommand = new RelayCommand(ReverseSelectedSongs, AreMultipleSongsSelected); + RenamePlaylistCommand = new AsyncRelayCommand(RenamePlaylist); LockPlaylistCommand = new RelayCommand(LockPlaylist); UnlockPlaylistCommand = new RelayCommand(UnlockPlaylist); @@ -762,6 +764,22 @@ public partial class PlaylistDetailViewModel : ViewModelBase Playlist?.Unlock(); } + private async Task RenamePlaylist() + { + if (Playlist == null) + return; + + string newName = await _messageService.InputTextAsync( + $"Rename Playlist - {Playlist.Name}", + "Enter a new name for the playlist:", + Playlist.Name ?? string.Empty); + + if (string.IsNullOrWhiteSpace(newName)) + return; + + Playlist.SetName(newName); + } + #endregion } diff --git a/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs b/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs index 7742926..0862036 100644 --- a/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs +++ b/Harmonia.WinUI/ViewModels/PlaylistItemViewModel.cs @@ -9,6 +9,19 @@ public partial class PlaylistItemViewModel : ObservableObject { public Playlist Playlist { get; private set; } + private string _name = string.Empty; + public string Name + { + get + { + return _name; + } + set + { + SetProperty(ref _name, value); + } + } + private string _summary = string.Empty; public string Summary { @@ -41,6 +54,8 @@ public partial class PlaylistItemViewModel : ObservableObject private void UpdateMetaData() { + Name = Playlist.Name ?? "Untitled Playlist"; + TimeSpan total = TimeSpan.FromSeconds(Playlist.Songs.Sum(s => s.Song.Length.TotalSeconds)); Summary = $"{Playlist.Songs.Count} songs / {total:h\\:mm\\:ss}"; } diff --git a/Harmonia.WinUI/Views/PlaylistDetailView.xaml b/Harmonia.WinUI/Views/PlaylistDetailView.xaml index e9259ea..cbf1684 100644 --- a/Harmonia.WinUI/Views/PlaylistDetailView.xaml +++ b/Harmonia.WinUI/Views/PlaylistDetailView.xaml @@ -172,6 +172,9 @@ + + + diff --git a/Harmonia.WinUI/Views/PlaylistsView.xaml b/Harmonia.WinUI/Views/PlaylistsView.xaml index 3ff4cf9..6d130d2 100644 --- a/Harmonia.WinUI/Views/PlaylistsView.xaml +++ b/Harmonia.WinUI/Views/PlaylistsView.xaml @@ -33,7 +33,7 @@ - +