add support to properate value changes to everywhere sle

This commit is contained in:
TheXamlGuy
2024-01-23 18:57:30 +00:00
parent 6daaa39b8c
commit 2f827753f5
15 changed files with 100 additions and 28 deletions
@@ -1,5 +1,3 @@
using Hyperbar.Widgets;
namespace Hyperbar.Widget.Contextual;
public class ContextualWidget :
@@ -1,4 +1,3 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection;
using Windows.Media.Control;
@@ -1,4 +1,3 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar.Windows.Primary;
@@ -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<IWidgetComponentViewModel>(configuration.Order, viewModel),
await mediator.PublishAsync(new Moved<IWidgetComponentViewModel>(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);
@@ -1,6 +1,7 @@
namespace Hyperbar;
public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConfiguration> reader,
public class ConfigurationInitializer<TConfiguration>(IConfigurationMonitor<TConfiguration> monitor,
IConfigurationReader<TConfiguration> reader,
IConfigurationWriter<TConfiguration> writer,
IConfigurationFactory<TConfiguration> factory) :
IConfigurationInitializer<TConfiguration>,
@@ -8,7 +9,7 @@ public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConf
where TConfiguration :
class
{
public Task InitializeAsync()
public async Task InitializeAsync()
{
if (!reader.TryRead(out TConfiguration? _))
{
@@ -18,6 +19,6 @@ public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConf
}
}
return Task.CompletedTask;
await monitor.InitializeAsync();
}
}
@@ -2,7 +2,8 @@
public class ConfigurationMonitor<TConfiguration>(IConfigurationFile<TConfiguration> configurationFile,
IConfigurationReader<TConfiguration> reader,
IMediator mediator) : IInitializer
IMediator mediator) :
IConfigurationMonitor<TConfiguration>
where TConfiguration :
class
{
@@ -1,6 +1,8 @@
namespace Hyperbar
{
public interface IConfigurationFactory<TConfiguration> where TConfiguration : class
public interface IConfigurationFactory<TConfiguration>
where TConfiguration :
class
{
TConfiguration Create();
}
@@ -0,0 +1,7 @@
namespace Hyperbar;
public interface IConfigurationMonitor<TConfiguration> :
IInitializer
where TConfiguration :
class;
@@ -118,13 +118,12 @@ public static class IServiceCollectionExtensions
return new ConfigurationFile<TConfiguration>(fileInfo);
});
services.AddSingleton<IInitializer, ConfigurationMonitor<TConfiguration>>();
services.AddSingleton<IConfigurationMonitor<TConfiguration>, ConfigurationMonitor<TConfiguration>>();
services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>();
services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>();
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
(TConfiguration)(configuration ?? provider.GetRequiredService<TConfiguration>())));
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
configuration ?? provider.GetRequiredService<TConfiguration>()));
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IConfigurationInitializer<TConfiguration>, ConfigurationInitializer<TConfiguration>>();
+9
View File
@@ -0,0 +1,9 @@
namespace Hyperbar;
public interface IValue<TValue>
where TValue :
notnull, new()
{
Task SetAsync(Func<TValue, TValue> updateDelgate);
}
+21
View File
@@ -0,0 +1,21 @@
namespace Hyperbar;
public class Value<TValue>(IMediator mediator) :
IValue<TValue>
where TValue :
notnull, new ()
{
private TValue? current;
public async Task SetAsync(Func<TValue, TValue> updateDelgate)
{
if (updateDelgate.Invoke(current ?? new TValue()) is TValue value)
{
if (current is null || !value.Equals(current))
{
current = value;
await mediator.PublishAsync(new Changed<TValue>(current));
}
}
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace Hyperbar;
public record WidgetAvailability
{
public bool Value { get; set; }
}
+3 -1
View File
@@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Reflection;
namespace Hyperbar.Widgets;
namespace Hyperbar;
public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
IWidgetBuilder<TConfiguration>
@@ -30,6 +30,8 @@ public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
services.AddScoped<IDisposer, Disposer>();
services.AddHandler<WidgetConfigurationHandler>();
services.AddSingleton<IValue<WidgetAvailability>, Value<WidgetAvailability>>();
//services.AddConfiguration(configuration);
services.AddConfiguration<WidgetConfiguration>(section: configuration.GetType().Name,
configuration: configuration);
@@ -1,11 +1,14 @@
namespace Hyperbar;
public class WidgetConfigurationHandler :
public class WidgetConfigurationHandler(IValue<WidgetAvailability> widgetAvailability) :
INotificationHandler<ConfigurationChanged<WidgetConfiguration>>
{
public Task Handle(ConfigurationChanged<WidgetConfiguration> notification,
public async Task Handle(ConfigurationChanged<WidgetConfiguration> notification,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
if (notification.Configuration is WidgetConfiguration configuration)
{
await widgetAvailability.SetAsync(args => args with { Value = configuration.IsAvailable });
}
}
}
+34 -7
View File
@@ -1,19 +1,46 @@
using Microsoft.Extensions.Hosting;
namespace Hyperbar;
public class WidgetHost(IHost host,
IEnumerable<IInitializer> initializers,
IProxyService<IMediator> proxyMediator) :
public class WidgetHost :
INotificationHandler<Changed<WidgetAvailability>>,
IWidgetHost
{
private readonly IHost host;
private readonly IMediator mediator;
private readonly IEnumerable<IInitializer> initializers;
private readonly IProxyService<IMediator> proxyMediator;
private readonly IConfigurationInitializer<WidgetConfiguration> configurationInitializer;
public WidgetHost(IHost host,
IMediator mediator,
IEnumerable<IInitializer> initializers,
IProxyService<IMediator> proxyMediator,
IConfigurationInitializer<WidgetConfiguration> 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<WidgetAvailability> 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)
//{