get HB widgets showing up again

This commit is contained in:
TheXamlGuy
2024-01-23 23:14:51 +00:00
parent 185f0e9f45
commit d1b57d5d16
12 changed files with 73 additions and 57 deletions
@@ -2,7 +2,7 @@
namespace Hyperbar.Windows.Primary; namespace Hyperbar.Windows.Primary;
public class WidgetComponentFactory(IServiceFactory service, public class WidgetComponentFactory(IServiceFactory factory,
IMediator mediator, IMediator mediator,
ICache<Guid, IWidgetComponentViewModel> cache) : ICache<Guid, IWidgetComponentViewModel> cache) :
IFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?> IFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>
@@ -13,7 +13,7 @@ public class WidgetComponentFactory(IServiceFactory service,
if (configuration is KeyAcceleratorCommandConfiguration keyAcceleratorCommandConfiguration) if (configuration is KeyAcceleratorCommandConfiguration keyAcceleratorCommandConfiguration)
{ {
viewModel = service.Create<WidgetButtonViewModel>(keyAcceleratorCommandConfiguration.Id, viewModel = factory.Create<WidgetButtonViewModel>(keyAcceleratorCommandConfiguration.Id,
keyAcceleratorCommandConfiguration.Text, keyAcceleratorCommandConfiguration.Icon, keyAcceleratorCommandConfiguration.Text, keyAcceleratorCommandConfiguration.Icon,
new RelayCommand(async () => await mediator.SendAsync(new KeyAccelerator((VirtualKey) new RelayCommand(async () => await mediator.SendAsync(new KeyAccelerator((VirtualKey)
keyAcceleratorCommandConfiguration.Key, keyAcceleratorCommandConfiguration.Modifiers? keyAcceleratorCommandConfiguration.Key, keyAcceleratorCommandConfiguration.Modifiers?
@@ -32,14 +32,14 @@ public class WidgetComponentFactory(IServiceFactory service,
if (childCommandConfiguration is ProcessCommandConfiguration childProcessCommandConfiguration) if (childCommandConfiguration is ProcessCommandConfiguration childProcessCommandConfiguration)
{ {
childViewModel = service.Create<WidgetMenuViewModel>(childProcessCommandConfiguration.Id, childViewModel = factory.Create<WidgetMenuViewModel>(childProcessCommandConfiguration.Id,
childProcessCommandConfiguration.Icon, childProcessCommandConfiguration.Text, childProcessCommandConfiguration.Icon, childProcessCommandConfiguration.Text,
new RelayCommand(async () => await mediator.SendAsync(new StartProcess(childProcessCommandConfiguration.Path)))); new RelayCommand(async () => await mediator.SendAsync(new StartProcess(childProcessCommandConfiguration.Path))));
} }
if (childCommandConfiguration is KeyAcceleratorCommandConfiguration childKeyAcceleratorCommandConfiguration) if (childCommandConfiguration is KeyAcceleratorCommandConfiguration childKeyAcceleratorCommandConfiguration)
{ {
childViewModel = service.Create<WidgetMenuViewModel>(childKeyAcceleratorCommandConfiguration.Id, childViewModel = factory.Create<WidgetMenuViewModel>(childKeyAcceleratorCommandConfiguration.Id,
childKeyAcceleratorCommandConfiguration.Text, childKeyAcceleratorCommandConfiguration.Icon, childKeyAcceleratorCommandConfiguration.Text, childKeyAcceleratorCommandConfiguration.Icon,
new RelayCommand(async () => new RelayCommand(async () =>
await mediator.SendAsync(new KeyAccelerator((VirtualKey)childKeyAcceleratorCommandConfiguration.Key, await mediator.SendAsync(new KeyAccelerator((VirtualKey)childKeyAcceleratorCommandConfiguration.Key,
@@ -53,14 +53,14 @@ public class WidgetComponentFactory(IServiceFactory service,
} }
} }
viewModel = service.Create<WidgetSplitButtonViewModel>(childViewModels, viewModel = factory.Create<WidgetSplitButtonViewModel>(childViewModels,
processCommandConfiguration.Id, processCommandConfiguration.Text, processCommandConfiguration.Id, processCommandConfiguration.Text,
processCommandConfiguration.Icon, new RelayCommand(async () => processCommandConfiguration.Icon, new RelayCommand(async () =>
await mediator.SendAsync(new StartProcess(processCommandConfiguration.Path)))); await mediator.SendAsync(new StartProcess(processCommandConfiguration.Path))));
} }
else else
{ {
viewModel = service.Create<WidgetButtonViewModel>(processCommandConfiguration.Id, viewModel = factory.Create<WidgetButtonViewModel>(processCommandConfiguration.Id,
processCommandConfiguration.Text, processCommandConfiguration.Icon, new RelayCommand(async () => processCommandConfiguration.Text, processCommandConfiguration.Icon, new RelayCommand(async () =>
await mediator.SendAsync(new StartProcess(processCommandConfiguration.Path)))); await mediator.SendAsync(new StartProcess(processCommandConfiguration.Path))));
} }
+2 -1
View File
@@ -8,6 +8,7 @@ using Microsoft.Extensions.Hosting;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using System; using System;
using System.Reflection; using System.Reflection;
using Windows.Media.Control;
namespace Hyperbar.Windows; namespace Hyperbar.Windows;
@@ -46,6 +47,7 @@ public partial class App :
services.AddSingleton<DesktopBar>(); services.AddSingleton<DesktopBar>();
services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>(); services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>();
services.AddContentTemplate<WidgetContainerViewModel, WidgetContainerView>();
services.AddTransient<IProxyServiceCollection<IWidgetBuilder>>(provider => services.AddTransient<IProxyServiceCollection<IWidgetBuilder>>(provider =>
new ProxyServiceCollection<IWidgetBuilder>(services => new ProxyServiceCollection<IWidgetBuilder>(services =>
@@ -59,7 +61,6 @@ public partial class App :
services.AddTransient<IWidgetView, WidgetView>(); services.AddTransient<IWidgetView, WidgetView>();
services.AddContentTemplate<WidgetContainerViewModel, WidgetContainerView>();
services.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>(); services.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>();
services.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>(); services.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>();
})); }));
@@ -10,10 +10,10 @@
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Rectangle <Rectangle
Width="1" Width="10"
Height="40"
Margin="6,2,6,2" Margin="6,2,6,2"
Fill="{ThemeResource DividerStrokeColorDefaultBrush}" Fill="Red" />
Visibility="{Binding Alternate}" />
<ItemsControl <ItemsControl
Grid.Column="1" Grid.Column="1"
ItemTemplateSelector="{Binding Converter={ui:DataTemplateConverter}}" ItemTemplateSelector="{Binding Converter={ui:DataTemplateConverter}}"
@@ -155,7 +155,9 @@ public static class IServiceCollectionExtensions
services.AddHandler<WidgetEnumerationHandler>(); services.AddHandler<WidgetEnumerationHandler>();
services.AddHandler<WidgetAssemblyHandler>(); services.AddHandler<WidgetAssemblyHandler>();
services.AddHandler<WidgetHandler>(); services.AddHandler<WidgetHandler>();
services.AddHandler<WidgetHostHander>(); services.AddHandler<WidgetHostHandler>();
services.AddTransient<IFactory<IWidgetHost, WidgetContainerViewModel?>, WidgetContainerFactory>();
return services; return services;
} }
+3 -3
View File
@@ -1,11 +1,11 @@
namespace Hyperbar; namespace Hyperbar;
[NotificationHandler(nameof(WidgetBarViewModel))]
public partial class WidgetBarViewModel(ITemplateFactory templateFactory, public partial class WidgetBarViewModel(ITemplateFactory templateFactory,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IMediator mediator, IMediator mediator,
IDisposer disposer, IDisposer disposer) :
IEnumerable<WidgetContainerViewModel> items) : ObservableCollectionViewModel<WidgetContainerViewModel>(serviceFactory, mediator, disposer),
ObservableCollectionViewModel<WidgetContainerViewModel>(serviceFactory, mediator, disposer, items),
ITemplatedViewModel ITemplatedViewModel
{ {
public ITemplateFactory TemplateFactory => templateFactory; public ITemplateFactory TemplateFactory => templateFactory;
+2 -7
View File
@@ -7,15 +7,10 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IMediator mediator, IMediator mediator,
IDisposer disposer, IDisposer disposer,
IEnumerable<IWidgetViewModel> items, Guid id) :
Guid id, ObservableCollectionViewModel<IWidgetViewModel>(serviceFactory, mediator, disposer),
bool alternate) :
ObservableCollectionViewModel<IWidgetViewModel>(serviceFactory, mediator, disposer, items),
ITemplatedViewModel ITemplatedViewModel
{ {
[ObservableProperty]
private bool alternate = alternate;
[ObservableProperty] [ObservableProperty]
private Guid id = id; private Guid id = id;
+2
View File
@@ -3,5 +3,7 @@
public interface IWidgetHost : public interface IWidgetHost :
IInitializer IInitializer
{ {
WidgetConfiguration Configuration { get; }
IServiceProvider Services { get; } IServiceProvider Services { get; }
} }
-9
View File
@@ -50,15 +50,6 @@ public class WidgetBuilder<TConfiguration>(TConfiguration configuration) :
public IWidgetHost Build() public IWidgetHost Build()
{ {
IHost host = hostBuilder.Build(); IHost host = hostBuilder.Build();
//if (host.Services.GetRequiredService<IConfigurationInitializer<TConfiguration>>()
// is IConfigurationInitializer<TConfiguration> configurationInitializer)
//{
// configurationInitializer.InitializeAsync()
// .GetAwaiter()
// .GetResult();
//}
return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services, return (IWidgetHost)ActivatorUtilities.CreateInstance(host.Services,
typeof(WidgetHost), host); typeof(WidgetHost), host);
} }
@@ -0,0 +1,17 @@
using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar;
public class WidgetContainerFactory(IServiceFactory factory) :
IFactory<IWidgetHost, WidgetContainerViewModel?>
{
public WidgetContainerViewModel? Create(IWidgetHost value)
{
if (value.Services.GetServices<IWidgetViewModel>() is
IEnumerable<IWidgetViewModel> viewModels)
{
return factory.Create<WidgetContainerViewModel>(value.Configuration.Id);
}
return default;
}
}
+9 -7
View File
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Hyperbar; namespace Hyperbar;
@@ -27,6 +28,8 @@ public class WidgetHost :
mediator.Subscribe(this); mediator.Subscribe(this);
} }
public WidgetConfiguration Configuration => host.Services.GetRequiredService<WidgetConfiguration>();
public IServiceProvider Services => host.Services; public IServiceProvider Services => host.Services;
public async Task Handle(Changed<WidgetAvailability> notification, public async Task Handle(Changed<WidgetAvailability> notification,
@@ -45,15 +48,14 @@ public class WidgetHost :
private async Task StartAsync() private async Task StartAsync()
{ {
if (proxyMediator.Proxy is IMediator mediator)
{
await mediator.PublishAsync(new Started<IWidgetHost>(this));
}
foreach (IInitializer initializer in initializers) foreach (IInitializer initializer in initializers)
{ {
await initializer.InitializeAsync(); await initializer.InitializeAsync();
} }
//if (proxyMediator.Proxy is IMediator mediator)
//{
// await mediator.PublishAsync(new Started<IWidgetHost>(this));
//}
} }
} }
-20
View File
@@ -1,20 +0,0 @@
namespace Hyperbar;
public class WidgetHostHander :
INotificationHandler<Started<IWidgetHost>>,
INotificationHandler<Stopped<IWidgetHost>>
{
public Task Handle(Started<IWidgetHost> notification,
CancellationToken cancellationToken)
{
// throw new NotImplementedException();
return Task.CompletedTask;
}
public Task Handle(Stopped<IWidgetHost> notification,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
+26
View File
@@ -0,0 +1,26 @@
namespace Hyperbar;
public class WidgetHostHandler(IMediator mediator,
IFactory<IWidgetHost, WidgetContainerViewModel?> factory) :
INotificationHandler<Started<IWidgetHost>>,
INotificationHandler<Stopped<IWidgetHost>>
{
public async Task Handle(Started<IWidgetHost> notification,
CancellationToken cancellationToken)
{
if (notification.Value is IWidgetHost host)
{
if (factory.Create(host) is WidgetContainerViewModel containerViewModel)
{
await mediator.PublishAsync(new Created<WidgetContainerViewModel>(containerViewModel), nameof(WidgetBarViewModel),
cancellationToken);
}
}
}
public Task Handle(Stopped<IWidgetHost> notification,
CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}