feat: Implement lyrics download feature.

This commit is contained in:
real-zony
2026-03-03 12:07:28 +08:00
parent 1f7414ead3
commit 4f4398acc8
10 changed files with 345 additions and 17 deletions

View File

@@ -0,0 +1,39 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ZonyLrcTools.Desktop.Views.Dialogs.ConfirmDialog"
Title=""
Width="400"
Height="200"
CanResize="False"
WindowStartupLocation="CenterOwner"
SizeToContent="Height">
<Grid Margin="24" RowDefinitions="Auto,*,Auto">
<!-- Title -->
<TextBlock Grid.Row="0"
x:Name="TitleText"
FontSize="16"
FontWeight="SemiBold"
Margin="0,0,0,12" />
<!-- Message -->
<TextBlock Grid.Row="1"
x:Name="MessageText"
TextWrapping="Wrap"
Margin="0,0,0,20" />
<!-- Buttons -->
<StackPanel Grid.Row="2"
Orientation="Horizontal"
HorizontalAlignment="Right"
Spacing="8">
<Button x:Name="CancelButton"
MinWidth="80"
Click="OnCancelClick" />
<Button x:Name="ConfirmButton"
MinWidth="80"
Classes="accent"
Click="OnConfirmClick" />
</StackPanel>
</Grid>
</Window>

View File

@@ -0,0 +1,35 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
using Microsoft.Extensions.DependencyInjection;
using ZonyLrcTools.Desktop.Infrastructure.Localization;
namespace ZonyLrcTools.Desktop.Views.Dialogs;
public partial class ConfirmDialog : Window
{
public ConfirmDialog()
{
InitializeComponent();
}
public ConfirmDialog(string title, string message) : this()
{
TitleText.Text = title;
MessageText.Text = message;
Title = title;
var localization = App.Services?.GetService<IUILocalizationService>();
ConfirmButton.Content = localization?["Common_OK"] ?? "OK";
CancelButton.Content = localization?["Common_Cancel"] ?? "Cancel";
}
private void OnConfirmClick(object? sender, RoutedEventArgs e)
{
Close(true);
}
private void OnCancelClick(object? sender, RoutedEventArgs e)
{
Close(false);
}
}

View File

@@ -0,0 +1,32 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ZonyLrcTools.Desktop.Views.Dialogs.MessageDialog"
Title=""
Width="400"
Height="200"
CanResize="False"
WindowStartupLocation="CenterOwner"
SizeToContent="Height">
<Grid Margin="24" RowDefinitions="Auto,*,Auto">
<!-- Title -->
<TextBlock Grid.Row="0"
x:Name="TitleText"
FontSize="16"
FontWeight="SemiBold"
Margin="0,0,0,12" />
<!-- Message -->
<TextBlock Grid.Row="1"
x:Name="MessageText"
TextWrapping="Wrap"
Margin="0,0,0,20" />
<!-- OK Button -->
<Button Grid.Row="2"
x:Name="OkButton"
HorizontalAlignment="Right"
MinWidth="80"
Click="OnOkClick" />
</Grid>
</Window>

View File

@@ -0,0 +1,29 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
using Microsoft.Extensions.DependencyInjection;
using ZonyLrcTools.Desktop.Infrastructure.Localization;
namespace ZonyLrcTools.Desktop.Views.Dialogs;
public partial class MessageDialog : Window
{
public MessageDialog()
{
InitializeComponent();
}
public MessageDialog(string title, string message) : this()
{
TitleText.Text = title;
MessageText.Text = message;
Title = title;
var localization = App.Services?.GetService<IUILocalizationService>();
OkButton.Content = localization?["Common_OK"] ?? "OK";
}
private void OnOkClick(object? sender, RoutedEventArgs e)
{
Close();
}
}

View File

@@ -1,6 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ZonyLrcTools.Desktop.ViewModels"
xmlns:loc="using:ZonyLrcTools.Desktop.Infrastructure.Localization"
x:Class="ZonyLrcTools.Desktop.Views.Pages.LyricsDownloadPage"
x:DataType="vm:LyricsDownloadViewModel">
@@ -56,6 +57,7 @@
<Button Command="{Binding StartDownloadCommand}"
Content="{Binding LyricsStartDownload}"
IsVisible="{Binding !IsDownloading}"
IsEnabled="{Binding CanStartDownload}"
Classes="accent"
MinWidth="100" />
<Button Command="{Binding CancelDownloadCommand}"
@@ -65,7 +67,21 @@
</StackPanel>
</Grid>
<!-- Progress Bar (visible during download) -->
<!-- Progress Bar: Scanning phase -->
<StackPanel IsVisible="{Binding IsScanning}" Spacing="8">
<ProgressBar Value="{Binding ScanProgressPercentage}"
Maximum="100"
Height="6" />
<TextBlock HorizontalAlignment="Center" FontSize="12" Opacity="0.8">
<Run Text="{Binding LyricsScanning}" />
<Run Text=" " />
<Run Text="{Binding ScanProgressCount}" />
<Run Text=" / " />
<Run Text="{Binding ScanTotalCount}" />
</TextBlock>
</StackPanel>
<!-- Progress Bar: Download phase -->
<StackPanel IsVisible="{Binding IsDownloading}" Spacing="8">
<ProgressBar Value="{Binding ProgressPercentage}"
Maximum="100"
@@ -90,20 +106,25 @@
GridLinesVisibility="Horizontal"
BorderThickness="0">
<DataGrid.Columns>
<DataGridTextColumn Header="{Binding ColumnSongName}"
<DataGridTextColumn x:DataType="vm:MusicFileViewModel"
Header="{loc:Localize Column_SongName}"
Binding="{Binding Name}"
Width="*" />
<DataGridTextColumn Header="{Binding ColumnArtist}"
<DataGridTextColumn x:DataType="vm:MusicFileViewModel"
Header="{loc:Localize Column_Artist}"
Binding="{Binding Artist}"
Width="150" />
<DataGridTextColumn Header="{Binding ColumnFilePath}"
<DataGridTextColumn x:DataType="vm:MusicFileViewModel"
Header="{loc:Localize Column_FilePath}"
Binding="{Binding FilePath}"
Width="250" />
<DataGridTextColumn Header="{Binding ColumnStatus}"
<DataGridTextColumn x:DataType="vm:MusicFileViewModel"
Header="{loc:Localize Column_Status}"
Binding="{Binding StatusMessage}"
Width="100" />
</DataGrid.Columns>
</DataGrid>
</Border>
<!-- Status Bar -->