Improve widget builder
This commit is contained in:
@@ -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>();
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -52,8 +52,8 @@ public partial class App :
|
|||||||
|
|
||||||
services.AddHandler<AppConfigurationChangedHandler>();
|
services.AddHandler<AppConfigurationChangedHandler>();
|
||||||
|
|
||||||
services.AddWidgetProvider<MediaControllerWidgetProvider>();
|
services.AddWidget<MediaControllerWidgetBuilder>();
|
||||||
services.AddWidgetProvider<PrimaryWidgetProvider>();
|
services.AddWidget<PrimaryWidgetConfigurationBuilder>();
|
||||||
|
|
||||||
services.AddTransient(provider =>
|
services.AddTransient(provider =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,14 +9,13 @@ namespace Hyperbar.Windows
|
|||||||
{
|
{
|
||||||
public static class IServiceCollectionExtensions
|
public static class IServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
public static IServiceCollection AddWidgetProvider<TWidgetProvider>(this IServiceCollection services)
|
public static IServiceCollection AddWidget<TWidgetBuilder>(this IServiceCollection services)
|
||||||
where TWidgetProvider :
|
where TWidgetBuilder :
|
||||||
IWidgetProvider, new()
|
IWidgetBuilder, new()
|
||||||
{
|
{
|
||||||
DispatcherQueueSynchronizationContext context = new(DispatcherQueue.GetForCurrentThread());
|
DispatcherQueueSynchronizationContext context = new(DispatcherQueue.GetForCurrentThread());
|
||||||
SynchronizationContext.SetSynchronizationContext(context);
|
SynchronizationContext.SetSynchronizationContext(context);
|
||||||
|
|
||||||
TWidgetProvider builder = new();
|
|
||||||
IHost? host = new HostBuilder()
|
IHost? host = new HostBuilder()
|
||||||
.UseContentRoot(AppContext.BaseDirectory)
|
.UseContentRoot(AppContext.BaseDirectory)
|
||||||
.ConfigureAppConfiguration(config =>
|
.ConfigureAppConfiguration(config =>
|
||||||
@@ -32,7 +31,6 @@ namespace Hyperbar.Windows
|
|||||||
new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!)));
|
new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!)));
|
||||||
|
|
||||||
isolatedServices.AddHostedService<WidgetService>();
|
isolatedServices.AddHostedService<WidgetService>();
|
||||||
|
|
||||||
isolatedServices.AddTransient<ITemplateFactory, TemplateFactory>();
|
isolatedServices.AddTransient<ITemplateFactory, TemplateFactory>();
|
||||||
|
|
||||||
isolatedServices.AddScoped<IMediator, Mediator>();
|
isolatedServices.AddScoped<IMediator, Mediator>();
|
||||||
@@ -50,7 +48,8 @@ namespace Hyperbar.Windows
|
|||||||
isolatedServices.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>();
|
isolatedServices.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>();
|
||||||
isolatedServices.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>();
|
isolatedServices.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>();
|
||||||
|
|
||||||
builder.Create(context, isolatedServices);
|
TWidgetBuilder builder = new();
|
||||||
|
builder.Create(isolatedServices);
|
||||||
|
|
||||||
}).Build();
|
}).Build();
|
||||||
|
|
||||||
|
|||||||
@@ -30,12 +30,24 @@ public static class IServiceCollectionExtensions
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services)
|
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services)
|
||||||
where TConfiguration :
|
where TConfiguration :
|
||||||
class, new()
|
class, new()
|
||||||
{
|
{
|
||||||
return services.AddConfiguration<TConfiguration>(typeof(TConfiguration).Name, "Settings.json", null);
|
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,
|
public static IServiceCollection AddConfiguration<TConfiguration>(this IServiceCollection services,
|
||||||
TConfiguration? defaults = null)
|
TConfiguration? defaults = null)
|
||||||
where TConfiguration :
|
where TConfiguration :
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory,
|
|||||||
IMediator mediator,
|
IMediator mediator,
|
||||||
IDisposer disposer,
|
IDisposer disposer,
|
||||||
IEnumerable<IWidgetViewModel> items,
|
IEnumerable<IWidgetViewModel> items,
|
||||||
|
Guid id,
|
||||||
bool alternate) :
|
bool alternate) :
|
||||||
ObservableCollectionViewModel<IWidgetViewModel>(serviceFactory, mediator, disposer, items),
|
ObservableCollectionViewModel<IWidgetViewModel>(serviceFactory, mediator, disposer, items),
|
||||||
ITemplatedViewModel
|
ITemplatedViewModel
|
||||||
@@ -15,5 +16,8 @@ public partial class WidgetContainerViewModel(ITemplateFactory templateFactory,
|
|||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private bool alternate = alternate;
|
private bool alternate = alternate;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private Guid id = id;
|
||||||
|
|
||||||
public ITemplateFactory TemplateFactory => templateFactory;
|
public ITemplateFactory TemplateFactory => templateFactory;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace Hyperbar;
|
||||||
|
|
||||||
|
public interface IWidget
|
||||||
|
{
|
||||||
|
Guid Id { get; set; }
|
||||||
|
|
||||||
|
string? Name { get; set; }
|
||||||
|
|
||||||
|
string? Description { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace Hyperbar;
|
||||||
|
|
||||||
|
public interface IWidgetBuilder
|
||||||
|
{
|
||||||
|
void Create(IServiceCollection services);
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
|
|
||||||
namespace Hyperbar;
|
|
||||||
|
|
||||||
public interface IWidgetProvider
|
|
||||||
{
|
|
||||||
void Create(HostBuilderContext context, IServiceCollection services);
|
|
||||||
}
|
|
||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -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; }
|
services.AddSingleton(widget);
|
||||||
|
}
|
||||||
public required string Description { get; set; }
|
|
||||||
}
|
}
|
||||||
@@ -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 IServiceProvider ServiceProvider => serviceProvider;
|
||||||
|
|
||||||
|
public Task InitializeAsync()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user