From cc61842c9a5d2a2edd35f8b77fa60d37e66707fe Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Wed, 14 Feb 2024 22:54:22 +0000 Subject: [PATCH] wip.. --- Hyperbar.UI.Windows/ContentControlHandler.cs | 19 +++++++ Hyperbar.UI.Windows/WindowHandler.cs | 16 ------ .../Hyperbar.Widget.Windows.csproj | 8 +-- .../IServiceCollectionExtensions.cs | 4 +- ...=> WidgetConfigurationNavigationView.xaml} | 2 +- ...WidgetConfigurationNavigationView.xaml.cs} | 4 +- ...WidgetConfigurationNavigationViewModel.cs} | 2 +- ...igurationNavigationViewModelEnumerator.cs} | 10 ++-- ...View.xaml => WidgetConfigurationView.xaml} | 6 +-- .../WidgetConfigurationView.xaml.cs | 12 +++++ .../WidgetConfigurationViewModel.cs | 51 +++++++++++++++++++ .../WidgetNavigationViewModel.cs | 2 +- .../WidgetSettingsView.xaml.cs | 12 ----- .../WidgetSettingsViewModel.cs | 14 ----- Hyperbar.Widget.Windows/WidgetView.xaml | 36 +++++++------ Hyperbar.Widget/WidgetBuilder.cs | 2 +- Hyperbar.Widget/WidgetConfigurationHandler.cs | 6 +-- Hyperbar.Windows/App.xaml.cs | 2 +- ...on.cs => ConfigurationChangedPublisher.cs} | 4 +- ...n.cs => IConfigurationChangedPublisher.cs} | 2 +- Hyperbar/IServiceCollectionExtensions.cs | 6 +-- Hyperbar/ObservableCollectionViewModel.cs | 1 - Hyperbar/ValueViewModel.cs | 10 ++++ 23 files changed, 138 insertions(+), 93 deletions(-) create mode 100644 Hyperbar.UI.Windows/ContentControlHandler.cs rename Hyperbar.Widget.Windows/{WidgetSettingsNavigationView.xaml => WidgetConfigurationNavigationView.xaml} (90%) rename Hyperbar.Widget.Windows/{WidgetSettingsNavigationView.xaml.cs => WidgetConfigurationNavigationView.xaml.cs} (52%) rename Hyperbar.Widget.Windows/{WidgetSettingsNavigationViewModel.cs => WidgetConfigurationNavigationViewModel.cs} (75%) rename Hyperbar.Widget.Windows/{WidgetSettingsNavigationViewModelEnumerator.cs => WidgetConfigurationNavigationViewModelEnumerator.cs} (51%) rename Hyperbar.Widget.Windows/{WidgetSettingsView.xaml => WidgetConfigurationView.xaml} (63%) create mode 100644 Hyperbar.Widget.Windows/WidgetConfigurationView.xaml.cs create mode 100644 Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs delete mode 100644 Hyperbar.Widget.Windows/WidgetSettingsView.xaml.cs delete mode 100644 Hyperbar.Widget.Windows/WidgetSettingsViewModel.cs rename Hyperbar/{ConfigurationValueChangedNotification.cs => ConfigurationChangedPublisher.cs} (76%) rename Hyperbar/{IConfigurationValueChangedNotification.cs => IConfigurationChangedPublisher.cs} (52%) create mode 100644 Hyperbar/ValueViewModel.cs diff --git a/Hyperbar.UI.Windows/ContentControlHandler.cs b/Hyperbar.UI.Windows/ContentControlHandler.cs new file mode 100644 index 0000000..ced9765 --- /dev/null +++ b/Hyperbar.UI.Windows/ContentControlHandler.cs @@ -0,0 +1,19 @@ +using Microsoft.UI.Xaml.Controls; + +namespace Hyperbar.UI.Windows; + +public class ContentControlHandler(IViewModelContentBinder viewModelContentBinder) : + INavigationHandler +{ + public Task Handle(Navigate args, + CancellationToken cancellationToken) + { + if (args.Target is ContentControl contentControl) + { + contentControl.Content = args.View; + contentControl.DataContext = args.ViewModel; + } + + return Task.CompletedTask; + } +} diff --git a/Hyperbar.UI.Windows/WindowHandler.cs b/Hyperbar.UI.Windows/WindowHandler.cs index 50b7c0a..f5032ff 100644 --- a/Hyperbar.UI.Windows/WindowHandler.cs +++ b/Hyperbar.UI.Windows/WindowHandler.cs @@ -1,23 +1,7 @@ using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; namespace Hyperbar.UI.Windows; -public class ContentControlHandler(IViewModelContentBinder viewModelContentBinder) : - INavigationHandler -{ - public Task Handle(Navigate args, - CancellationToken cancellationToken) - { - if (args.Target is ContentControl contentControl) - { - contentControl.Content = args.View; - } - - return Task.CompletedTask; - } -} - public class WindowHandler(IViewModelContentBinder viewModelContentBinder) : INavigationHandler { diff --git a/Hyperbar.Widget.Windows/Hyperbar.Widget.Windows.csproj b/Hyperbar.Widget.Windows/Hyperbar.Widget.Windows.csproj index 60a862b..550e850 100644 --- a/Hyperbar.Widget.Windows/Hyperbar.Widget.Windows.csproj +++ b/Hyperbar.Widget.Windows/Hyperbar.Widget.Windows.csproj @@ -8,9 +8,9 @@ enable + + - - @@ -24,7 +24,7 @@ - + $(DefaultXamlRuntime) Designer @@ -32,7 +32,7 @@ $(DefaultXamlRuntime) Designer - + $(DefaultXamlRuntime) Designer diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs index 5286d82..21224db 100644 --- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs @@ -36,8 +36,8 @@ public static class IServiceCollectionExtensions services.AddContentTemplate(); services.AddContentTemplate(); - services.AddContentTemplate(); - services.AddContentTemplate("WidgetSettings"); + services.AddContentTemplate(); + services.AddContentTemplate("WidgetSettings"); }))); return services; diff --git a/Hyperbar.Widget.Windows/WidgetSettingsNavigationView.xaml b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationView.xaml similarity index 90% rename from Hyperbar.Widget.Windows/WidgetSettingsNavigationView.xaml rename to Hyperbar.Widget.Windows/WidgetConfigurationNavigationView.xaml index 105c47b..c1cbeb9 100644 --- a/Hyperbar.Widget.Windows/WidgetSettingsNavigationView.xaml +++ b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationView.xaml @@ -1,6 +1,6 @@ + public WidgetConfigurationNavigationView() => InitializeComponent(); } diff --git a/Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModel.cs b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModel.cs similarity index 75% rename from Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModel.cs rename to Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModel.cs index b960ca8..5127562 100644 --- a/Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModel.cs +++ b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModel.cs @@ -1,6 +1,6 @@ namespace Hyperbar.Widget.Windows; -public class WidgetSettingsNavigationViewModel(IServiceProvider serviceProvider, +public class WidgetConfigurationNavigationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, ISubscriber subscriber, diff --git a/Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModelEnumerator.cs b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModelEnumerator.cs similarity index 51% rename from Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModelEnumerator.cs rename to Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModelEnumerator.cs index 8bd2d14..6f3f446 100644 --- a/Hyperbar.Widget.Windows/WidgetSettingsNavigationViewModelEnumerator.cs +++ b/Hyperbar.Widget.Windows/WidgetConfigurationNavigationViewModelEnumerator.cs @@ -2,19 +2,19 @@ namespace Hyperbar.Widget.Windows; -public class WidgetSettingsNavigationViewModelEnumerator(IPublisher publisher, +public class WidgetConfigurationNavigationViewModelEnumerator(IPublisher publisher, IWidgetHostCollection widgetHosts) : - INotificationHandler> + INotificationHandler> { - public async Task Handle(Enumerate args, + public async Task Handle(Enumerate args, CancellationToken cancellationToken = default) { foreach (IWidgetHost host in widgetHosts) { if (host.Services.GetService() is IServiceFactory serviceFactory) { - await publisher.PublishAsync(new Create(serviceFactory - .Create(host.Configuration.Name)), + await publisher.PublishAsync(new Create(serviceFactory + .Create(host.Configuration.Name)), nameof(WidgetNavigationViewModel), cancellationToken); } } diff --git a/Hyperbar.Widget.Windows/WidgetSettingsView.xaml b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml similarity index 63% rename from Hyperbar.Widget.Windows/WidgetSettingsView.xaml rename to Hyperbar.Widget.Windows/WidgetConfigurationView.xaml index 1e55049..c28adff 100644 --- a/Hyperbar.Widget.Windows/WidgetSettingsView.xaml +++ b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml @@ -1,9 +1,7 @@ - - - + diff --git a/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml.cs b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml.cs new file mode 100644 index 0000000..ba2fed5 --- /dev/null +++ b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml.cs @@ -0,0 +1,12 @@ +using Microsoft.UI.Xaml.Controls; + +namespace Hyperbar.Widget.Windows; + +public partial class WidgetConfigurationView : UserControl +{ + public WidgetConfigurationView() => + InitializeComponent(); + + protected WidgetConfigurationViewModel ViewModel => + (WidgetConfigurationViewModel)DataContext; +} diff --git a/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs new file mode 100644 index 0000000..a1b2bc9 --- /dev/null +++ b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs @@ -0,0 +1,51 @@ +using Hyperbar.UI.Windows; + +namespace Hyperbar.Widget.Windows; + +public class WidgetConfigurationViewModel : + ValueViewModel, + INotificationHandler> + where TConfiguration : + class +{ + private readonly Func valueFactory; + + public WidgetConfigurationViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + IDisposer disposer, + Func valueFactory) : base(serviceProvider, serviceFactory, publisher, disposer) + { + this.valueFactory = valueFactory; + } + + public Task Handle(Changed args, + CancellationToken cancellationToken = default) + { + if (args.Value is TConfiguration configuration) + { + valueFactory.Invoke(configuration); + } + + return Task.CompletedTask; + } +} + +public class WidgetConfigurationViewModel : + ObservableCollectionViewModel +{ + public WidgetConfigurationViewModel(IViewModelTemplateSelector viewModelTemplateSelector, + IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + ViewModelTemplateSelector = viewModelTemplateSelector; + + Add>((Func)(config => config.Value)); + } + + public IViewModelTemplateSelector ViewModelTemplateSelector { get; } +} \ No newline at end of file diff --git a/Hyperbar.Widget.Windows/WidgetNavigationViewModel.cs b/Hyperbar.Widget.Windows/WidgetNavigationViewModel.cs index d2b774e..a455808 100644 --- a/Hyperbar.Widget.Windows/WidgetNavigationViewModel.cs +++ b/Hyperbar.Widget.Windows/WidgetNavigationViewModel.cs @@ -10,7 +10,7 @@ public class WidgetNavigationViewModel(IViewModelTemplateSelector viewModelTempl ISubscriber subscriber, IDisposer disposer, string text) : - NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text) + NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text) { public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector; } diff --git a/Hyperbar.Widget.Windows/WidgetSettingsView.xaml.cs b/Hyperbar.Widget.Windows/WidgetSettingsView.xaml.cs deleted file mode 100644 index 11ecda5..0000000 --- a/Hyperbar.Widget.Windows/WidgetSettingsView.xaml.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.UI.Xaml.Controls; - -namespace Hyperbar.Widget.Windows; - -public partial class WidgetSettingsView : UserControl -{ - public WidgetSettingsView() => - InitializeComponent(); - - protected WidgetSettingsViewModel ViewModel => - (WidgetSettingsViewModel)DataContext; -} diff --git a/Hyperbar.Widget.Windows/WidgetSettingsViewModel.cs b/Hyperbar.Widget.Windows/WidgetSettingsViewModel.cs deleted file mode 100644 index 8ad3f88..0000000 --- a/Hyperbar.Widget.Windows/WidgetSettingsViewModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Hyperbar.UI.Windows; - -namespace Hyperbar.Widget.Windows; - -public class WidgetSettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector, - IServiceProvider serviceProvider, - IServiceFactory serviceFactory, - IPublisher publisher, - ISubscriber subscriber, - IDisposer disposer) : - ObservableCollectionViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) -{ - public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector; -} \ No newline at end of file diff --git a/Hyperbar.Widget.Windows/WidgetView.xaml b/Hyperbar.Widget.Windows/WidgetView.xaml index 9cabeb0..8630cf1 100644 --- a/Hyperbar.Widget.Windows/WidgetView.xaml +++ b/Hyperbar.Widget.Windows/WidgetView.xaml @@ -5,23 +5,21 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" xmlns:interactivity="using:Microsoft.Xaml.Interactivity"> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetBuilder.cs b/Hyperbar.Widget/WidgetBuilder.cs index 60eda81..6f191b1 100644 --- a/Hyperbar.Widget/WidgetBuilder.cs +++ b/Hyperbar.Widget/WidgetBuilder.cs @@ -42,7 +42,7 @@ public class WidgetBuilder : services.AddSingleton(); services.AddHandler(); - services.AddValueChangedNotification((config) => (args) => { args.Value = config.IsEnabled; diff --git a/Hyperbar.Widget/WidgetConfigurationHandler.cs b/Hyperbar.Widget/WidgetConfigurationHandler.cs index 7493954..c374131 100644 --- a/Hyperbar.Widget/WidgetConfigurationHandler.cs +++ b/Hyperbar.Widget/WidgetConfigurationHandler.cs @@ -1,7 +1,7 @@ namespace Hyperbar.Widget; -public class WidgetConfigurationHandler(IEnumerable> - configurationValueChangedNotifications ) : +public class WidgetConfigurationHandler(IEnumerable> + configurationValueChangedNotifications) : INotificationHandler> { public async Task Handle(Changed args, @@ -9,7 +9,7 @@ public class WidgetConfigurationHandler(IEnumerable notification in + foreach (IConfigurationChangedPublisher notification in configurationValueChangedNotifications) { await notification.PublishAsync(configuration); diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index de43f5e..207961a 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -63,7 +63,7 @@ public partial class App : services.AddContentTemplate(); services.AddContentTemplate(); - services.AddHandler(); + services.AddHandler(); services.AddTransient(); }) .Build(); diff --git a/Hyperbar/ConfigurationValueChangedNotification.cs b/Hyperbar/ConfigurationChangedPublisher.cs similarity index 76% rename from Hyperbar/ConfigurationValueChangedNotification.cs rename to Hyperbar/ConfigurationChangedPublisher.cs index e76e724..f2b9c66 100644 --- a/Hyperbar/ConfigurationValueChangedNotification.cs +++ b/Hyperbar/ConfigurationChangedPublisher.cs @@ -1,8 +1,8 @@ namespace Hyperbar; -public class ConfigurationValueChangedNotification(IPublisher publisher, +public class ConfigurationChangedPublisher(IPublisher publisher, Func> factory) : - IConfigurationValueChangedNotification + IConfigurationChangedPublisher where TConfiguration : class where TValue : diff --git a/Hyperbar/IConfigurationValueChangedNotification.cs b/Hyperbar/IConfigurationChangedPublisher.cs similarity index 52% rename from Hyperbar/IConfigurationValueChangedNotification.cs rename to Hyperbar/IConfigurationChangedPublisher.cs index 9a6bdae..9701217 100644 --- a/Hyperbar/IConfigurationValueChangedNotification.cs +++ b/Hyperbar/IConfigurationChangedPublisher.cs @@ -1,6 +1,6 @@ namespace Hyperbar; -public interface IConfigurationValueChangedNotification +public interface IConfigurationChangedPublisher { Task PublishAsync(TConfiguration configuration); } diff --git a/Hyperbar/IServiceCollectionExtensions.cs b/Hyperbar/IServiceCollectionExtensions.cs index 512016f..4cd7c54 100644 --- a/Hyperbar/IServiceCollectionExtensions.cs +++ b/Hyperbar/IServiceCollectionExtensions.cs @@ -10,15 +10,15 @@ namespace Hyperbar; public static class IServiceCollectionExtensions { - public static IServiceCollection AddValueChangedNotification(this IServiceCollection services, + public static IServiceCollection AddConfigurationChanged(this IServiceCollection services, Func> factory) where TConfiguration : class where TValue : class, new() { - services.AddSingleton>(provider => - new ConfigurationValueChangedNotification(provider.GetRequiredService(), + services.AddSingleton>(provider => + new ConfigurationChangedPublisher(provider.GetRequiredService(), factory)); return services; diff --git a/Hyperbar/ObservableCollectionViewModel.cs b/Hyperbar/ObservableCollectionViewModel.cs index b1cd765..6a84155 100644 --- a/Hyperbar/ObservableCollectionViewModel.cs +++ b/Hyperbar/ObservableCollectionViewModel.cs @@ -7,7 +7,6 @@ using System.Reactive.Disposables; using System.Windows.Input; namespace Hyperbar; - public partial class ObservableCollectionViewModel : ObservableObject, IObservableCollectionViewModel, diff --git a/Hyperbar/ValueViewModel.cs b/Hyperbar/ValueViewModel.cs new file mode 100644 index 0000000..6671834 --- /dev/null +++ b/Hyperbar/ValueViewModel.cs @@ -0,0 +1,10 @@ +namespace Hyperbar; + +public partial class ValueViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + IDisposer disposer) : + ObservableViewModel(serviceProvider, serviceFactory, publisher, disposer) +{ + public TValue? Value { get; set; } +}