diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs index 27a86d8..a77afce 100644 --- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs @@ -39,7 +39,7 @@ public static class IServiceCollectionExtensions services.AddContentTemplate(); services.AddContentTemplate("WidgetSettings"); - services.AddContentTemplate, WidgetAvailabilityConfigurationView>(); + services.AddContentTemplate, WidgetToggleConfigurationView>(); }))); return services; diff --git a/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml index 50d4165..4d84ba1 100644 --- a/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml +++ b/Hyperbar.Widget.Windows/WidgetConfigurationView.xaml @@ -3,5 +3,5 @@ x:Class="Hyperbar.Widget.Windows.WidgetConfigurationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - + diff --git a/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs index a1b2bc9..56ead0d 100644 --- a/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs +++ b/Hyperbar.Widget.Windows/WidgetConfigurationViewModel.cs @@ -1,22 +1,47 @@ -using Hyperbar.UI.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using Hyperbar.UI.Windows; namespace Hyperbar.Widget.Windows; -public class WidgetConfigurationViewModel : +public partial class WidgetConfigurationViewModel : ValueViewModel, INotificationHandler> where TConfiguration : class { - private readonly Func valueFactory; + private readonly Func read; + + [ObservableProperty] + private string? description; + + [ObservableProperty] + private string? title; public WidgetConfigurationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, IDisposer disposer, - Func valueFactory) : base(serviceProvider, serviceFactory, publisher, disposer) + ISubscriber subscriber, + string? title, + Func read) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { - this.valueFactory = valueFactory; + this.title = title; + this.read = read; + } + + public WidgetConfigurationViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + IDisposer disposer, + ISubscriber subscriber, + string? title, + string? description, + Func read) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + { + this.title = title; + this.description = description; + + this.read = read; } public Task Handle(Changed args, @@ -24,7 +49,7 @@ public class WidgetConfigurationViewModel : { if (args.Value is TConfiguration configuration) { - valueFactory.Invoke(configuration); + Value = read.Invoke(configuration); } return Task.CompletedTask; @@ -44,7 +69,7 @@ public class WidgetConfigurationViewModel : ViewModelTemplateSelector = viewModelTemplateSelector; Add>((Func)(config => config.Value)); + bool>>("Widget", (Func)(config => config.Value)); } public IViewModelTemplateSelector ViewModelTemplateSelector { get; } diff --git a/Hyperbar.Widget.Windows/WidgetSplitButtonView.xaml.cs b/Hyperbar.Widget.Windows/WidgetSplitButtonView.xaml.cs index 6a6137d..abec49d 100644 --- a/Hyperbar.Widget.Windows/WidgetSplitButtonView.xaml.cs +++ b/Hyperbar.Widget.Windows/WidgetSplitButtonView.xaml.cs @@ -5,5 +5,6 @@ namespace Hyperbar.Widget.Windows; public sealed partial class WidgetSplitButtonView : UserControl { - public WidgetSplitButtonView() => InitializeComponent(); + public WidgetSplitButtonView() => + InitializeComponent(); } diff --git a/Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml b/Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml similarity index 54% rename from Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml rename to Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml index 41980bc..c600b57 100644 --- a/Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml +++ b/Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml @@ -1,7 +1,10 @@ + Description="{Binding Description}" + Header="{Binding Title}"> + + diff --git a/Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml.cs b/Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml.cs similarity index 51% rename from Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml.cs rename to Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml.cs index fb057c1..c0d67b9 100644 --- a/Hyperbar.Widget.Windows/WidgetAvailabilityConfigurationView.xaml.cs +++ b/Hyperbar.Widget.Windows/WidgetToggleConfigurationView.xaml.cs @@ -2,9 +2,9 @@ using CommunityToolkit.WinUI.Controls; namespace Hyperbar.Widget.Windows; -public sealed partial class WidgetAvailabilityConfigurationView : +public sealed partial class WidgetToggleConfigurationView : SettingsCard { - public WidgetAvailabilityConfigurationView() => + public WidgetToggleConfigurationView() => InitializeComponent(); } diff --git a/Hyperbar.Widget.Windows/WidgetView.xaml.cs b/Hyperbar.Widget.Windows/WidgetView.xaml.cs index 92c46ef..58714fd 100644 --- a/Hyperbar.Widget.Windows/WidgetView.xaml.cs +++ b/Hyperbar.Widget.Windows/WidgetView.xaml.cs @@ -6,5 +6,6 @@ public sealed partial class WidgetView : UserControl, IWidgetView { - public WidgetView() => InitializeComponent(); + public WidgetView() => + InitializeComponent(); } \ No newline at end of file diff --git a/Hyperbar.Windows/SettingsButtonViewModel.cs b/Hyperbar.Windows/SettingsButtonViewModel.cs index d32c6e8..9259d47 100644 --- a/Hyperbar.Windows/SettingsButtonViewModel.cs +++ b/Hyperbar.Windows/SettingsButtonViewModel.cs @@ -6,8 +6,9 @@ public partial class SettingsButtonViewModel(IViewModelTemplateSelector viewMode IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, + ISubscriber subscriber, IDisposer disposer) : - ObservableViewModel(serviceProvider, serviceFactory, publisher, disposer) + ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) { public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector; } \ No newline at end of file diff --git a/Hyperbar/ObservableViewModel.cs b/Hyperbar/ObservableViewModel.cs index 6410c8c..c7bfb85 100644 --- a/Hyperbar/ObservableViewModel.cs +++ b/Hyperbar/ObservableViewModel.cs @@ -4,30 +4,41 @@ using System.Windows.Input; namespace Hyperbar; -public class ObservableViewModel(IServiceProvider serviceProvider, - IServiceFactory serviceFactory, - IPublisher publisher, - IDisposer disposer) : +public class ObservableViewModel : ObservableObject, IObservableViewModel { private bool isInitialized; - public IDisposer Disposer => disposer; + public ObservableViewModel(IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) + { + ServiceProvider = serviceProvider; + ServiceFactory = serviceFactory; + Publisher = publisher; + Disposer = disposer; + + subscriber.Add(this); + } + + public IDisposer Disposer { get; } public ICommand InitializeCommand => new AsyncRelayCommand(CoreInitializeAsync); - public IPublisher Publisher => publisher; + public IPublisher Publisher { get; } - public IServiceFactory ServiceFactory => serviceFactory; + public IServiceFactory ServiceFactory { get; } - public IServiceProvider ServiceProvider => serviceProvider; + public IServiceProvider ServiceProvider { get; } public void Dispose() { GC.SuppressFinalize(this); - disposer.Dispose(this); + Disposer.Dispose(this); } public virtual Task InitializeAsync() => Task.CompletedTask; diff --git a/Hyperbar/SubscriptionManager.cs b/Hyperbar/SubscriptionManager.cs index e6bfe5d..e31fb11 100644 --- a/Hyperbar/SubscriptionManager.cs +++ b/Hyperbar/SubscriptionManager.cs @@ -7,7 +7,7 @@ public class SubscriptionManager(SubscriptionCollection subscriptions) : { public IEnumerable GetHandlers(Type notificationType, object key) { - if (subscriptions.TryGetValue($"{key?.ToString()}:{notificationType}", + if (subscriptions.TryGetValue($"{(key is not null ? $"{key}:" : "")}{notificationType}", out List? subscribers)) { foreach (WeakReference weakRef in subscribers.ToArray()) diff --git a/Hyperbar/ValueViewModel.cs b/Hyperbar/ValueViewModel.cs index 6671834..a0e7078 100644 --- a/Hyperbar/ValueViewModel.cs +++ b/Hyperbar/ValueViewModel.cs @@ -1,10 +1,14 @@ -namespace Hyperbar; +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Hyperbar; public partial class ValueViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, + ISubscriber subscriber, IDisposer disposer) : - ObservableViewModel(serviceProvider, serviceFactory, publisher, disposer) + ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) { - public TValue? Value { get; set; } + [ObservableProperty] + private TValue? value; }