diff --git a/Directory.Packages.props b/Directory.Packages.props
index c540c6b..1d79ff8 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -10,6 +10,7 @@
+
diff --git a/src/ZonyLrcTools.Desktop/FodyWeavers.xml b/src/ZonyLrcTools.Desktop/FodyWeavers.xml
new file mode 100644
index 0000000..63fc148
--- /dev/null
+++ b/src/ZonyLrcTools.Desktop/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml b/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml
index c531ed4..9a9ccd6 100644
--- a/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml
+++ b/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml
@@ -6,7 +6,8 @@
x:Class="ZonyLrcTools.Desktop.Pages.SettingsPage"
xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:settings="clr-namespace:ZonyLrcTools.Desktop.ViewModels.Settings"
- x:DataType="settings:LyricsSettingsViewModel">
+ x:DataType="settings:SettingsViewModel">
+
@@ -34,10 +35,13 @@
-
-
-
-
+
+
+
+
+
+
@@ -56,10 +60,13 @@
-
-
-
-
+
+
+
+
+
+
diff --git a/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml.cs b/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml.cs
index edc3e58..ac77946 100644
--- a/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml.cs
+++ b/src/ZonyLrcTools.Desktop/Pages/SettingsPage.axaml.cs
@@ -13,7 +13,7 @@ public partial class SettingsPage : UserControl
public SettingsPage()
{
InitializeComponent();
- DataContext = new LyricsSettingsViewModel(App.Current.Services.GetRequiredService>().Value);
+ DataContext = new SettingsViewModel(App.Current.Services.GetRequiredService>().Value);
}
private void OnGitHubClick(object? sender, RoutedEventArgs? eventArgs) => UrlHelper.OpenLink("https://github.com/real-zony/ZonyLrcToolsX");
diff --git a/src/ZonyLrcTools.Desktop/Program.cs b/src/ZonyLrcTools.Desktop/Program.cs
index 068c279..fbcdb38 100644
--- a/src/ZonyLrcTools.Desktop/Program.cs
+++ b/src/ZonyLrcTools.Desktop/Program.cs
@@ -1,6 +1,7 @@
using Avalonia;
using Avalonia.ReactiveUI;
using System;
+using System.Text;
namespace ZonyLrcTools.Desktop;
@@ -10,8 +11,11 @@ class Program
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
- public static void Main(string[] args) => BuildAvaloniaApp()
- .StartWithClassicDesktopLifetime(args);
+ public static void Main(string[] args)
+ {
+ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+ BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
+ }
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
diff --git a/src/ZonyLrcTools.Desktop/ViewModels/Settings/GlobalConfigurationViewModel.cs b/src/ZonyLrcTools.Desktop/ViewModels/Settings/GlobalConfigurationViewModel.cs
index e4d49cb..bdd54c7 100644
--- a/src/ZonyLrcTools.Desktop/ViewModels/Settings/GlobalConfigurationViewModel.cs
+++ b/src/ZonyLrcTools.Desktop/ViewModels/Settings/GlobalConfigurationViewModel.cs
@@ -1,3 +1,9 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using ReactiveUI;
+using ReactiveUI.Fody.Helpers;
using ZonyLrcTools.Common.Configuration;
namespace ZonyLrcTools.Desktop.ViewModels.Settings;
@@ -9,77 +15,68 @@ public class GlobalConfigurationViewModel : ViewModelBase
public GlobalConfigurationViewModel(GlobalLyricsConfigOptions config)
{
_config = config;
+ InitializeLineBreakComboBoxItem();
+
+ IsOneLine = _config.IsOneLine;
+ IsEnableTranslation = _config.IsEnableTranslation;
+ IsSkipExistLyricFiles = _config.IsSkipExistLyricFiles;
+ IsOnlyOutputTranslation = _config.IsOnlyOutputTranslation;
+
+ this.WhenAnyValue(x => x.IsOneLine)
+ .Subscribe(x => _config.IsOneLine = x);
+ this.WhenAnyValue(x => x.IsEnableTranslation)
+ .Subscribe(x => _config.IsEnableTranslation = x);
+ this.WhenAnyValue(x => x.IsSkipExistLyricFiles)
+ .Subscribe(x => _config.IsSkipExistLyricFiles = x);
+ this.WhenAnyValue(x => x.IsOnlyOutputTranslation)
+ .Subscribe(x => _config.IsOnlyOutputTranslation = x);
}
- public bool IsOneLine
+ [Reactive] public bool IsOneLine { get; set; }
+
+ [Reactive] public bool IsEnableTranslation { get; set; }
+
+ [Reactive] public bool IsSkipExistLyricFiles { get; set; }
+
+ [Reactive] public string FileEncoding { get; set; }
+
+ [Reactive] public bool IsOnlyOutputTranslation { get; set; }
+
+ private void InitializeLineBreakComboBoxItem()
{
- get => _config.IsOneLine;
- set
- {
- if (_config.IsOneLine != value)
- {
- _config.IsOneLine = value;
- }
- }
+ LineBreakOptions =
+ [
+ new TextComboboxItem { Name = "Windows", Value = "\r\n" },
+ new TextComboboxItem { Name = "Unix", Value = "\n" },
+ new TextComboboxItem { Name = "Mac", Value = "\r" }
+ ];
+ SelectedLineBreak = LineBreakOptions.FirstOrDefault(x => x.Value == _config.LineBreak)
+ ?? LineBreakOptions.First();
+
+ FileEncodingOptions = Encoding.GetEncodings()
+ .Select(x => new TextComboboxItem { Name = x.DisplayName, Value = x.Name })
+ .ToList();
+ FileEncodingOptions.Insert(0, new TextComboboxItem { Name = "UTF-8-BOM", Value = "utf-8-bom" });
+ SelectedFileEncoding = FileEncodingOptions.FirstOrDefault(x => x.Value == _config.FileEncoding)
+ ?? FileEncodingOptions.First();
+
+ this.WhenAnyValue(x => x.SelectedLineBreak)
+ .Subscribe(x => _config.LineBreak = x.Value);
+ this.WhenAnyValue(x => x.SelectedFileEncoding)
+ .Subscribe(x => _config.FileEncoding = x.Value);
}
- public string LineBreak
- {
- get => _config.LineBreak;
- set
- {
- if (_config.LineBreak != value)
- {
- _config.LineBreak = value;
- }
- }
- }
+ public List LineBreakOptions { get; private set; }
- public bool IsEnableTranslation
- {
- get => _config.IsEnableTranslation;
- set
- {
- if (_config.IsEnableTranslation != value)
- {
- _config.IsEnableTranslation = value;
- }
- }
- }
+ [Reactive] public TextComboboxItem SelectedLineBreak { get; set; }
- public bool IsSkipExistLyricFiles
- {
- get => _config.IsSkipExistLyricFiles;
- set
- {
- if (_config.IsSkipExistLyricFiles != value)
- {
- _config.IsSkipExistLyricFiles = value;
- }
- }
- }
+ public List FileEncodingOptions { get; private set; }
- public string FileEncoding
- {
- get => _config.FileEncoding;
- set
- {
- if (_config.FileEncoding != value)
- {
- _config.FileEncoding = value;
- }
- }
- }
+ [Reactive] public TextComboboxItem SelectedFileEncoding { get; set; }
- public bool IsOnlyOutputTranslation
+ public class TextComboboxItem
{
- get => _config.IsOnlyOutputTranslation;
- set
- {
- if (_config.IsOnlyOutputTranslation != value)
- {
- _config.IsOnlyOutputTranslation = value;
- }
- }
+ public string Name { get; set; } = default!;
+ public string Value { get; set; } = default!;
}
}
\ No newline at end of file
diff --git a/src/ZonyLrcTools.Desktop/ViewModels/Settings/LyricsSettingsViewModel.cs b/src/ZonyLrcTools.Desktop/ViewModels/Settings/SettingsViewModel.cs
similarity index 83%
rename from src/ZonyLrcTools.Desktop/ViewModels/Settings/LyricsSettingsViewModel.cs
rename to src/ZonyLrcTools.Desktop/ViewModels/Settings/SettingsViewModel.cs
index a8c967e..954b594 100644
--- a/src/ZonyLrcTools.Desktop/ViewModels/Settings/LyricsSettingsViewModel.cs
+++ b/src/ZonyLrcTools.Desktop/ViewModels/Settings/SettingsViewModel.cs
@@ -6,16 +6,16 @@ using ZonyLrcTools.Common.Configuration;
namespace ZonyLrcTools.Desktop.ViewModels.Settings;
-public class LyricsSettingsViewModel : ViewModelBase
+public class SettingsViewModel : ViewModelBase
{
private readonly GlobalOptions _globalOptions;
- public LyricsSettingsViewModel(GlobalOptions globalOptions)
+ public SettingsViewModel(GlobalOptions globalOptions)
{
_globalOptions = globalOptions;
+
Config = new GlobalConfigurationViewModel(globalOptions.Provider.Lyric.Config);
- Plugin = new ObservableCollection(
- globalOptions.Provider.Lyric.Plugin.Select(p => new LyricsProviderViewModel(p)));
+ Plugin = new ObservableCollection(globalOptions.Provider.Lyric.Plugin.Select(p => new LyricsProviderViewModel(p)));
Tag = new TagInfoViewModel(globalOptions.Provider.Tag);
BrowseBlockWordFileCommand = ReactiveCommand.Create(BrowseBlockWordFile);
}
diff --git a/src/ZonyLrcTools.Desktop/ZonyLrcTools.Desktop.csproj b/src/ZonyLrcTools.Desktop/ZonyLrcTools.Desktop.csproj
index 02c4d26..681e69e 100644
--- a/src/ZonyLrcTools.Desktop/ZonyLrcTools.Desktop.csproj
+++ b/src/ZonyLrcTools.Desktop/ZonyLrcTools.Desktop.csproj
@@ -23,6 +23,7 @@
+