diff --git a/Hyperbar.Windows.Primary/PrimaryWidget.cs b/Hyperbar.Windows.Primary/PrimaryWidget.cs index 0bed5af..ef6d59c 100644 --- a/Hyperbar.Windows.Primary/PrimaryWidget.cs +++ b/Hyperbar.Windows.Primary/PrimaryWidget.cs @@ -9,6 +9,17 @@ public class PrimaryWidget : WidgetBuilder.Configure(args => { args.Name = "Primary commands"; + args.Commands = + [ + new KeyAcceleratorCommandConfiguration + { + Id = Guid.NewGuid(), + Order = 0, + Text = "Test", + Icon = "dd", + Key = 1 + } + ]; }).ConfigureServices(services => { services.AddCache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration>() diff --git a/Hyperbar/Configuration/ConfigurationFactory.cs b/Hyperbar/Configuration/ConfigurationFactory.cs index 18f8238..11faf2a 100644 --- a/Hyperbar/Configuration/ConfigurationFactory.cs +++ b/Hyperbar/Configuration/ConfigurationFactory.cs @@ -5,5 +5,6 @@ public class ConfigurationFactory(Func factory) where TConfiguration : class { - public TConfiguration Create() => factory.Invoke(); + public object Create() => factory.Invoke(); + } diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index e7e5202..e7dd978 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -9,13 +9,21 @@ public class ConfigurationInitializer(IConfigurationMonitor(IConfigurationSource(IConfigurationFile Set(value); + + public void Set(object value) { lock (lockingObject) { diff --git a/Hyperbar/Configuration/ConfigurationWriter.cs b/Hyperbar/Configuration/ConfigurationWriter.cs index 2e20e1f..41b198e 100644 --- a/Hyperbar/Configuration/ConfigurationWriter.cs +++ b/Hyperbar/Configuration/ConfigurationWriter.cs @@ -14,8 +14,7 @@ public class ConfigurationWriter(IConfigurationSource source.Set(value); + + public void Write(TConfiguration value) => source.Set(value); } \ No newline at end of file diff --git a/Hyperbar/Configuration/IConfigurationFactory.cs b/Hyperbar/Configuration/IConfigurationFactory.cs index d85df86..33357c6 100644 --- a/Hyperbar/Configuration/IConfigurationFactory.cs +++ b/Hyperbar/Configuration/IConfigurationFactory.cs @@ -4,6 +4,6 @@ where TConfiguration : class { - TConfiguration Create(); + object Create(); } } \ No newline at end of file diff --git a/Hyperbar/Configuration/IConfigurationInitializer.cs b/Hyperbar/Configuration/IConfigurationInitializer.cs index 2bbd722..e4106ed 100644 --- a/Hyperbar/Configuration/IConfigurationInitializer.cs +++ b/Hyperbar/Configuration/IConfigurationInitializer.cs @@ -1,10 +1,8 @@ - -namespace Hyperbar +namespace Hyperbar; + +public interface IConfigurationInitializer + where TConfiguration : + class { - public interface IConfigurationInitializer - where TConfiguration : - class - { - Task InitializeAsync(); - } + Task InitializeAsync(); } \ No newline at end of file diff --git a/Hyperbar/Configuration/IConfigurationSource.cs b/Hyperbar/Configuration/IConfigurationSource.cs index 50fb7bd..a37c688 100644 --- a/Hyperbar/Configuration/IConfigurationSource.cs +++ b/Hyperbar/Configuration/IConfigurationSource.cs @@ -7,4 +7,6 @@ public interface IConfigurationSource bool TryGet(out TConfiguration? value); void Set(TConfiguration value); + + void Set(object value); } diff --git a/Hyperbar/Configuration/IConfigurationWriter.cs b/Hyperbar/Configuration/IConfigurationWriter.cs index 9d68b60..1ca5061 100644 --- a/Hyperbar/Configuration/IConfigurationWriter.cs +++ b/Hyperbar/Configuration/IConfigurationWriter.cs @@ -6,5 +6,7 @@ public interface IConfigurationWriter { void Write(Action updateDelegate); + void Write(object value); + void Write(TConfiguration value); } \ No newline at end of file diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index 70b735b..5e90198 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -9,28 +9,6 @@ namespace Hyperbar; public static class IServiceCollectionExtensions { - public static IServiceCollection AddDefault(this IServiceCollection services) - { - services.AddSingleton(provider => - new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); - - services.AddSingleton(); - services.AddSingleton>(provider => - new ProxyService(provider.GetRequiredService())); - - services.AddSingleton(); - - services.AddTransient(); - services.AddTransient, WidgetFactory>(); - - services.AddHandler(); - services.AddHandler(); - services.AddHandler(); - services.AddHandler(); - - return services; - } - public static IServiceCollection AddCache(this IServiceCollection services) where TKey : notnull @@ -53,21 +31,21 @@ public static class IServiceCollectionExtensions public static IServiceCollection AddConfiguration(this IServiceCollection services) where TConfiguration : - class => services.AddConfiguration(typeof(TConfiguration).Name, - "Settings.json", + class => services.AddConfiguration(typeof(TConfiguration).Name, + "Settings.json", null); public static IServiceCollection AddConfiguration(this IServiceCollection services, Action configurationDelegate) where TConfiguration : - class, + class, new() { TConfiguration configuration = new(); configurationDelegate.Invoke(configuration); - return services.AddConfiguration(typeof(TConfiguration).Name, - "Settings.json", + return services.AddConfiguration(typeof(TConfiguration).Name, + "Settings.json", configuration); } @@ -75,13 +53,13 @@ public static class IServiceCollectionExtensions TConfiguration configuration) where TConfiguration : class => services.AddConfiguration(configuration.GetType().Name, - "Settings.json", + "Settings.json", configuration); public static IServiceCollection AddConfiguration(this IServiceCollection services, object configuration) where TConfiguration : - class => services.AddConfiguration(configuration.GetType().Name, + class => services.AddConfiguration(configuration.GetType().Name, "Settings.json", (TConfiguration?)configuration); @@ -160,6 +138,27 @@ public static class IServiceCollectionExtensions return services; } + public static IServiceCollection AddDefault(this IServiceCollection services) + { + services.AddSingleton(provider => + new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); + + services.AddSingleton(); + services.AddSingleton>(provider => + new ProxyService(provider.GetRequiredService())); + + services.AddSingleton(); + + services.AddTransient(); + services.AddTransient, WidgetFactory>(); + + services.AddHandler(); + services.AddHandler(); + services.AddHandler(); + services.AddHandler(); + + return services; + } public static IServiceCollection AddHandler(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Transient) where THandler : @@ -203,8 +202,19 @@ public static class IServiceCollectionExtensions return services; } + public static IServiceCollection AddNotificationRelay(this IServiceCollection services) + where TFromNotification : + INotification + where TToNotification : + INotification, new() + { + return services.AddHandler>(); + } + public static IServiceCollection AddRange(this IServiceCollection services, - IServiceCollection fromServices) + IServiceCollection fromServices) { foreach (ServiceDescriptor service in fromServices) { diff --git a/Hyperbar/Mediators/Created.cs b/Hyperbar/Mediators/Created.cs index 192defe..d9c8cd6 100644 --- a/Hyperbar/Mediators/Created.cs +++ b/Hyperbar/Mediators/Created.cs @@ -1,3 +1,5 @@ -namespace Hyperbar; + +namespace Hyperbar; -public record Created(TValue Value, object? Target = null) : INotification; \ No newline at end of file +public record Created(TValue Value, object? Target = null) : + INotification; diff --git a/Hyperbar/Mediators/NotficationRelayHandler.cs b/Hyperbar/Mediators/NotficationRelayHandler.cs new file mode 100644 index 0000000..73f98f3 --- /dev/null +++ b/Hyperbar/Mediators/NotficationRelayHandler.cs @@ -0,0 +1,16 @@ + +namespace Hyperbar; + +public class NotficationRelayHandler(IMediator mediator) : + INotificationHandler, + IHandler + where TFromNotification : + INotification + where ToNotification : + INotification, new() +{ + private readonly IMediator mediator = mediator; + + public Task Handle(TFromNotification notification, CancellationToken cancellationToken) => + mediator.PublishAsync(cancellationToken); +} \ No newline at end of file diff --git a/Hyperbar/Widgets/WidgetBuilder.cs b/Hyperbar/Widgets/WidgetBuilder.cs index a4c7b4b..4b81259 100644 --- a/Hyperbar/Widgets/WidgetBuilder.cs +++ b/Hyperbar/Widgets/WidgetBuilder.cs @@ -28,13 +28,15 @@ public class WidgetBuilder(TConfiguration configuration) : services.AddScoped(); services.AddScoped(); + + services.AddSingleton, + Value>(); + services.AddHandler(); - services.AddSingleton, Value>(); - - //services.AddConfiguration(configuration); - services.AddConfiguration(section: configuration.GetType().Name, + services.AddConfiguration(section: configuration.GetType().Name, configuration: configuration); + services.AddConfiguration(configuration); }); public static IWidgetBuilder Configure(Action configurationDelegate) diff --git a/Hyperbar/Widgets/WidgetConfiguration.cs b/Hyperbar/Widgets/WidgetConfiguration.cs index ad8db72..5cd45e5 100644 --- a/Hyperbar/Widgets/WidgetConfiguration.cs +++ b/Hyperbar/Widgets/WidgetConfiguration.cs @@ -1,7 +1,6 @@ using System.Text.Json.Serialization; namespace Hyperbar; - public class WidgetConfiguration { public string? Description { get; set; } @@ -14,3 +13,5 @@ public class WidgetConfiguration [JsonInclude] internal bool IsAvailable { get; set; } } + +public class WidgetConfiguration; diff --git a/Hyperbar/Widgets/WidgetConfigurationChanged.cs b/Hyperbar/Widgets/WidgetConfigurationChanged.cs new file mode 100644 index 0000000..699b35e --- /dev/null +++ b/Hyperbar/Widgets/WidgetConfigurationChanged.cs @@ -0,0 +1,4 @@ + +namespace Hyperbar; + +public record WidgetConfigurationChanged : INotification; \ No newline at end of file diff --git a/Hyperbar/Widgets/WidgetHost.cs b/Hyperbar/Widgets/WidgetHost.cs index f7b33af..9e50e49 100644 --- a/Hyperbar/Widgets/WidgetHost.cs +++ b/Hyperbar/Widgets/WidgetHost.cs @@ -1,15 +1,16 @@ using Microsoft.Extensions.Hosting; namespace Hyperbar; + public class WidgetHost : INotificationHandler>, IWidgetHost { - private readonly IHost host; - private readonly IMediator mediator; - private readonly IEnumerable initializers; - private readonly IProxyService proxyMediator; private readonly IConfigurationInitializer configurationInitializer; + private readonly IHost host; + private readonly IEnumerable initializers; + private readonly IMediator mediator; + private readonly IProxyService proxyMediator; public WidgetHost(IHost host, IMediator mediator, @@ -28,19 +29,27 @@ public class WidgetHost : public IServiceProvider Services => host.Services; - public Task Handle(Changed notification, + public async Task Handle(Changed notification, CancellationToken cancellationToken) { - throw new NotImplementedException(); + if (notification.Value is WidgetAvailability widgetAvailability) + { + if (widgetAvailability.Value) + { + await StartAsync(); + } + } } - public async Task InitializeAsync() + public async Task InitializeAsync() => await configurationInitializer.InitializeAsync(); + + private async Task StartAsync() { - await configurationInitializer.InitializeAsync(); - //foreach (IInitializer initializer in initializers) - //{ - // await initializer.InitializeAsync(); - //} + foreach (IInitializer initializer in initializers) + { + await initializer.InitializeAsync(); + } + //if (proxyMediator.Proxy is IMediator mediator) //{