using CommunityToolkit.Mvvm.ComponentModel; using Hyperbar.UI.Windows; using System.Collections.Concurrent; using System.Threading.Channels; namespace Hyperbar.Widget.Windows; public partial class WidgetConfigurationViewModel : ValueViewModel, INotificationHandler> where TConfiguration : class { private readonly Func read; private readonly Func write; [ObservableProperty] private string? description; [ObservableProperty] private string? title; public WidgetConfigurationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, IDisposer disposer, ISubscriber subscriber, string? title, Func read, Func write) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { this.title = title; this.read = read; this.write = write; } public WidgetConfigurationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, IDisposer disposer, ISubscriber subscriber, string? title, string? description, Func read, Func write) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { this.title = title; this.description = description; this.read = read; this.write = write; } public Task Handle(Changed args, CancellationToken cancellationToken = default) { if (args.Value is TConfiguration configuration) { Value = read.Invoke(configuration); } return Task.CompletedTask; } protected override void OnChanged(TValue? value) { base.OnChanged(value); } } 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>("Widget", (Func)(config => config.Value)); } public IViewModelTemplateSelector ViewModelTemplateSelector { get; } }