diff --git a/Hyperbar.Windows.Contextual/ContextualWidget.cs b/Hyperbar.Windows.Contextual/ContextualWidget.cs index 998c998..4d7cf52 100644 --- a/Hyperbar.Windows.Contextual/ContextualWidget.cs +++ b/Hyperbar.Windows.Contextual/ContextualWidget.cs @@ -1,5 +1,3 @@ -using Hyperbar.Widgets; - namespace Hyperbar.Widget.Contextual; public class ContextualWidget : diff --git a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs index ce16f46..3f0ee59 100644 --- a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs +++ b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidget.cs @@ -1,4 +1,3 @@ -using Hyperbar.Widgets; using Microsoft.Extensions.DependencyInjection; using Windows.Media.Control; diff --git a/Hyperbar.Windows.Primary/PrimaryWidget.cs b/Hyperbar.Windows.Primary/PrimaryWidget.cs index 9ef738d..0bed5af 100644 --- a/Hyperbar.Windows.Primary/PrimaryWidget.cs +++ b/Hyperbar.Windows.Primary/PrimaryWidget.cs @@ -1,4 +1,3 @@ -using Hyperbar.Widgets; using Microsoft.Extensions.DependencyInjection; namespace Hyperbar.Windows.Primary; diff --git a/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationHandler.cs b/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationHandler.cs index 0a6e2a2..3f6bf47 100644 --- a/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationHandler.cs +++ b/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationHandler.cs @@ -42,11 +42,9 @@ public class PrimaryWidgetConfigurationHandler(IMediator mediator, if (moved.Value is PrimaryCommandConfiguration configuration && provider.Get(configuration) is IWidgetComponentViewModel viewModel) { - await mediator.PublishAsync( - new Moved(configuration.Order, viewModel), + await mediator.PublishAsync(new Moved(configuration.Order, viewModel), moved.Key.ParentId == Guid.Empty ? nameof(PrimaryWidgetViewModel) : moved.Key.ParentId, - cancellationToken - ); + cancellationToken); cache.Remove(moved.Key); cache.Add(moved.Key, moved.Value); diff --git a/Hyperbar/Configuration/ConfigurationInitializer.cs b/Hyperbar/Configuration/ConfigurationInitializer.cs index 44a1ba4..e7e5202 100644 --- a/Hyperbar/Configuration/ConfigurationInitializer.cs +++ b/Hyperbar/Configuration/ConfigurationInitializer.cs @@ -1,6 +1,7 @@ namespace Hyperbar; -public class ConfigurationInitializer(IConfigurationReader reader, +public class ConfigurationInitializer(IConfigurationMonitor monitor, + IConfigurationReader reader, IConfigurationWriter writer, IConfigurationFactory factory) : IConfigurationInitializer, @@ -8,7 +9,7 @@ public class ConfigurationInitializer(IConfigurationReader(IConfigurationReader(IConfigurationFile configurationFile, IConfigurationReader reader, - IMediator mediator) : IInitializer + IMediator mediator) : + IConfigurationMonitor where TConfiguration : class { diff --git a/Hyperbar/Configuration/IConfigurationFactory.cs b/Hyperbar/Configuration/IConfigurationFactory.cs index 43988f4..d85df86 100644 --- a/Hyperbar/Configuration/IConfigurationFactory.cs +++ b/Hyperbar/Configuration/IConfigurationFactory.cs @@ -1,6 +1,8 @@ namespace Hyperbar { - public interface IConfigurationFactory where TConfiguration : class + public interface IConfigurationFactory + where TConfiguration : + class { TConfiguration Create(); } diff --git a/Hyperbar/Configuration/IConfigurationMonitor.cs b/Hyperbar/Configuration/IConfigurationMonitor.cs new file mode 100644 index 0000000..d2fb2f1 --- /dev/null +++ b/Hyperbar/Configuration/IConfigurationMonitor.cs @@ -0,0 +1,7 @@ + +namespace Hyperbar; + +public interface IConfigurationMonitor : + IInitializer + where TConfiguration : + class; \ No newline at end of file diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index 5b562b4..70b735b 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -118,13 +118,12 @@ public static class IServiceCollectionExtensions return new ConfigurationFile(fileInfo); }); - services.AddSingleton>(); - + services.AddSingleton, ConfigurationMonitor>(); services.AddSingleton, ConfigurationReader>(); services.AddSingleton, ConfigurationWriter>(); - services.AddTransient>(provider => new ConfigurationFactory(() => - (TConfiguration)(configuration ?? provider.GetRequiredService()))); + services.AddTransient>(provider => new ConfigurationFactory(() => + configuration ?? provider.GetRequiredService())); services.AddTransient>(); services.AddTransient, ConfigurationInitializer>(); diff --git a/Hyperbar/Lifecycles/IValue.cs b/Hyperbar/Lifecycles/IValue.cs new file mode 100644 index 0000000..09394d5 --- /dev/null +++ b/Hyperbar/Lifecycles/IValue.cs @@ -0,0 +1,9 @@ + +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 new file mode 100644 index 0000000..785e979 --- /dev/null +++ b/Hyperbar/Lifecycles/Value.cs @@ -0,0 +1,21 @@ +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/Widgets/WidgetAvailability.cs b/Hyperbar/Widgets/WidgetAvailability.cs new file mode 100644 index 0000000..a1bb444 --- /dev/null +++ b/Hyperbar/Widgets/WidgetAvailability.cs @@ -0,0 +1,6 @@ +namespace Hyperbar; + +public record WidgetAvailability +{ + public bool Value { get; set; } +} diff --git a/Hyperbar/Widgets/WidgetBuilder.cs b/Hyperbar/Widgets/WidgetBuilder.cs index f2665d3..a4c7b4b 100644 --- a/Hyperbar/Widgets/WidgetBuilder.cs +++ b/Hyperbar/Widgets/WidgetBuilder.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Reflection; -namespace Hyperbar.Widgets; +namespace Hyperbar; public class WidgetBuilder(TConfiguration configuration) : IWidgetBuilder @@ -30,6 +30,8 @@ public class WidgetBuilder(TConfiguration configuration) : services.AddScoped(); services.AddHandler(); + services.AddSingleton, Value>(); + //services.AddConfiguration(configuration); services.AddConfiguration(section: configuration.GetType().Name, configuration: configuration); diff --git a/Hyperbar/Widgets/WidgetConfigurationHandler.cs b/Hyperbar/Widgets/WidgetConfigurationHandler.cs index 297bd0d..ff3764f 100644 --- a/Hyperbar/Widgets/WidgetConfigurationHandler.cs +++ b/Hyperbar/Widgets/WidgetConfigurationHandler.cs @@ -1,11 +1,14 @@ namespace Hyperbar; -public class WidgetConfigurationHandler : +public class WidgetConfigurationHandler(IValue widgetAvailability) : INotificationHandler> { - public Task Handle(ConfigurationChanged notification, + public async Task Handle(ConfigurationChanged notification, CancellationToken cancellationToken) { - throw new NotImplementedException(); + if (notification.Configuration is WidgetConfiguration configuration) + { + await widgetAvailability.SetAsync(args => args with { Value = configuration.IsAvailable }); + } } } diff --git a/Hyperbar/Widgets/WidgetHost.cs b/Hyperbar/Widgets/WidgetHost.cs index 91b0704..f7b33af 100644 --- a/Hyperbar/Widgets/WidgetHost.cs +++ b/Hyperbar/Widgets/WidgetHost.cs @@ -1,19 +1,46 @@ using Microsoft.Extensions.Hosting; namespace Hyperbar; -public class WidgetHost(IHost host, - IEnumerable initializers, - IProxyService proxyMediator) : +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; + + public WidgetHost(IHost host, + IMediator mediator, + IEnumerable initializers, + IProxyService proxyMediator, + IConfigurationInitializer configurationInitializer) + { + this.host = host; + this.mediator = mediator; + this.initializers = initializers; + this.proxyMediator = proxyMediator; + this.configurationInitializer = configurationInitializer; + + mediator.Subscribe(this); + } + public IServiceProvider Services => host.Services; + public Task Handle(Changed notification, + CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + public async Task InitializeAsync() { - foreach (IInitializer initializer in initializers) - { - await initializer.InitializeAsync(); - } + await configurationInitializer.InitializeAsync(); + //foreach (IInitializer initializer in initializers) + //{ + // await initializer.InitializeAsync(); + //} //if (proxyMediator.Proxy is IMediator mediator) //{