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; namespace Hyperbar.Widget.Contextual;
public class ContextualWidget : public class ContextualWidget :
@@ -1,4 +1,3 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Windows.Media.Control; using Windows.Media.Control;
@@ -1,4 +1,3 @@
using Hyperbar.Widgets;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar.Windows.Primary; namespace Hyperbar.Windows.Primary;
@@ -42,11 +42,9 @@ public class PrimaryWidgetConfigurationHandler(IMediator mediator,
if (moved.Value is PrimaryCommandConfiguration configuration && if (moved.Value is PrimaryCommandConfiguration configuration &&
provider.Get(configuration) is IWidgetComponentViewModel viewModel) provider.Get(configuration) is IWidgetComponentViewModel viewModel)
{ {
await mediator.PublishAsync( await mediator.PublishAsync(new Moved<IWidgetComponentViewModel>(configuration.Order, viewModel),
new Moved<IWidgetComponentViewModel>(configuration.Order, viewModel),
moved.Key.ParentId == Guid.Empty ? nameof(PrimaryWidgetViewModel) : moved.Key.ParentId, moved.Key.ParentId == Guid.Empty ? nameof(PrimaryWidgetViewModel) : moved.Key.ParentId,
cancellationToken cancellationToken);
);
cache.Remove(moved.Key); cache.Remove(moved.Key);
cache.Add(moved.Key, moved.Value); cache.Add(moved.Key, moved.Value);
@@ -1,6 +1,7 @@
namespace Hyperbar; namespace Hyperbar;
public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConfiguration> reader, public class ConfigurationInitializer<TConfiguration>(IConfigurationMonitor<TConfiguration> monitor,
IConfigurationReader<TConfiguration> reader,
IConfigurationWriter<TConfiguration> writer, IConfigurationWriter<TConfiguration> writer,
IConfigurationFactory<TConfiguration> factory) : IConfigurationFactory<TConfiguration> factory) :
IConfigurationInitializer<TConfiguration>, IConfigurationInitializer<TConfiguration>,
@@ -8,7 +9,7 @@ public class ConfigurationInitializer<TConfiguration>(IConfigurationReader<TConf
where TConfiguration : where TConfiguration :
class class
{ {
public Task InitializeAsync() public async Task InitializeAsync()
{ {
if (!reader.TryRead(out TConfiguration? _)) 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, public class ConfigurationMonitor<TConfiguration>(IConfigurationFile<TConfiguration> configurationFile,
IConfigurationReader<TConfiguration> reader, IConfigurationReader<TConfiguration> reader,
IMediator mediator) : IInitializer IMediator mediator) :
IConfigurationMonitor<TConfiguration>
where TConfiguration : where TConfiguration :
class class
{ {
@@ -1,6 +1,8 @@
namespace Hyperbar namespace Hyperbar
{ {
public interface IConfigurationFactory<TConfiguration> where TConfiguration : class public interface IConfigurationFactory<TConfiguration>
where TConfiguration :
class
{ {
TConfiguration Create(); 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); return new ConfigurationFile<TConfiguration>(fileInfo);
}); });
services.AddSingleton<IInitializer, ConfigurationMonitor<TConfiguration>>(); services.AddSingleton<IConfigurationMonitor<TConfiguration>, ConfigurationMonitor<TConfiguration>>();
services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>(); services.AddSingleton<IConfigurationReader<TConfiguration>, ConfigurationReader<TConfiguration>>();
services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>(); services.AddSingleton<IConfigurationWriter<TConfiguration>, ConfigurationWriter<TConfiguration>>();
services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() => services.AddTransient<IConfigurationFactory<TConfiguration>>(provider => new ConfigurationFactory<TConfiguration>(() =>
(TConfiguration)(configuration ?? provider.GetRequiredService<TConfiguration>()))); configuration ?? provider.GetRequiredService<TConfiguration>()));
services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>(); services.AddTransient<IInitializer, ConfigurationInitializer<TConfiguration>>();
services.AddTransient<IConfigurationInitializer<TConfiguration>, 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 Microsoft.Extensions.Hosting;
using System.Reflection; using System.Reflection;
namespace Hyperbar.Widgets; namespace Hyperbar;
public class WidgetBuilder<TConfiguration>(TConfiguration configuration) : public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
IWidgetBuilder<TConfiguration> IWidgetBuilder<TConfiguration>
@@ -30,6 +30,8 @@ public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
services.AddScoped<IDisposer, Disposer>(); services.AddScoped<IDisposer, Disposer>();
services.AddHandler<WidgetConfigurationHandler>(); services.AddHandler<WidgetConfigurationHandler>();
services.AddSingleton<IValue<WidgetAvailability>, Value<WidgetAvailability>>();
//services.AddConfiguration(configuration); //services.AddConfiguration(configuration);
services.AddConfiguration<WidgetConfiguration>(section: configuration.GetType().Name, services.AddConfiguration<WidgetConfiguration>(section: configuration.GetType().Name,
configuration: configuration); configuration: configuration);
@@ -1,11 +1,14 @@
namespace Hyperbar; namespace Hyperbar;
public class WidgetConfigurationHandler : public class WidgetConfigurationHandler(IValue<WidgetAvailability> widgetAvailability) :
INotificationHandler<ConfigurationChanged<WidgetConfiguration>> INotificationHandler<ConfigurationChanged<WidgetConfiguration>>
{ {
public Task Handle(ConfigurationChanged<WidgetConfiguration> notification, public async Task Handle(ConfigurationChanged<WidgetConfiguration> notification,
CancellationToken cancellationToken) 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; using Microsoft.Extensions.Hosting;
namespace Hyperbar; namespace Hyperbar;
public class WidgetHost(IHost host, public class WidgetHost :
IEnumerable<IInitializer> initializers, INotificationHandler<Changed<WidgetAvailability>>,
IProxyService<IMediator> proxyMediator) :
IWidgetHost 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 IServiceProvider Services => host.Services;
public Task Handle(Changed<WidgetAvailability> notification,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
public async Task InitializeAsync() public async Task InitializeAsync()
{ {
foreach (IInitializer initializer in initializers) await configurationInitializer.InitializeAsync();
{ //foreach (IInitializer initializer in initializers)
await initializer.InitializeAsync(); //{
} // await initializer.InitializeAsync();
//}
//if (proxyMediator.Proxy is IMediator mediator) //if (proxyMediator.Proxy is IMediator mediator)
//{ //{