From b57739f543f95251b08157c933a5ab22a525b845 Mon Sep 17 00:00:00 2001 From: real-zony Date: Tue, 2 Jul 2024 10:43:23 +0800 Subject: [PATCH] feat: Completed the adjustments and bindings of global settings. --- Directory.Packages.props | 1 + src/ZonyLrcTools.Desktop/FodyWeavers.xml | 3 + .../Pages/SettingsPage.axaml | 25 ++-- .../Pages/SettingsPage.axaml.cs | 2 +- src/ZonyLrcTools.Desktop/Program.cs | 8 +- .../Settings/GlobalConfigurationViewModel.cs | 121 +++++++++--------- ...tingsViewModel.cs => SettingsViewModel.cs} | 8 +- .../ZonyLrcTools.Desktop.csproj | 1 + 8 files changed, 91 insertions(+), 78 deletions(-) create mode 100644 src/ZonyLrcTools.Desktop/FodyWeavers.xml rename src/ZonyLrcTools.Desktop/ViewModels/Settings/{LyricsSettingsViewModel.cs => SettingsViewModel.cs} (83%) 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 @@ +