From 3a268db79db6cc51d9e2cf3ebb9971b93f0101d4 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Fri, 19 Jan 2024 22:37:12 +0000 Subject: [PATCH] Improve widget builder --- .../ContextualWidgetBuilder.cs | 16 +++++++++++ .../ContextualWidgetProvider.cs | 11 -------- .../MediaControllerWidgetBuilder.cs | 28 +++++++++++++++++++ .../MediaControllerWidgetProvider.cs | 23 --------------- .../PrimaryWidgetConfigurationBuilder.cs | 23 +++++++++++++++ .../PrimaryWidgetProvider.cs | 19 ------------- Hyperbar.Windows/App.xaml.cs | 4 +-- .../IServiceCollectionExtensions.cs | 11 ++++---- .../IServiceCollectionExtensions.cs | 14 +++++++++- Hyperbar/Views/WidgetContainerViewModel.cs | 4 +++ Hyperbar/Widgets/IWidget.cs | 10 +++++++ Hyperbar/Widgets/IWidgetBuilder.cs | 8 ++++++ Hyperbar/Widgets/IWidgetProvider.cs | 9 ------ Hyperbar/Widgets/Widget.cs | 11 ++++++++ Hyperbar/Widgets/WidgetConfiguration.cs | 19 ++++++++----- Hyperbar/Widgets/WidgetContext.cs | 11 ++++++-- 16 files changed, 141 insertions(+), 80 deletions(-) create mode 100644 Hyperbar.Windows.Contextual/ContextualWidgetBuilder.cs delete mode 100644 Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs create mode 100644 Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetBuilder.cs delete mode 100644 Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetProvider.cs create mode 100644 Hyperbar.Windows.Primary/PrimaryWidgetConfigurationBuilder.cs delete mode 100644 Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs create mode 100644 Hyperbar/Widgets/IWidget.cs create mode 100644 Hyperbar/Widgets/IWidgetBuilder.cs delete mode 100644 Hyperbar/Widgets/IWidgetProvider.cs create mode 100644 Hyperbar/Widgets/Widget.cs diff --git a/Hyperbar.Windows.Contextual/ContextualWidgetBuilder.cs b/Hyperbar.Windows.Contextual/ContextualWidgetBuilder.cs new file mode 100644 index 0000000..4589a32 --- /dev/null +++ b/Hyperbar.Windows.Contextual/ContextualWidgetBuilder.cs @@ -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(); + }); +} \ No newline at end of file diff --git a/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs b/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs deleted file mode 100644 index 5fdb4ba..0000000 --- a/Hyperbar.Windows.Contextual/ContextualWidgetProvider.cs +++ /dev/null @@ -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(); -} \ No newline at end of file diff --git a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetBuilder.cs b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetBuilder.cs new file mode 100644 index 0000000..b496279 --- /dev/null +++ b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetBuilder.cs @@ -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() + .AddSingleton() + .AddTransient, ServiceScopeFactory>() + .AddTransient, ServiceScopeProvider>() + .AddCache() + .AddTransient, MediaControllerFactory>() + .AddHandler() + .AddTransient, MediaControllerViewModelFactory>() + .AddCache() + .AddContentTemplate() + .AddContentTemplate() + .AddContentTemplate(); + }); +} \ No newline at end of file diff --git a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetProvider.cs b/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetProvider.cs deleted file mode 100644 index d0055ba..0000000 --- a/Hyperbar.Windows.MediaController/Lifecycles/MediaControllerWidgetProvider.cs +++ /dev/null @@ -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() - .AddSingleton() - .AddTransient, ServiceScopeFactory>() - .AddTransient, ServiceScopeProvider>() - .AddCache() - .AddTransient, MediaControllerFactory>() - .AddHandler() - .AddTransient, MediaControllerViewModelFactory>() - .AddCache() - .AddContentTemplate() - .AddContentTemplate() - .AddContentTemplate(); -} \ No newline at end of file diff --git a/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationBuilder.cs b/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationBuilder.cs new file mode 100644 index 0000000..cea5dc8 --- /dev/null +++ b/Hyperbar.Windows.Primary/PrimaryWidgetConfigurationBuilder.cs @@ -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() + .AddCache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration>() + .AddCache() + .AddTransient, WidgetComponentViewModelProvider>() + .AddTransient, WidgetComponentViewModelFactory>() + .AddTransient, WidgetComponentViewModelEnumerator>() + .AddWidgetTemplate() + .AddHandler(); + }); +} \ No newline at end of file diff --git a/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs b/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs deleted file mode 100644 index 2d2cb44..0000000 --- a/Hyperbar.Windows.Primary/PrimaryWidgetProvider.cs +++ /dev/null @@ -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() - .AddCache<(Guid ParentId, Guid Id), PrimaryCommandConfiguration>() - .AddCache() - .AddTransient, WidgetComponentViewModelProvider>() - .AddTransient, WidgetComponentViewModelFactory>() - .AddTransient, WidgetComponentViewModelEnumerator>() - .AddWidgetTemplate() - .AddHandler(); - -} \ No newline at end of file diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index 38be66e..2fda8fc 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -52,8 +52,8 @@ public partial class App : services.AddHandler(); - services.AddWidgetProvider(); - services.AddWidgetProvider(); + services.AddWidget(); + services.AddWidget(); services.AddTransient(provider => { diff --git a/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs b/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs index f13ebbd..ad75c4c 100644 --- a/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs +++ b/Hyperbar.Windows/Lifecycles/IServiceCollectionExtensions.cs @@ -9,14 +9,13 @@ namespace Hyperbar.Windows { public static class IServiceCollectionExtensions { - public static IServiceCollection AddWidgetProvider(this IServiceCollection services) - where TWidgetProvider : - IWidgetProvider, new() + public static IServiceCollection AddWidget(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(); - isolatedServices.AddTransient(); isolatedServices.AddScoped(); @@ -50,7 +48,8 @@ namespace Hyperbar.Windows isolatedServices.AddContentTemplate(); isolatedServices.AddContentTemplate(); - builder.Create(context, isolatedServices); + TWidgetBuilder builder = new(); + builder.Create(isolatedServices); }).Build(); diff --git a/Hyperbar/Extensions/IServiceCollectionExtensions.cs b/Hyperbar/Extensions/IServiceCollectionExtensions.cs index f41037f..82ae307 100644 --- a/Hyperbar/Extensions/IServiceCollectionExtensions.cs +++ b/Hyperbar/Extensions/IServiceCollectionExtensions.cs @@ -30,12 +30,24 @@ public static class IServiceCollectionExtensions } public static IServiceCollection AddConfiguration(this IServiceCollection services) - where TConfiguration : + where TConfiguration : class, new() { return services.AddConfiguration(typeof(TConfiguration).Name, "Settings.json", null); } + public static IServiceCollection AddConfiguration(this IServiceCollection services, + Action configurationDelegate) + where TConfiguration : + class, new() + { + TConfiguration configuration = new(); + configurationDelegate.Invoke(configuration); + + return services.AddConfiguration(typeof(TConfiguration).Name, "Settings.json", + configuration); + } + public static IServiceCollection AddConfiguration(this IServiceCollection services, TConfiguration? defaults = null) where TConfiguration : diff --git a/Hyperbar/Views/WidgetContainerViewModel.cs b/Hyperbar/Views/WidgetContainerViewModel.cs index f865b29..d5b9250 100644 --- a/Hyperbar/Views/WidgetContainerViewModel.cs +++ b/Hyperbar/Views/WidgetContainerViewModel.cs @@ -8,6 +8,7 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory, IMediator mediator, IDisposer disposer, IEnumerable items, + Guid id, bool alternate) : ObservableCollectionViewModel(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; } \ No newline at end of file diff --git a/Hyperbar/Widgets/IWidget.cs b/Hyperbar/Widgets/IWidget.cs new file mode 100644 index 0000000..4f9dafc --- /dev/null +++ b/Hyperbar/Widgets/IWidget.cs @@ -0,0 +1,10 @@ +namespace Hyperbar; + +public interface IWidget +{ + Guid Id { get; set; } + + string? Name { get; set; } + + string? Description { get; set; } +} diff --git a/Hyperbar/Widgets/IWidgetBuilder.cs b/Hyperbar/Widgets/IWidgetBuilder.cs new file mode 100644 index 0000000..7365e98 --- /dev/null +++ b/Hyperbar/Widgets/IWidgetBuilder.cs @@ -0,0 +1,8 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Hyperbar; + +public interface IWidgetBuilder +{ + void Create(IServiceCollection services); +} \ No newline at end of file diff --git a/Hyperbar/Widgets/IWidgetProvider.cs b/Hyperbar/Widgets/IWidgetProvider.cs deleted file mode 100644 index 3608add..0000000 --- a/Hyperbar/Widgets/IWidgetProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Hyperbar; - -public interface IWidgetProvider -{ - void Create(HostBuilderContext context, IServiceCollection services); -} \ No newline at end of file diff --git a/Hyperbar/Widgets/Widget.cs b/Hyperbar/Widgets/Widget.cs new file mode 100644 index 0000000..4519d6d --- /dev/null +++ b/Hyperbar/Widgets/Widget.cs @@ -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; } +} diff --git a/Hyperbar/Widgets/WidgetConfiguration.cs b/Hyperbar/Widgets/WidgetConfiguration.cs index 2993e25..00509de 100644 --- a/Hyperbar/Widgets/WidgetConfiguration.cs +++ b/Hyperbar/Widgets/WidgetConfiguration.cs @@ -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 widgetDelegate) + { + Widget widget = new(); + widgetDelegate(widget); - public required string Name { get; set; } - - public required string Description { get; set; } -} + services.AddSingleton(widget); + } +} \ No newline at end of file diff --git a/Hyperbar/Widgets/WidgetContext.cs b/Hyperbar/Widgets/WidgetContext.cs index c7a875a..397edea 100644 --- a/Hyperbar/Widgets/WidgetContext.cs +++ b/Hyperbar/Widgets/WidgetContext.cs @@ -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(); + } } \ No newline at end of file