From f95c40ca52e2af349dd06c1121b4aef7a1f98f4f Mon Sep 17 00:00:00 2001 From: real-zony Date: Tue, 3 Mar 2026 15:34:26 +0800 Subject: [PATCH] chore: fine-tune UI. --- src/ZonyLrcTools.Desktop/App.axaml | 26 +- .../Resources/UIStrings.en-US.resx | 22 +- .../Resources/UIStrings.resx | 22 +- .../Services/ServiceCollectionExtensions.cs | 12 +- .../ViewModels/AlbumDownloadViewModel.cs | 14 +- .../ViewModels/LyricsDownloadViewModel.cs | 15 +- .../Views/MainWindow.axaml | 141 ++++++++-- .../Views/Pages/AlbumDownloadPage.axaml | 244 +++++++++------- .../Views/Pages/HomePage.axaml | 6 +- .../Views/Pages/LyricsDownloadPage.axaml | 263 +++++++++++------- .../Views/Pages/SettingsPage.axaml | 16 +- 11 files changed, 526 insertions(+), 255 deletions(-) diff --git a/src/ZonyLrcTools.Desktop/App.axaml b/src/ZonyLrcTools.Desktop/App.axaml index 4cce6ce..afe9cbc 100644 --- a/src/ZonyLrcTools.Desktop/App.axaml +++ b/src/ZonyLrcTools.Desktop/App.axaml @@ -10,11 +10,26 @@ + + M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z + M12 3V13.55C11.41 13.21 10.73 13 10 13A4 4 0 0 0 6 17A4 4 0 0 0 10 21A4 4 0 0 0 14 17V7H18V3H12Z + M8.5 13.5L11 16.5L14.5 12L19 18H5M21 19V5C21 3.89 20.1 3 19 3H5C3.89 3 3 3.89 3 5V19C3 20.1 3.89 21 5 21H19C20.1 21 21 20.1 21 19Z + M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.04 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.04 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z + M9,2C7.95,2 6.95,2.16 6,2.46C10.06,3.73 13,7.5 13,12C13,16.5 10.06,20.27 6,21.54C6.95,21.84 7.95,22 9,22A10,10 0 0,0 19,12A10,10 0 0,0 9,2Z + M3.55 19.09L4.96 20.5L6.76 18.71L5.34 17.29M12 6C8.69 6 6 8.69 6 12S8.69 18 12 18 18 15.31 18 12 15.31 6 12 6M20 13H23V11H20M17.24 18.71L19.04 20.5L20.45 19.09L18.66 17.29M20.45 5.41L19.04 4L17.24 5.79L18.66 7.21M13 1H11V4H13M6.76 5.79L4.96 4L3.55 5.41L5.34 7.21L6.76 5.79M1 13H4V11H1M13 20H11V23H13Z + M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z + M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z + #FFFFFF - #0078D4 - #F3F3F3 + #0067C0 + #FAFAFA + #F3F3F3 + #FFFFFF + #E5E5E5 + #E8F1FF + #F9F9F9 #107C10 #D13438 #FFB900 @@ -22,7 +37,12 @@ #1F1F1F #60CDFF - #2D2D2D + #2A2A2A + #1F1F1F + #2D2D2D + #3A3A3A + #1A3A5C + #333333 #6CCB5F #FF99A4 #FCE100 diff --git a/src/ZonyLrcTools.Desktop/Resources/UIStrings.en-US.resx b/src/ZonyLrcTools.Desktop/Resources/UIStrings.en-US.resx index c50f557..7af86e1 100644 --- a/src/ZonyLrcTools.Desktop/Resources/UIStrings.en-US.resx +++ b/src/ZonyLrcTools.Desktop/Resources/UIStrings.en-US.resx @@ -73,16 +73,19 @@ Lyrics Download - Batch download lyrics for your music files + Batch download lyrics for your music files, with parallel processing and auto-skip + + + Music Folder - Select music folder... + Select a folder containing music files... Browse... - Parallel: + Parallel Tasks Start Download @@ -105,6 +108,9 @@ Download Complete + + No tasks yet, please select a folder to start scanning + Total: @@ -124,14 +130,17 @@ Download album artwork for your music collection + + Music Folder + - Select music folder... + Select a folder containing music files... Browse... - Parallel: + Parallel Tasks Start Download @@ -139,6 +148,9 @@ Stop Download + + No tasks yet, please select a folder to start scanning + Settings diff --git a/src/ZonyLrcTools.Desktop/Resources/UIStrings.resx b/src/ZonyLrcTools.Desktop/Resources/UIStrings.resx index 0a613bb..b07f28e 100644 --- a/src/ZonyLrcTools.Desktop/Resources/UIStrings.resx +++ b/src/ZonyLrcTools.Desktop/Resources/UIStrings.resx @@ -73,16 +73,19 @@ 歌词下载 - 批量下载音乐文件的歌词 + 批量下载音乐文件的歌词,支持并行处理与自动规避覆盖 + + + 音乐文件夹 - 选择音乐文件夹... + 请选择包含音乐文件的目录... 浏览... - 并行: + 并行任务数 开始下载 @@ -105,6 +108,9 @@ 下载完成 + + 暂无任务,请选择目录开始解析 + 总计: @@ -124,14 +130,17 @@ 批量下载音乐文件的专辑封面 + + 音乐文件夹 + - 选择音乐文件夹... + 请选择包含音乐文件的目录... 浏览... - 并行: + 并行任务数 开始下载 @@ -139,6 +148,9 @@ 停止下载 + + 暂无任务,请选择目录开始解析 + 设置 diff --git a/src/ZonyLrcTools.Desktop/Services/ServiceCollectionExtensions.cs b/src/ZonyLrcTools.Desktop/Services/ServiceCollectionExtensions.cs index 122768e..7f42578 100644 --- a/src/ZonyLrcTools.Desktop/Services/ServiceCollectionExtensions.cs +++ b/src/ZonyLrcTools.Desktop/Services/ServiceCollectionExtensions.cs @@ -39,12 +39,12 @@ public static class ServiceCollectionExtensions services.AddSingleton(); services.AddSingleton(); - // Register ViewModels - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + // Register ViewModels (Singleton to preserve state across navigation) + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); return services; } diff --git a/src/ZonyLrcTools.Desktop/ViewModels/AlbumDownloadViewModel.cs b/src/ZonyLrcTools.Desktop/ViewModels/AlbumDownloadViewModel.cs index 688b2b1..6e2b6a7 100644 --- a/src/ZonyLrcTools.Desktop/ViewModels/AlbumDownloadViewModel.cs +++ b/src/ZonyLrcTools.Desktop/ViewModels/AlbumDownloadViewModel.cs @@ -40,7 +40,8 @@ public partial class AlbumDownloadViewModel : ViewModelBase // Localized strings public string AlbumTitle => _localization?["Album_Title"] ?? "Album Cover Download"; public string AlbumDescription => _localization?["Album_Description"] ?? "Download album artwork for your music collection"; - public string AlbumSelectFolder => _localization?["Album_SelectFolder"] ?? "Select music folder..."; + public string AlbumFolderLabel => _localization?["Album_FolderLabel"] ?? "Music Folder"; + public string AlbumSelectFolder => _localization?["Album_SelectFolder"] ?? "Select a folder containing music files..."; public string AlbumBrowse => _localization?["Album_Browse"] ?? "Browse..."; public string AlbumParallel => _localization?["Album_Parallel"] ?? "Parallel:"; public string AlbumStartDownload => _localization?["Album_StartDownload"] ?? "Start Download"; @@ -55,6 +56,10 @@ public partial class AlbumDownloadViewModel : ViewModelBase public bool CanStartDownload => !IsDownloading && !string.IsNullOrEmpty(SelectedFolderPath); + public bool HasNoFiles => MusicFiles.Count == 0; + + public string EmptyStateText => _localization?["Album_EmptyState"] ?? "No tasks yet, please select a folder to start scanning"; + public ObservableCollection MusicFiles { get; } = new(); public AlbumDownloadViewModel( @@ -70,12 +75,18 @@ public partial class AlbumDownloadViewModel : ViewModelBase { _localization.LanguageChanged += OnLanguageChanged; } + + MusicFiles.CollectionChanged += (_, _) => + { + OnPropertyChanged(nameof(HasNoFiles)); + }; } private void OnLanguageChanged(object? sender, EventArgs e) { OnPropertyChanged(nameof(AlbumTitle)); OnPropertyChanged(nameof(AlbumDescription)); + OnPropertyChanged(nameof(AlbumFolderLabel)); OnPropertyChanged(nameof(AlbumSelectFolder)); OnPropertyChanged(nameof(AlbumBrowse)); OnPropertyChanged(nameof(AlbumParallel)); @@ -88,6 +99,7 @@ public partial class AlbumDownloadViewModel : ViewModelBase OnPropertyChanged(nameof(ColumnSongName)); OnPropertyChanged(nameof(ColumnArtist)); OnPropertyChanged(nameof(ColumnStatus)); + OnPropertyChanged(nameof(EmptyStateText)); } [RelayCommand] diff --git a/src/ZonyLrcTools.Desktop/ViewModels/LyricsDownloadViewModel.cs b/src/ZonyLrcTools.Desktop/ViewModels/LyricsDownloadViewModel.cs index bcfa179..c028dfb 100644 --- a/src/ZonyLrcTools.Desktop/ViewModels/LyricsDownloadViewModel.cs +++ b/src/ZonyLrcTools.Desktop/ViewModels/LyricsDownloadViewModel.cs @@ -71,7 +71,8 @@ public partial class LyricsDownloadViewModel : ViewModelBase // Localized strings public string LyricsTitle => _localization?["Lyrics_Title"] ?? "Lyrics Download"; public string LyricsDescription => _localization?["Lyrics_Description"] ?? "Batch download lyrics for your music files"; - public string LyricsSelectFolder => _localization?["Lyrics_SelectFolder"] ?? "Select music folder..."; + public string LyricsFolderLabel => _localization?["Lyrics_FolderLabel"] ?? "Music Folder"; + public string LyricsSelectFolder => _localization?["Lyrics_SelectFolder"] ?? "Select a folder containing music files..."; public string LyricsBrowse => _localization?["Lyrics_Browse"] ?? "Browse..."; public string LyricsParallel => _localization?["Lyrics_Parallel"] ?? "Parallel:"; public string LyricsStartDownload => _localization?["Lyrics_StartDownload"] ?? "Start Download"; @@ -88,6 +89,10 @@ public partial class LyricsDownloadViewModel : ViewModelBase public bool CanStartDownload => !IsDownloading && !IsScanning && MusicFiles.Count > 0; + public bool HasNoFiles => MusicFiles.Count == 0; + + public string EmptyStateText => _localization?["Lyrics_EmptyState"] ?? "No tasks yet, please select a folder to start scanning"; + public ObservableCollection MusicFiles { get; } = new(); public LyricsDownloadViewModel( @@ -109,12 +114,19 @@ public partial class LyricsDownloadViewModel : ViewModelBase { _localization.LanguageChanged += OnLanguageChanged; } + + MusicFiles.CollectionChanged += (_, _) => + { + OnPropertyChanged(nameof(HasNoFiles)); + OnPropertyChanged(nameof(CanStartDownload)); + }; } private void OnLanguageChanged(object? sender, EventArgs e) { OnPropertyChanged(nameof(LyricsTitle)); OnPropertyChanged(nameof(LyricsDescription)); + OnPropertyChanged(nameof(LyricsFolderLabel)); OnPropertyChanged(nameof(LyricsSelectFolder)); OnPropertyChanged(nameof(LyricsBrowse)); OnPropertyChanged(nameof(LyricsParallel)); @@ -129,6 +141,7 @@ public partial class LyricsDownloadViewModel : ViewModelBase OnPropertyChanged(nameof(ColumnArtist)); OnPropertyChanged(nameof(ColumnFilePath)); OnPropertyChanged(nameof(ColumnStatus)); + OnPropertyChanged(nameof(EmptyStateText)); } [RelayCommand(CanExecute = nameof(CanSelectFolder))] diff --git a/src/ZonyLrcTools.Desktop/Views/MainWindow.axaml b/src/ZonyLrcTools.Desktop/Views/MainWindow.axaml index d827c6f..ee46002 100644 --- a/src/ZonyLrcTools.Desktop/Views/MainWindow.axaml +++ b/src/ZonyLrcTools.Desktop/Views/MainWindow.axaml @@ -10,55 +10,146 @@ MinWidth="900" MinHeight="600" WindowStartupLocation="CenterScreen"> - + + + + + + + + + + - - - - + BorderBrush="{DynamicResource SeparatorBrush}" + BorderThickness="0,0,1,0"> + + + + + + + + + - - + - - + + + + + - + + + + + - + + + + + - + + + + + - + diff --git a/src/ZonyLrcTools.Desktop/Views/Pages/AlbumDownloadPage.axaml b/src/ZonyLrcTools.Desktop/Views/Pages/AlbumDownloadPage.axaml index 4db22c6..0cbb072 100644 --- a/src/ZonyLrcTools.Desktop/Views/Pages/AlbumDownloadPage.axaml +++ b/src/ZonyLrcTools.Desktop/Views/Pages/AlbumDownloadPage.axaml @@ -1,139 +1,193 @@ - + + FontSize="24" + FontWeight="Bold" /> - + - - - - - + +