From 3db5945cfd1fe35266ae8bb319c0de7fd1578a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Wed, 22 Feb 2023 16:50:50 +0100 Subject: [PATCH] Reloadable configuration, FontService (WIP) --- ...emManipulationUserCommandHandlerService.cs | 21 ++---------- src/FileTime.sln | 14 ++++++++ .../FileTime.GuiApp.Abstractions.csproj | 2 +- .../Avalonia/FileTime.GuiApp.App/App.axaml.cs | 7 ++-- .../FileTime.GuiApp.App.csproj | 11 +++--- .../Avalonia/FileTime.GuiApp.App/Startup.cs | 27 +++++++++++---- .../Configuration/FontConfiguration.cs | 9 +++++ .../FileTime.GuiApp.Font.Abstractions.csproj | 10 ++++++ .../Services/IFontService.cs | 7 ++++ .../FileTime.GuiApp.Font.csproj | 22 ++++++++++++ .../FileTime.GuiApp.Font/Font/Startup.cs | 16 +++++++++ .../Services/FontService.cs | 34 +++++++++++++++++++ .../FileTime.GuiApp/FileTime.GuiApp.csproj | 14 ++++---- .../FileTime.GuiApp/Resources/Styles.axaml | 2 +- .../ViewModels/IMainWindowViewModelBase.cs | 1 + .../ViewModels/MainWindowLoadingViewModel.cs | 3 ++ .../ViewModels/MainWindowViewModel.cs | 3 ++ .../FileTime.GuiApp/Views/MainWindow.axaml | 4 ++- 18 files changed, 166 insertions(+), 41 deletions(-) create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Configuration/FontConfiguration.cs create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/FileTime.GuiApp.Font.Abstractions.csproj create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Services/IFontService.cs create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font/FileTime.GuiApp.Font.csproj create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font/Font/Startup.cs create mode 100644 src/GuiApp/Avalonia/FileTime.GuiApp.Font/Services/FontService.cs diff --git a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs index 9a48128..ab8606b 100644 --- a/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs +++ b/src/AppCommon/FileTime.App.Core/Services/UserCommandHandler/ItemManipulationUserCommandHandlerService.cs @@ -103,28 +103,13 @@ public class ItemManipulationUserCommandHandlerService : UserCommandHandlerServi { await (command.PasteMode switch { - PasteMode.Merge => PasteMerge(), - PasteMode.Overwrite => PasteOverwrite(), - PasteMode.Skip => PasteSkip(), + PasteMode.Merge => Paste(TransportMode.Merge), + PasteMode.Overwrite => Paste(TransportMode.Overwrite), + PasteMode.Skip => Paste(TransportMode.Skip), _ => throw new ArgumentException($"Unknown {nameof(PasteMode)} value: {command.PasteMode}") }); } - private async Task PasteMerge() - { - await Paste(TransportMode.Merge); - } - - private async Task PasteOverwrite() - { - await Paste(TransportMode.Overwrite); - } - - private async Task PasteSkip() - { - await Paste(TransportMode.Skip); - } - private async Task Paste(TransportMode mode) { if (_clipboardService.CommandType is null) diff --git a/src/FileTime.sln b/src/FileTime.sln index bdded2f..a13ed42 100644 --- a/src/FileTime.sln +++ b/src/FileTime.sln @@ -59,6 +59,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.Core.ContentAccess EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.Core.CommandHandlers", "Core\FileTime.Core.CommandHandlers\FileTime.Core.CommandHandlers.csproj", "{9B161766-A672-4D59-B591-C68907905158}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.GuiApp.Font", "GuiApp\Avalonia\FileTime.GuiApp.Font\FileTime.GuiApp.Font.csproj", "{767F3868-11D0-445D-9B86-F81C7FCEB6FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileTime.GuiApp.Font.Abstractions", "GuiApp\Avalonia\FileTime.GuiApp.Font.Abstractions\FileTime.GuiApp.Font.Abstractions.csproj", "{2D07F149-106B-4644-9586-D6218F78D868}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -145,6 +149,14 @@ Global {9B161766-A672-4D59-B591-C68907905158}.Debug|Any CPU.Build.0 = Debug|Any CPU {9B161766-A672-4D59-B591-C68907905158}.Release|Any CPU.ActiveCfg = Release|Any CPU {9B161766-A672-4D59-B591-C68907905158}.Release|Any CPU.Build.0 = Release|Any CPU + {767F3868-11D0-445D-9B86-F81C7FCEB6FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {767F3868-11D0-445D-9B86-F81C7FCEB6FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {767F3868-11D0-445D-9B86-F81C7FCEB6FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {767F3868-11D0-445D-9B86-F81C7FCEB6FA}.Release|Any CPU.Build.0 = Release|Any CPU + {2D07F149-106B-4644-9586-D6218F78D868}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D07F149-106B-4644-9586-D6218F78D868}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D07F149-106B-4644-9586-D6218F78D868}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D07F149-106B-4644-9586-D6218F78D868}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -171,6 +183,8 @@ Global {2AC5CAFF-EBDA-4C6E-BCFF-304B651F2906} = {3324D046-1E05-46B5-B1BA-82910D56B332} {88BBB541-7306-44AE-95B1-0F8765AF1D4E} = {3324D046-1E05-46B5-B1BA-82910D56B332} {9B161766-A672-4D59-B591-C68907905158} = {3324D046-1E05-46B5-B1BA-82910D56B332} + {767F3868-11D0-445D-9B86-F81C7FCEB6FA} = {01F231DE-4A65-435F-B4BB-77EE5221890C} + {2D07F149-106B-4644-9586-D6218F78D868} = {01F231DE-4A65-435F-B4BB-77EE5221890C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {859FB3DF-C60A-46B1-82E5-90274905D1EF} diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/FileTime.GuiApp.Abstractions.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/FileTime.GuiApp.Abstractions.csproj index 6bfce82..5e01bcc 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/FileTime.GuiApp.Abstractions.csproj +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Abstractions/FileTime.GuiApp.Abstractions.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/App.axaml.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App/App.axaml.cs index 90b2d49..cd5b667 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/App.axaml.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/App.axaml.cs @@ -2,6 +2,7 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using FileTime.App.DependencyInjection; +using FileTime.GuiApp.Font; using FileTime.GuiApp.ViewModels; using FileTime.GuiApp.Views; using Microsoft.Extensions.DependencyInjection; @@ -13,9 +14,11 @@ public partial class App : Application { static App() { - DI.ServiceProvider ??= DependencyInjection + var configuration = Startup.CreateConfiguration(); + DI.ServiceProvider = DependencyInjection .RegisterDefaultServices() - .AddConfiguration() + .AddConfiguration(configuration) + .ConfigureFont(configuration) .RegisterLogging() .RegisterServices() .AddViewModels() diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/FileTime.GuiApp.App.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp.App/FileTime.GuiApp.App.csproj index 2b5c6f9..fe69962 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/FileTime.GuiApp.App.csproj +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/FileTime.GuiApp.App.csproj @@ -1,4 +1,4 @@ - + WinExe net7.0 @@ -25,11 +25,11 @@ - - + + - - + + @@ -42,6 +42,7 @@ + diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs index be486ef..bc0ca86 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.App/Startup.cs @@ -20,6 +20,25 @@ namespace FileTime.GuiApp.App; public static class Startup { + internal static IConfigurationRoot CreateConfiguration() + { + var configurationBuilder = new ConfigurationBuilder() + .AddInMemoryCollection(MainConfiguration.Configuration) + .AddJsonFile("appsettings.json", optional: true) + .AddJsonFile($"appsettings.{Program.EnvironmentName}.json", true); + + var configurationDirectory = new DirectoryInfo(Path.Combine(Program.AppDataRoot, "config")); + if (configurationDirectory.Exists) + { + foreach (var settingsFile in configurationDirectory.GetFiles("*.json")) + { + configurationBuilder.AddJsonFile(settingsFile.FullName, optional: true, reloadOnChange: true); + } + } + + return configurationBuilder.Build(); + } + internal static IServiceCollection AddViewModels(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); @@ -69,14 +88,8 @@ public static class Startup ); } - internal static IServiceCollection AddConfiguration(this IServiceCollection serviceCollection) + internal static IServiceCollection AddConfiguration(this IServiceCollection serviceCollection, IConfigurationRoot configuration) { - var configuration = new ConfigurationBuilder() - .AddInMemoryCollection(MainConfiguration.Configuration) - .AddJsonFile("appsettings.json", optional: true) - .AddJsonFile($"appsettings.{Program.EnvironmentName}.json", true) - .Build(); - return serviceCollection .Configure(configuration.GetSection(SectionNames.ProgramsSectionName)) .Configure(configuration.GetSection(SectionNames.KeybindingSectionName)) diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Configuration/FontConfiguration.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Configuration/FontConfiguration.cs new file mode 100644 index 0000000..6eea6c4 --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Configuration/FontConfiguration.cs @@ -0,0 +1,9 @@ +namespace FileTime.GuiApp.Configuration; + +public class FontConfiguration +{ + public const string SectionName = "Font"; + + public List Main { get; set; } = new(); + public List DateTime { get; set; } = new(); +} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/FileTime.GuiApp.Font.Abstractions.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/FileTime.GuiApp.Font.Abstractions.csproj new file mode 100644 index 0000000..f576b4f --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/FileTime.GuiApp.Font.Abstractions.csproj @@ -0,0 +1,10 @@ + + + + net7.0 + enable + enable + FileTime.GuiApp + + + diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Services/IFontService.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Services/IFontService.cs new file mode 100644 index 0000000..f37dc24 --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font.Abstractions/Services/IFontService.cs @@ -0,0 +1,7 @@ +namespace FileTime.GuiApp.Services; + +public interface IFontService +{ + IObservable MainFont { get; } + string? GetMainFont(); +} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font/FileTime.GuiApp.Font.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/FileTime.GuiApp.Font.csproj new file mode 100644 index 0000000..72e5064 --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/FileTime.GuiApp.Font.csproj @@ -0,0 +1,22 @@ + + + + net7.0 + enable + enable + FileTime.GuiApp + + + + + + + + + + + + + + + diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Font/Startup.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Font/Startup.cs new file mode 100644 index 0000000..5a016d3 --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Font/Startup.cs @@ -0,0 +1,16 @@ +using FileTime.GuiApp.Configuration; +using FileTime.GuiApp.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace FileTime.GuiApp.Font; + +public static class Startup +{ + public static IServiceCollection ConfigureFont(this IServiceCollection services, IConfigurationRoot configurationRoot) + { + services.Configure(configurationRoot.GetSection(FontConfiguration.SectionName)); + services.AddSingleton(); + return services; + } +} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Services/FontService.cs b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Services/FontService.cs new file mode 100644 index 0000000..42b9b4f --- /dev/null +++ b/src/GuiApp/Avalonia/FileTime.GuiApp.Font/Services/FontService.cs @@ -0,0 +1,34 @@ +using System.Reactive.Linq; +using System.Reactive.Subjects; +using Avalonia.Media; +using FileTime.GuiApp.Configuration; +using Microsoft.Extensions.Options; + +namespace FileTime.GuiApp.Services; + +public class FontService : IFontService +{ + private readonly IOptionsMonitor _fontConfiguration; + + private readonly BehaviorSubject _mainFont = new(null); + public IObservable MainFont => _mainFont.DistinctUntilChanged(); + + public FontService(IOptionsMonitor fontConfiguration) + { + _fontConfiguration = fontConfiguration; + fontConfiguration.OnChange(UpdateFonts); + + UpdateFonts(fontConfiguration.CurrentValue, null); + } + + private void UpdateFonts(FontConfiguration newConfiguration, string? arg2) + { + _mainFont.OnNext(GetMainFont()); + } + + public string? GetMainFont() + { + var installedFonts = FontManager.Current.GetInstalledFontFamilyNames().ToList(); + return _fontConfiguration.CurrentValue.Main.FirstOrDefault(f => installedFonts.Contains(f)); + } +} \ No newline at end of file diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj b/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj index 1d0f87b..72f088d 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/FileTime.GuiApp.csproj @@ -19,13 +19,14 @@ - - + + + - - - - + + + + @@ -40,6 +41,7 @@ + diff --git a/src/GuiApp/Avalonia/FileTime.GuiApp/Resources/Styles.axaml b/src/GuiApp/Avalonia/FileTime.GuiApp/Resources/Styles.axaml index 6b7ff84..8708c7a 100644 --- a/src/GuiApp/Avalonia/FileTime.GuiApp/Resources/Styles.axaml +++ b/src/GuiApp/Avalonia/FileTime.GuiApp/Resources/Styles.axaml @@ -9,7 +9,7 @@ - +