Improve widget builder

This commit is contained in:
TheXamlGuy
2024-01-19 22:37:12 +00:00
parent 4766ed1156
commit 3a268db79d
16 changed files with 141 additions and 80 deletions
@@ -0,0 +1,16 @@
using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar.Widget.Contextual;
public class ContextualWidgetBuilder :
IWidgetBuilder
{
public void Create(IServiceCollection services) =>
WidgetBuilder.Config(services, config =>
{
config.Id = Guid.Parse("d3030852-8d4a-4fbb-9aa5-96dff3dfa06c");
config.Name = "Contextual commands";
services.AddWidgetTemplate<ContextualWidgetViewModel>();
});
}
@@ -1,11 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Hyperbar.Widget.Contextual;
public class ContextualWidgetProvider :
IWidgetProvider
{
public void Create(HostBuilderContext comtext, IServiceCollection services) => services
.AddWidgetTemplate<ContextualWidgetViewModel>();
}
@@ -0,0 +1,28 @@
using Microsoft.Extensions.DependencyInjection;
using Windows.Media.Control;
namespace Hyperbar.Windows.MediaController;
public class MediaControllerWidgetBuilder :
IWidgetBuilder
{
public void Create(IServiceCollection services) =>
WidgetBuilder.Config(services, config =>
{
config.Id = Guid.Parse("1667a800-ec5a-4d39-aa75-4f5ee95bb9f1");
config.Name = "Media controller";
services.AddWidgetTemplate<MediaControllerWidgetViewModel, MediaControllerWidgetView>()
.AddSingleton<IInitializer, MediaControllerManager>()
.AddTransient<IServiceScopeFactory<MediaController>, ServiceScopeFactory<MediaController>>()
.AddTransient<IServiceScopeProvider<MediaController>, ServiceScopeProvider<MediaController>>()
.AddCache<MediaController, IServiceScope>()
.AddTransient<IFactory<GlobalSystemMediaTransportControlsSession, MediaController?>, MediaControllerFactory>()
.AddHandler<MediaControllerHandler>()
.AddTransient<IFactory<MediaController, MediaControllerViewModel?>, MediaControllerViewModelFactory>()
.AddCache<MediaController, MediaControllerViewModel>()
.AddContentTemplate<MediaControllerViewModel, MediaControllerView>()
.AddContentTemplate<MediaInformationViewModel, MediaInformationView>()
.AddContentTemplate<MediaButtonViewModel, MediaButtonView>();
});
}
@@ -1,23 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Windows.Media.Control;
namespace Hyperbar.Windows.MediaController;
public class MediaControllerWidgetProvider :
IWidgetProvider
{
public void Create(HostBuilderContext comtext, IServiceCollection services) =>
services.AddWidgetTemplate<MediaControllerWidgetViewModel, MediaControllerWidgetView>()
.AddSingleton<IInitializer, MediaControllerManager>()
.AddTransient<IServiceScopeFactory<MediaController>, ServiceScopeFactory<MediaController>>()
.AddTransient<IServiceScopeProvider<MediaController>, ServiceScopeProvider<MediaController>>()
.AddCache<MediaController, IServiceScope>()
.AddTransient<IFactory<GlobalSystemMediaTransportControlsSession, MediaController?>, MediaControllerFactory>()
.AddHandler<MediaControllerHandler>()
.AddTransient<IFactory<MediaController, MediaControllerViewModel?>, MediaControllerViewModelFactory>()
.AddCache<MediaController, MediaControllerViewModel>()
.AddContentTemplate<MediaControllerViewModel, MediaControllerView>()
.AddContentTemplate<MediaInformationViewModel, MediaInformationView>()
.AddContentTemplate<MediaButtonViewModel, MediaButtonView>();
}
@@ -0,0 +1,23 @@
using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar.Windows.Primary;
public class PrimaryWidgetConfigurationBuilder :
IWidgetBuilder
{
public void Create(IServiceCollection services) =>
WidgetBuilder.Config(services, config =>
{
config.Id = Guid.Parse("cfdfe07c-d9d6-4174-ae41-988ca24d2e10");
config.Name = "Primary commands";
services.AddConfiguration<PrimaryWidgetConfiguration>()
.AddCache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration>()
.AddCache<Guid, IWidgetComponentViewModel>()
.AddTransient<IProvider<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelProvider>()
.AddTransient<IFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelFactory>()
.AddTransient<IViewModelEnumerator<IWidgetComponentViewModel>, WidgetComponentViewModelEnumerator>()
.AddWidgetTemplate<PrimaryWidgetViewModel>()
.AddHandler<PrimaryWidgetConfigurationHandler>();
});
}
@@ -1,19 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Hyperbar.Windows.Primary;
public class PrimaryWidgetProvider :
IWidgetProvider
{
public void Create(HostBuilderContext comtext, IServiceCollection services) =>
services.AddConfiguration<PrimaryWidgetConfiguration>()
.AddCache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration>()
.AddCache<Guid, IWidgetComponentViewModel>()
.AddTransient<IProvider<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelProvider>()
.AddTransient<IFactory<PrimaryCommandConfiguration, IWidgetComponentViewModel?>, WidgetComponentViewModelFactory>()
.AddTransient<IViewModelEnumerator<IWidgetComponentViewModel>, WidgetComponentViewModelEnumerator>()
.AddWidgetTemplate<PrimaryWidgetViewModel>()
.AddHandler<PrimaryWidgetConfigurationHandler>();
}
+2 -2
View File
@@ -52,8 +52,8 @@ public partial class App :
services.AddHandler<AppConfigurationChangedHandler>();
services.AddWidgetProvider<MediaControllerWidgetProvider>();
services.AddWidgetProvider<PrimaryWidgetProvider>();
services.AddWidget<MediaControllerWidgetBuilder>();
services.AddWidget<PrimaryWidgetConfigurationBuilder>();
services.AddTransient(provider =>
{
@@ -9,14 +9,13 @@ namespace Hyperbar.Windows
{
public static class IServiceCollectionExtensions
{
public static IServiceCollection AddWidgetProvider<TWidgetProvider>(this IServiceCollection services)
where TWidgetProvider :
IWidgetProvider, new()
public static IServiceCollection AddWidget<TWidgetBuilder>(this IServiceCollection services)
where TWidgetBuilder :
IWidgetBuilder, new()
{
DispatcherQueueSynchronizationContext context = new(DispatcherQueue.GetForCurrentThread());
SynchronizationContext.SetSynchronizationContext(context);
TWidgetProvider builder = new();
IHost? host = new HostBuilder()
.UseContentRoot(AppContext.BaseDirectory)
.ConfigureAppConfiguration(config =>
@@ -32,7 +31,6 @@ namespace Hyperbar.Windows
new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!)));
isolatedServices.AddHostedService<WidgetService>();
isolatedServices.AddTransient<ITemplateFactory, TemplateFactory>();
isolatedServices.AddScoped<IMediator, Mediator>();
@@ -50,7 +48,8 @@ namespace Hyperbar.Windows
isolatedServices.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>();
isolatedServices.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>();
builder.Create(context, isolatedServices);
TWidgetBuilder builder = new();
builder.Create(isolatedServices);
}).Build();
@@ -36,6 +36,18 @@ public static class IServiceCollectionExtensions
return services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name, "Settings.json", null);
}
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
Action<TConfiguration> configurationDelegate)
where TConfiguration :
class, new()
{
TConfiguration configuration = new();
configurationDelegate.Invoke(configuration);
return services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name, "Settings.json",
configuration);
}
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
TConfiguration? defaults = null)
where TConfiguration :
@@ -8,6 +8,7 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory,
IMediator mediator,
IDisposer disposer,
IEnumerable<IWidgetViewModel> items,
Guid id,
bool alternate) :
ObservableCollectionViewModel<IWidgetViewModel>(serviceFactory, mediator, disposer, items),
ITemplatedViewModel
@@ -15,5 +16,8 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory,
[ObservableProperty]
private bool alternate = alternate;
[ObservableProperty]
private Guid id = id;
public ITemplateFactory TemplateFactory => templateFactory;
}
+10
View File
@@ -0,0 +1,10 @@
namespace Hyperbar;
public interface IWidget
{
Guid Id { get; set; }
string? Name { get; set; }
string? Description { get; set; }
}
+8
View File
@@ -0,0 +1,8 @@
using Microsoft.Extensions.DependencyInjection;
namespace Hyperbar;
public interface IWidgetBuilder
{
void Create(IServiceCollection services);
}
-9
View File
@@ -1,9 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Hyperbar;
public interface IWidgetProvider
{
void Create(HostBuilderContext context, IServiceCollection services);
}
+11
View File
@@ -0,0 +1,11 @@
namespace Hyperbar;
public class Widget :
IWidget
{
public Guid Id { get; set; } = Guid.NewGuid();
public string? Name { get; set; }
public string? Description { get; set; }
}
+11 -6
View File
@@ -1,10 +1,15 @@
namespace Hyperbar;
using Microsoft.Extensions.DependencyInjection;
public sealed class WidgetConfiguration
namespace Hyperbar;
public class WidgetBuilder
{
public required Guid Id { get; set; }
public static void Config(IServiceCollection services,
Action<IWidget> widgetDelegate)
{
Widget widget = new();
widgetDelegate(widget);
public required string Name { get; set; }
public required string Description { get; set; }
services.AddSingleton(widget);
}
}
+9 -2
View File
@@ -1,6 +1,13 @@
namespace Hyperbar;
namespace Hyperbar;
public sealed class WidgetContext(IServiceProvider serviceProvider)
public class WidgetContext(IServiceProvider serviceProvider) :
IInitializer
{
public IServiceProvider ServiceProvider => serviceProvider;
public Task InitializeAsync()
{
throw new NotImplementedException();
}
}