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 @@
-
+