From 4edb0a7eb5fddf719f3f31f36620e4aec681d418 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Thu, 1 Feb 2024 22:13:45 +0000 Subject: [PATCH] WIP --- .../MediaControllerWidgetView.xaml | 5 ++-- .../PrimaryWidgetConfigurationHandler.cs | 4 ++-- .../IServiceCollectionExtensions.cs | 1 + .../WidgetAvailabilityChangedHandler.cs | 21 ++++++++++++++++ Hyperbar.Widget/WidgetBuilder.cs | 16 ++++++------- Hyperbar.Widget/WidgetConfiguration.cs | 2 +- Hyperbar.Widget/WidgetConfigurationChanged.cs | 4 ---- Hyperbar.Widget/WidgetConfigurationHandler.cs | 15 ++++++++---- Hyperbar.Widget/WidgetHost.cs | 14 +++++------ Hyperbar.Widget/WidgetHostHandler.cs | 15 +----------- Hyperbar.Widget/WidgetStartedHandler.cs | 20 ++++++++++++++++ .../Lifecycles/ConfigurationChangedHandler.cs | 4 ++-- .../Configuration/ConfigurationChanged.cs | 5 ---- .../Configuration/ConfigurationInitializer.cs | 7 ++++-- .../Configuration/ConfigurationMonitor.cs | 2 +- .../ConfigurationValueChangedNotification.cs | 24 +++++++++++++++++++ .../IConfigurationValueChangedNotification.cs | 6 +++++ .../IServiceCollectionExtensions.cs | 14 +++++++++++ Hyperbar/Lifecycles/IValue.cs | 9 ------- Hyperbar/Lifecycles/Value.cs | 21 ---------------- Hyperbar/Mediators/INotificationHandler.cs | 2 +- 21 files changed, 126 insertions(+), 85 deletions(-) create mode 100644 Hyperbar.Widget/WidgetAvailabilityChangedHandler.cs delete mode 100644 Hyperbar.Widget/WidgetConfigurationChanged.cs create mode 100644 Hyperbar.Widget/WidgetStartedHandler.cs delete mode 100644 Hyperbar/Configuration/ConfigurationChanged.cs create mode 100644 Hyperbar/Configuration/ConfigurationValueChangedNotification.cs create mode 100644 Hyperbar/Configuration/IConfigurationValueChangedNotification.cs delete mode 100644 Hyperbar/Lifecycles/IValue.cs delete mode 100644 Hyperbar/Lifecycles/Value.cs diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml index fe77d80..ed250e0 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml @@ -4,8 +4,9 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:windows="using:Hyperbar.UI.Windows"> - sfsdf + diff --git a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetConfigurationHandler.cs b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetConfigurationHandler.cs index 1136ed4..16ccf02 100644 --- a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetConfigurationHandler.cs +++ b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetConfigurationHandler.cs @@ -7,9 +7,9 @@ public class PrimaryWidgetConfigurationHandler(IMediator mediator, IFactory factory, IProvider provider, ICache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration> cache) : - INotificationHandler> + INotificationHandler> { - public async Task Handle(ConfigurationChanged notification, + public async Task Handle(Changed notification, CancellationToken cancellationToken) { List> items = []; diff --git a/Hyperbar.Widget/IServiceCollectionExtensions.cs b/Hyperbar.Widget/IServiceCollectionExtensions.cs index 9a971ec..81af667 100644 --- a/Hyperbar.Widget/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget/IServiceCollectionExtensions.cs @@ -13,6 +13,7 @@ public static class IServiceCollectionExtensions services.AddHandler(); services.AddHandler(); services.AddHandler(); + services.AddHandler(); return services; } diff --git a/Hyperbar.Widget/WidgetAvailabilityChangedHandler.cs b/Hyperbar.Widget/WidgetAvailabilityChangedHandler.cs new file mode 100644 index 0000000..8fa454d --- /dev/null +++ b/Hyperbar.Widget/WidgetAvailabilityChangedHandler.cs @@ -0,0 +1,21 @@ +namespace Hyperbar.Widget; + +public class WidgetAvailabilityChangedHandler(IWidgetHost host) : + INotificationHandler> +{ + public async Task Handle(Changed args, + CancellationToken cancellationToken) + { + if (args.Value is WidgetAvailability widgetAvailability) + { + if (widgetAvailability.Value) + { + await host.StartAsync(cancellationToken); + } + else + { + await host.StopAsync(cancellationToken); + } + } + } +} diff --git a/Hyperbar.Widget/WidgetBuilder.cs b/Hyperbar.Widget/WidgetBuilder.cs index ce455d0..3bb314a 100644 --- a/Hyperbar.Widget/WidgetBuilder.cs +++ b/Hyperbar.Widget/WidgetBuilder.cs @@ -25,13 +25,18 @@ public class WidgetBuilder : }) .ConfigureServices((context, services) => { - services.AddHostedService(); + services.AddSingleton(); services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); services.AddScoped(); services.AddScoped(); - services.AddSingleton, Value>(); + services.AddHandler(); + services.AddValueChangedNotification((config) => (args) => + { + args.Value = config.IsEnabled; + }); }); } @@ -40,9 +45,7 @@ public class WidgetBuilder : public IWidgetHost Build() { IHost host = hostBuilder.Build(); - - return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services, - typeof(WidgetHost), host); + return host.Services.GetRequiredService(); } public IWidgetBuilder UseConfiguration(Action configurationDelegate) @@ -56,7 +59,6 @@ public class WidgetBuilder : } configurationRegistered = true; - TConfiguration configuration = new(); configurationDelegate(configuration); @@ -88,7 +90,6 @@ public class WidgetBuilder : } viewModelTemplateRegistered = true; - hostBuilder.ConfigureServices(services => { services.AddWidgetTemplate(); @@ -107,7 +108,6 @@ public class WidgetBuilder : } viewModelTemplateRegistered = true; - hostBuilder.ConfigureServices(services => { services.AddWidgetTemplate(); diff --git a/Hyperbar.Widget/WidgetConfiguration.cs b/Hyperbar.Widget/WidgetConfiguration.cs index 118e7d6..7812342 100644 --- a/Hyperbar.Widget/WidgetConfiguration.cs +++ b/Hyperbar.Widget/WidgetConfiguration.cs @@ -11,7 +11,7 @@ public class WidgetConfiguration internal Guid Id { get; set; } = Guid.NewGuid(); [JsonInclude] - internal bool Enabled { get; set; } + internal bool IsEnabled { get; set; } } public class WidgetConfiguration; diff --git a/Hyperbar.Widget/WidgetConfigurationChanged.cs b/Hyperbar.Widget/WidgetConfigurationChanged.cs deleted file mode 100644 index d458cd6..0000000 --- a/Hyperbar.Widget/WidgetConfigurationChanged.cs +++ /dev/null @@ -1,4 +0,0 @@ - -namespace Hyperbar.Widget; - -public record WidgetConfigurationChanged : INotification; \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetConfigurationHandler.cs b/Hyperbar.Widget/WidgetConfigurationHandler.cs index 92fadda..7493954 100644 --- a/Hyperbar.Widget/WidgetConfigurationHandler.cs +++ b/Hyperbar.Widget/WidgetConfigurationHandler.cs @@ -1,14 +1,19 @@ namespace Hyperbar.Widget; -public class WidgetConfigurationHandler(IValue widgetAvailability) : - INotificationHandler> +public class WidgetConfigurationHandler(IEnumerable> + configurationValueChangedNotifications ) : + INotificationHandler> { - public async Task Handle(ConfigurationChanged notification, + public async Task Handle(Changed args, CancellationToken cancellationToken) { - if (notification.Configuration is WidgetConfiguration configuration) + if (args.Value is WidgetConfiguration configuration) { - await widgetAvailability.SetAsync(args => args with { Value = configuration.Enabled }); + foreach (IConfigurationValueChangedNotification notification in + configurationValueChangedNotifications) + { + await notification.PublishAsync(configuration); + } } } } diff --git a/Hyperbar.Widget/WidgetHost.cs b/Hyperbar.Widget/WidgetHost.cs index 05ba230..fb4095a 100644 --- a/Hyperbar.Widget/WidgetHost.cs +++ b/Hyperbar.Widget/WidgetHost.cs @@ -6,15 +6,15 @@ namespace Hyperbar.Widget; public sealed class WidgetHost : IWidgetHost { - private readonly IHost host; + private readonly IServiceProvider services; private readonly IMediator mediator; private readonly IProxyService proxyMediator; - public WidgetHost(IHost host, + public WidgetHost(IServiceProvider services, IMediator mediator, IProxyService proxyMediator) { - this.host = host; + this.services = services; this.mediator = mediator; this.proxyMediator = proxyMediator; @@ -24,7 +24,7 @@ public sealed class WidgetHost : public WidgetConfiguration Configuration => Services.GetRequiredService(); - public IServiceProvider Services => host.Services; + public IServiceProvider Services => services; public void Dispose() { @@ -33,8 +33,6 @@ public sealed class WidgetHost : public async Task StartAsync(CancellationToken cancellationToken = default) { - await host.StartAsync(cancellationToken); - if (proxyMediator.Proxy is IMediator mediator) { await mediator.PublishAsync(new Started(this), @@ -45,8 +43,8 @@ public sealed class WidgetHost : cancellationToken); } - public async Task StopAsync(CancellationToken cancellationToken = default) + public Task StopAsync(CancellationToken cancellationToken = default) { - await host.StopAsync(cancellationToken); + return Task.CompletedTask; } } \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetHostHandler.cs b/Hyperbar.Widget/WidgetHostHandler.cs index cc515e4..74edc18 100644 --- a/Hyperbar.Widget/WidgetHostHandler.cs +++ b/Hyperbar.Widget/WidgetHostHandler.cs @@ -2,22 +2,9 @@ namespace Hyperbar.Widget; -public class WidgetHostHandler(IMediator mediator) : +public class WidgetHostHandler : INotificationHandler> { - //public async Task Handle(Started notification, - // CancellationToken cancellationToken) - //{ - // if (notification.Value is IWidgetHost host) - // { - // if (host.Services.GetService() is IWidgetViewModel viewModel) - // { - // await mediator.PublishAsync(new Created(viewModel), - // nameof(WidgetViewModel), cancellationToken); - // } - // } - //} - public async Task Handle(Created notification, CancellationToken cancellationToken) { diff --git a/Hyperbar.Widget/WidgetStartedHandler.cs b/Hyperbar.Widget/WidgetStartedHandler.cs new file mode 100644 index 0000000..338d20a --- /dev/null +++ b/Hyperbar.Widget/WidgetStartedHandler.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Hyperbar.Widget; + +public class WidgetStartedHandler(IMediator mediator) : + INotificationHandler> +{ + public async Task Handle(Started notification, + CancellationToken cancellationToken) + { + if (notification.Value is IWidgetHost host) + { + if (host.Services.GetService() is IWidgetViewModel viewModel) + { + await mediator.PublishAsync(new Created(viewModel), + nameof(WidgetViewModel), cancellationToken); + } + } + } +} diff --git a/Hyperbar.Windows/Lifecycles/ConfigurationChangedHandler.cs b/Hyperbar.Windows/Lifecycles/ConfigurationChangedHandler.cs index f20784c..a128ec9 100644 --- a/Hyperbar.Windows/Lifecycles/ConfigurationChangedHandler.cs +++ b/Hyperbar.Windows/Lifecycles/ConfigurationChangedHandler.cs @@ -4,9 +4,9 @@ namespace Hyperbar.Windows; public class AppConfigurationChangedHandler(DesktopBar desktopFlyout, AppConfiguration configuration) : - INotificationHandler> + INotificationHandler> { - public Task Handle(ConfigurationChanged notification, CancellationToken cancellationToken) + public Task Handle(Changed notification, CancellationToken cancellationToken) { desktopFlyout.Placement = configuration.Placement; return Task.CompletedTask; diff --git a/Hyperbar/Configuration/ConfigurationChanged.cs b/Hyperbar/Configuration/ConfigurationChanged.cs deleted file mode 100644 index a670958..0000000 --- a/Hyperbar/Configuration/ConfigurationChanged.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Hyperbar; - -public record ConfigurationChanged(TConfiguration Configuration) : INotification - where TConfiguration : - class; diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index 03238ce..6b24928 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -1,6 +1,7 @@ namespace Hyperbar; -public class ConfigurationInitializer(IConfigurationMonitor monitor, +public class ConfigurationInitializer(IMediator mediator, + IConfigurationMonitor monitor, IConfigurationReader reader, IConfigurationWriter writer, IConfigurationFactory factory) : @@ -11,14 +12,16 @@ public class ConfigurationInitializer(IConfigurationMonitor(configuration)); await monitor.InitializeAsync(); } } diff --git a/Hyperbar/Configuration/ConfigurationMonitor.cs b/Hyperbar/Configuration/ConfigurationMonitor.cs index 29f61e8..bff11ca 100644 --- a/Hyperbar/Configuration/ConfigurationMonitor.cs +++ b/Hyperbar/Configuration/ConfigurationMonitor.cs @@ -16,7 +16,7 @@ public class ConfigurationMonitor(IConfigurationFile(configuration)); + await mediator.PublishAsync(new Changed(configuration)); } } diff --git a/Hyperbar/Configuration/ConfigurationValueChangedNotification.cs b/Hyperbar/Configuration/ConfigurationValueChangedNotification.cs new file mode 100644 index 0000000..fa351e3 --- /dev/null +++ b/Hyperbar/Configuration/ConfigurationValueChangedNotification.cs @@ -0,0 +1,24 @@ +namespace Hyperbar; + +public class ConfigurationValueChangedNotification(IMediator mediator, + Func> factory) : + IConfigurationValueChangedNotification + where TConfiguration : + class + where TValue : + class, new() +{ + private TValue? value; + + public async Task PublishAsync(TConfiguration configuration) + { + TValue newValue = new(); + factory(configuration).Invoke(newValue); + + if (value is null || !value.Equals(newValue)) + { + value = newValue; + await mediator.PublishAsync(new Changed(value)); + } + } +} diff --git a/Hyperbar/Configuration/IConfigurationValueChangedNotification.cs b/Hyperbar/Configuration/IConfigurationValueChangedNotification.cs new file mode 100644 index 0000000..9a6bdae --- /dev/null +++ b/Hyperbar/Configuration/IConfigurationValueChangedNotification.cs @@ -0,0 +1,6 @@ +namespace Hyperbar; + +public interface IConfigurationValueChangedNotification +{ + Task PublishAsync(TConfiguration configuration); +} diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index eaa9236..cfd9afe 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -9,6 +9,20 @@ namespace Hyperbar; public static class IServiceCollectionExtensions { + public static IServiceCollection AddValueChangedNotification(this IServiceCollection services, + Func> factory) + where TConfiguration : + class + where TValue : + class, new() + { + services.AddSingleton>(provider => + new ConfigurationValueChangedNotification(provider.GetRequiredService(), + factory)); + + return services; + } + public static IServiceCollection AddCache(this IServiceCollection services) where TKey : notnull diff --git a/Hyperbar/Lifecycles/IValue.cs b/Hyperbar/Lifecycles/IValue.cs deleted file mode 100644 index 09394d5..0000000 --- a/Hyperbar/Lifecycles/IValue.cs +++ /dev/null @@ -1,9 +0,0 @@ - -namespace Hyperbar; - -public interface IValue - where TValue : - notnull, new() -{ - Task SetAsync(Func updateDelgate); -} diff --git a/Hyperbar/Lifecycles/Value.cs b/Hyperbar/Lifecycles/Value.cs deleted file mode 100644 index 785e979..0000000 --- a/Hyperbar/Lifecycles/Value.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Hyperbar; - -public class Value(IMediator mediator) : - IValue - where TValue : - notnull, new () -{ - private TValue? current; - - public async Task SetAsync(Func updateDelgate) - { - if (updateDelgate.Invoke(current ?? new TValue()) is TValue value) - { - if (current is null || !value.Equals(current)) - { - current = value; - await mediator.PublishAsync(new Changed(current)); - } - } - } -} diff --git a/Hyperbar/Mediators/INotificationHandler.cs b/Hyperbar/Mediators/INotificationHandler.cs index 75980ad..5a745ec 100644 --- a/Hyperbar/Mediators/INotificationHandler.cs +++ b/Hyperbar/Mediators/INotificationHandler.cs @@ -5,6 +5,6 @@ public interface INotificationHandler : where TNotification : INotification { - Task Handle(TNotification notification, + Task Handle(TNotification args, CancellationToken cancellationToken); } \ No newline at end of file