Reloadable configuration, FontService (WIP)

This commit is contained in:
2023-02-22 16:50:50 +01:00
parent d6022ee02c
commit 3db5945cfd
18 changed files with 166 additions and 41 deletions

View File

@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>FileTime.GuiApp</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\FileTime.GuiApp.Font.Abstractions\FileTime.GuiApp.Font.Abstractions.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.0.0-preview5" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
</ItemGroup>
</Project>

View File

@@ -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<FontConfiguration>(configurationRoot.GetSection(FontConfiguration.SectionName));
services.AddSingleton<IFontService, FontService>();
return services;
}
}

View File

@@ -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> _fontConfiguration;
private readonly BehaviorSubject<string?> _mainFont = new(null);
public IObservable<string?> MainFont => _mainFont.DistinctUntilChanged();
public FontService(IOptionsMonitor<FontConfiguration> 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));
}
}