diff --git a/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj b/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj index 52c8d48..ec11b2b 100644 --- a/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj +++ b/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj @@ -11,6 +11,7 @@ + diff --git a/Hyperbar.UI.Windows/IViewModelTemplate.cs b/Hyperbar.UI.Windows/IViewModelTemplate.cs new file mode 100644 index 0000000..fa34338 --- /dev/null +++ b/Hyperbar.UI.Windows/IViewModelTemplate.cs @@ -0,0 +1,6 @@ +namespace Hyperbar.UI.Windows; + +public interface IViewModelTemplate +{ + +} diff --git a/Hyperbar.UI.Windows/NavigateAction.cs b/Hyperbar.UI.Windows/NavigateAction.cs new file mode 100644 index 0000000..eb7160b --- /dev/null +++ b/Hyperbar.UI.Windows/NavigateAction.cs @@ -0,0 +1,34 @@ +using Microsoft.UI.Xaml; +using Microsoft.Xaml.Interactivity; + +namespace Hyperbar.UI.Windows; + +public sealed class NavigateAction : + DependencyObject, + IAction +{ + public static readonly DependencyProperty PathProperty = + DependencyProperty.Register(nameof(Path), + typeof(string), typeof(NavigateAction), + new PropertyMetadata(null)); + + public string Path + { + get => (string)GetValue(PathProperty); + set => SetValue(PathProperty, value); + } + + public object Execute(object sender, object parameter) + { + if (sender is FrameworkElement frameworkElement) + { + if (frameworkElement.DataContext is IObservableViewModel observableViewModel) + { + observableViewModel.Mediator.PublishAsync(new Navigate(Path)) + .GetAwaiter().GetResult(); + } + } + + return true; + } +} diff --git a/Hyperbar.UI.Windows/ViewModelTemplate.cs b/Hyperbar.UI.Windows/ViewModelTemplate.cs new file mode 100644 index 0000000..01fe947 --- /dev/null +++ b/Hyperbar.UI.Windows/ViewModelTemplate.cs @@ -0,0 +1,32 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Markup; + +namespace Hyperbar.UI.Windows; + +public class ViewModelTemplate(IViewModelTemplateDescriptorProvider descriptors) : + DataTemplateSelector, + IViewModelTemplate +{ + protected override DataTemplate SelectTemplateCore(object item) + { + return descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor + ? CreateDataTemplate(descriptor) + : new DataTemplate(); + } + + protected override DataTemplate SelectTemplateCore(object item, + DependencyObject container) => + SelectTemplateCore(item); + + private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor) + { + string xamlString = @$" + + + "; + + return (DataTemplate)XamlReader.Load(xamlString); + } +} diff --git a/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs b/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs deleted file mode 100644 index 2462c27..0000000 --- a/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; - -namespace Hyperbar.UI.Windows; - -public class ViewModelTemplatePresenter : - ContentPresenter -{ - public ViewModelTemplatePresenter() - { - DataContextChanged += OnDataContextChanged; - } - - private void OnDataContextChanged(FrameworkElement sender, - DataContextChangedEventArgs args) - { - //if (DataContext is IViewModelTemplate templatedViewModel) - //{ - // Content = templatedViewModel.TemplateFactory - // .Create(DataContext.GetType().Name); - //} - } -} \ No newline at end of file diff --git a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs b/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs deleted file mode 100644 index ecf29ce..0000000 --- a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Markup; - -namespace Hyperbar.UI.Windows; - -public class ViewModelTemplate : - MarkupExtension -{ - protected override object ProvideValue(IXamlServiceProvider serviceProvider) => - new ViewModelTemplateSelector(); - - internal class ViewModelTemplateSelector : - DataTemplateSelector - { - protected override DataTemplate SelectTemplateCore(object item) => - item is IObservableViewModel observableViewModel && - observableViewModel.ServiceProvider.GetService() - is ViewModelTemplateDescriptorProvider descriptors && - descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor - ? CreateDataTemplate(descriptor) - : new DataTemplate(); - - protected override DataTemplate SelectTemplateCore(object item, - DependencyObject container) => - SelectTemplateCore(item); - - private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor) - { - string xamlString = @$" - - - "; - - return (DataTemplate)XamlReader.Load(xamlString); - } - } -} diff --git a/Hyperbar.UI.Windows/WindowHandler.cs b/Hyperbar.UI.Windows/WindowHandler.cs index 46f3054..31bad69 100644 --- a/Hyperbar.UI.Windows/WindowHandler.cs +++ b/Hyperbar.UI.Windows/WindowHandler.cs @@ -1,7 +1,19 @@ using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; namespace Hyperbar.UI.Windows; +public class FrameHandler : + INavigationHandler +{ + public Task Handle(Navigate args, + CancellationToken cancellationToken = default) + { + + return Task.CompletedTask; + } +} + public class WindowHandler : INavigationHandler { @@ -10,9 +22,19 @@ public class WindowHandler : { if (args.Template is Window window) { - if (window.Content is FrameworkElement frameworkElement) + if (window.Content is FrameworkElement content) { - frameworkElement.DataContext = args.Content; + void HandleClosed(object sender, WindowEventArgs args) + { + window.Closed -= HandleClosed; + if (content.DataContext is IObservableViewModel observableViewModel) + { + observableViewModel.Dispose(); + } + } + + window.Closed += HandleClosed; + content.DataContext = args.Content; } window.Activate(); diff --git a/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs index 4fac719..160945f 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs @@ -7,9 +7,8 @@ public partial class MediaButtonViewModel(IServiceProvider service IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, - IViewModelTemplateFactory templateFactory, IRelayCommand invokeCommand) : - WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory), + WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer), INotificationHandler>>, IMediaButtonViewModel { diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml index d04e50d..31df3e2 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml @@ -7,7 +7,7 @@ diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs index ed1cb29..877b618 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.Input; +using Hyperbar.UI.Windows; namespace Hyperbar.Widget.MediaController.Windows; @@ -6,17 +7,17 @@ namespace Hyperbar.Widget.MediaController.Windows; public class MediaControllerViewModel : ObservableCollectionViewModel { - public MediaControllerViewModel(IViewModelTemplateFactory templateFactory, + public MediaControllerViewModel(IViewModelTemplate template, IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer) { - TemplateFactory = templateFactory; + Template = template; Add(); - Add>(new RelayCommand(async () => + Add>(new RelayCommand(async () => await mediator.PublishAsync>())); Add>(new RelayCommand(async () => @@ -26,5 +27,5 @@ public class MediaControllerViewModel : await mediator.PublishAsync>())); } - public IViewModelTemplateFactory TemplateFactory { get; set; } + public IViewModelTemplate Template { get; } } \ No newline at end of file diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml index efb1c43..291e3b3 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml @@ -2,10 +2,9 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs index bc494cc..98ddf09 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs @@ -1,6 +1,8 @@ -namespace Hyperbar.Widget.MediaController.Windows; +using Hyperbar.UI.Windows; -public class MediaControllerWidgetViewModel(IViewModelTemplateFactory templateFactory, +namespace Hyperbar.Widget.MediaController.Windows; + +public class MediaControllerWidgetViewModel(IViewModelTemplate template, IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, @@ -9,5 +11,5 @@ public class MediaControllerWidgetViewModel(IViewModelTemplateFactory templateFa ObservableCollectionViewModel(serviceProvider, serviceFactory, mediator, disposer, items), IWidgetViewModel { - public IViewModelTemplateFactory TemplateFactory => templateFactory; + public IViewModelTemplate Template => template; } \ No newline at end of file diff --git a/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs index 03d67b2..8222829 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs @@ -5,9 +5,8 @@ namespace Hyperbar.Widget.MediaController.Windows; public partial class MediaInformationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, - IDisposer disposer, - IViewModelTemplateFactory templateFactory) : - WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory), + IDisposer disposer) : + WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer), INotificationHandler> { [ObservableProperty] diff --git a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs index 045d7a6..6cc2ca1 100644 --- a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs +++ b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs @@ -3,13 +3,9 @@ namespace Hyperbar.Widget.Primary.Windows; [NotificationHandler(nameof(PrimaryWidgetViewModel))] -public class PrimaryWidgetViewModel(IViewModelTemplateFactory templateFactory, - IServiceProvider serviceProvider, +public class PrimaryWidgetViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer) : ObservableCollectionViewModel(serviceProvider, serviceFactory, mediator, disposer), - IWidgetViewModel -{ - public IViewModelTemplateFactory TemplateFactory => templateFactory; -} \ No newline at end of file + IWidgetViewModel; \ No newline at end of file diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs index 6de350d..d4ece2f 100644 --- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ using Hyperbar.UI.Windows; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml.Markup; -using System.Collections.Generic; namespace Hyperbar.Widget.Windows; @@ -19,8 +18,8 @@ public static class IServiceCollectionExtensions services.AddSingleton(provider.GetRequiredService>()); services.AddSingleton(provider.GetRequiredService()); + services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddScoped(); services.AddHandler(); diff --git a/Hyperbar.Widget.Windows/WidgetView.xaml b/Hyperbar.Widget.Windows/WidgetView.xaml index 40e992c..f28a283 100644 --- a/Hyperbar.Widget.Windows/WidgetView.xaml +++ b/Hyperbar.Widget.Windows/WidgetView.xaml @@ -7,7 +7,7 @@ xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:ui="using:Hyperbar.UI.Windows"> - + diff --git a/Hyperbar.Widget/WidgetButtonViewModel.cs b/Hyperbar.Widget/WidgetButtonViewModel.cs index a729d9b..3f93d15 100644 --- a/Hyperbar.Widget/WidgetButtonViewModel.cs +++ b/Hyperbar.Widget/WidgetButtonViewModel.cs @@ -8,11 +8,10 @@ public partial class WidgetButtonViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, - IViewModelTemplateFactory templateFactory, Guid id, string? text = null, string? icon = null, - RelayCommand? invokeCommand = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory) + RelayCommand? invokeCommand = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer) { [ObservableProperty] private string? icon = icon; diff --git a/Hyperbar.Widget/WidgetComponentViewModel.cs b/Hyperbar.Widget/WidgetComponentViewModel.cs index a2731c3..7ef11e8 100644 --- a/Hyperbar.Widget/WidgetComponentViewModel.cs +++ b/Hyperbar.Widget/WidgetComponentViewModel.cs @@ -8,20 +8,16 @@ public partial class WidgetComponentViewModel : IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, - IViewModelTemplateFactory templateFactory, IEnumerable items) : base(serviceProvider, serviceFactory, mediator, disposer, items) { - TemplateFactory = templateFactory; + } public WidgetComponentViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, - IDisposer disposer, - IViewModelTemplateFactory templateFactory) : base(serviceProvider, serviceFactory, mediator, disposer) + IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer) { - TemplateFactory = templateFactory; - } - public IViewModelTemplateFactory TemplateFactory { get; private set; } + } } \ No newline at end of file diff --git a/Hyperbar.Widget/WidgetMenuViewModel.cs b/Hyperbar.Widget/WidgetMenuViewModel.cs index b5dc32b..bd893bc 100644 --- a/Hyperbar.Widget/WidgetMenuViewModel.cs +++ b/Hyperbar.Widget/WidgetMenuViewModel.cs @@ -8,11 +8,10 @@ public partial class WidgetMenuViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, - IViewModelTemplateFactory templateFactory, Guid id = default, string? text = null, string? icon = null, - RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory) + RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer) { [ObservableProperty] private IRelayCommand? click = command; diff --git a/Hyperbar.Widget/WidgetSplitButtonViewModel.cs b/Hyperbar.Widget/WidgetSplitButtonViewModel.cs index 406e61e..4213d4e 100644 --- a/Hyperbar.Widget/WidgetSplitButtonViewModel.cs +++ b/Hyperbar.Widget/WidgetSplitButtonViewModel.cs @@ -8,12 +8,11 @@ public partial class WidgetSplitButtonViewModel(IServiceProvider serviceProvider IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, - IViewModelTemplateFactory templateFactory, IEnumerable items, Guid id = default, string? text = null, string? icon = null, - RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory, items) + RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, items) { [ObservableProperty] private IRelayCommand? click = command; diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index 67107e6..27e8d32 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -37,9 +37,9 @@ public partial class App : services.AddHostedService(); services.AddSingleton(new Dispatcher(DispatcherQueue.GetForCurrentThread())); - + + services.AddTransient(); services.AddTransient(); - services.AddTransient(); services.AddHandler(); services.AddConfiguration(args => diff --git a/Hyperbar.Windows/ApplicationBarView.xaml b/Hyperbar.Windows/ApplicationBarView.xaml index e3aca94..71c71f1 100644 --- a/Hyperbar.Windows/ApplicationBarView.xaml +++ b/Hyperbar.Windows/ApplicationBarView.xaml @@ -17,7 +17,7 @@ diff --git a/Hyperbar.Windows/ApplicationBarViewModel.cs b/Hyperbar.Windows/ApplicationBarViewModel.cs index af7de74..77bd9a6 100644 --- a/Hyperbar.Windows/ApplicationBarViewModel.cs +++ b/Hyperbar.Windows/ApplicationBarViewModel.cs @@ -1,20 +1,23 @@ -namespace Hyperbar.Widget; +using Hyperbar.UI.Windows; + +namespace Hyperbar.Widget; + [NotificationHandler(nameof(IWidgetHostViewModel))] public partial class ApplicationBarViewModel : ObservableCollectionViewModel { - public ApplicationBarViewModel(IViewModelTemplateFactory templateFactory, + public ApplicationBarViewModel(IViewModelTemplate template, IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer) { - TemplateFactory = templateFactory; + Template = template; Add(0); Add(1); } - public IViewModelTemplateFactory TemplateFactory { get; } + public IViewModelTemplate Template { get; } } \ No newline at end of file diff --git a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml index 68d1872..9e0e388 100644 --- a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml +++ b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml @@ -3,4 +3,13 @@ x:Class="Hyperbar.Windows.GeneralSettingsNavigationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - Content="General" /> + xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity" + xmlns:ui="using:Hyperbar.UI.Windows" + Content="General"> + + + + + + diff --git a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs index d4fc51c..abad6e3 100644 --- a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs +++ b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs @@ -2,9 +2,12 @@ using Microsoft.UI.Xaml.Controls; namespace Hyperbar.Windows; -public sealed partial class GeneralSettingsNavigationView : +public partial class GeneralSettingsNavigationView : NavigationViewItem { public GeneralSettingsNavigationView() => InitializeComponent(); + + protected GeneralSettingsNavigationViewModel ViewModel => + (GeneralSettingsNavigationViewModel)DataContext; } diff --git a/Hyperbar.Windows/PrimaryView.xaml b/Hyperbar.Windows/PrimaryView.xaml index 410330d..28581af 100644 --- a/Hyperbar.Windows/PrimaryView.xaml +++ b/Hyperbar.Windows/PrimaryView.xaml @@ -6,7 +6,7 @@ xmlns:ui="using:Hyperbar.UI.Windows"> diff --git a/Hyperbar.Windows/PrimaryViewModel.cs b/Hyperbar.Windows/PrimaryViewModel.cs index 5781f40..6915cbc 100644 --- a/Hyperbar.Windows/PrimaryViewModel.cs +++ b/Hyperbar.Windows/PrimaryViewModel.cs @@ -1,9 +1,10 @@ using CommunityToolkit.Mvvm.ComponentModel; +using Hyperbar.UI.Windows; namespace Hyperbar.Widget; [NotificationHandler(nameof(IWidgetHostViewModel))] -public partial class PrimaryViewModel(IViewModelTemplateFactory templateFactory, +public partial class PrimaryViewModel(IViewModelTemplate template, IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, @@ -15,5 +16,6 @@ public partial class PrimaryViewModel(IViewModelTemplateFactory templateFactory, [ObservableProperty] private int index = index; - public IViewModelTemplateFactory TemplateFactory => templateFactory; + public IViewModelTemplate Template => template; + } \ No newline at end of file diff --git a/Hyperbar.Windows/SecondaryView.xaml b/Hyperbar.Windows/SecondaryView.xaml index 6b24637..4d5d1ef 100644 --- a/Hyperbar.Windows/SecondaryView.xaml +++ b/Hyperbar.Windows/SecondaryView.xaml @@ -5,7 +5,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="using:Hyperbar.UI.Windows"> - + diff --git a/Hyperbar.Windows/SecondaryViewModel.cs b/Hyperbar.Windows/SecondaryViewModel.cs index e44b7b3..e9190e3 100644 --- a/Hyperbar.Windows/SecondaryViewModel.cs +++ b/Hyperbar.Windows/SecondaryViewModel.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.ComponentModel; +using Hyperbar.UI.Windows; using Hyperbar.Windows; namespace Hyperbar.Widget; @@ -9,18 +10,19 @@ public partial class SecondaryViewModel : [ObservableProperty] private int index; - public SecondaryViewModel(IViewModelTemplateFactory templateFactory, + public SecondaryViewModel(IViewModelTemplate template, IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, IDisposer disposer, int index) : base(serviceProvider, serviceFactory, mediator, disposer) - { - TemplateFactory = templateFactory; + { + Template = template; this.index = index; Add(); } - public IViewModelTemplateFactory TemplateFactory { get; } + public IViewModelTemplate Template { get; } + } \ No newline at end of file diff --git a/Hyperbar.Windows/SettingsButtonView.xaml b/Hyperbar.Windows/SettingsButtonView.xaml index e99f889..7e1292d 100644 --- a/Hyperbar.Windows/SettingsButtonView.xaml +++ b/Hyperbar.Windows/SettingsButtonView.xaml @@ -2,7 +2,10 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity" + xmlns:windows="using:Hyperbar.UI.Windows"> @@ -18,8 +21,13 @@ Width="{ThemeResource ButtonWidth}" Height="{ThemeResource ButtonHeight}" Padding="{ThemeResource ButtonPadding}" - Command="{x:Bind ViewModel.InvokeCommand}" Content="" FontFamily="{ThemeResource SymbolThemeFontFamily}" - FontSize="16" /> + FontSize="16"> + + + + + + diff --git a/Hyperbar.Windows/SettingsButtonViewModel.cs b/Hyperbar.Windows/SettingsButtonViewModel.cs index 02ec649..2079251 100644 --- a/Hyperbar.Windows/SettingsButtonViewModel.cs +++ b/Hyperbar.Windows/SettingsButtonViewModel.cs @@ -1,24 +1,13 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; +using Hyperbar.UI.Windows; namespace Hyperbar.Windows; -public partial class SettingsButtonViewModel : - ObservableViewModel +public partial class SettingsButtonViewModel(IViewModelTemplate template, + IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IMediator mediator, + IDisposer disposer) : + ObservableViewModel(serviceProvider, serviceFactory, mediator, disposer) { - [ObservableProperty] - private IRelayCommand? invokeCommand; - - public SettingsButtonViewModel(IViewModelTemplateFactory templateFactory, - IServiceProvider serviceProvider, - IServiceFactory serviceFactory, - IMediator mediator, - IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer) - { - TemplateFactory = templateFactory; - InvokeCommand = new AsyncRelayCommand(async () => - await mediator.PublishAsync(new Navigate("Settings"))); - } - - public IViewModelTemplateFactory TemplateFactory { get; } -} + public IViewModelTemplate Template => template; +} \ No newline at end of file diff --git a/Hyperbar.Windows/SettingsView.xaml b/Hyperbar.Windows/SettingsView.xaml index f81082e..ae1d36c 100644 --- a/Hyperbar.Windows/SettingsView.xaml +++ b/Hyperbar.Windows/SettingsView.xaml @@ -2,9 +2,7 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> @@ -12,6 +10,6 @@ IsBackButtonVisible="Collapsed" IsPaneToggleButtonVisible="False" IsSettingsVisible="False" - MenuItemTemplateSelector="{ui:ViewModelTemplate}" + MenuItemTemplateSelector="{Binding Template}" MenuItemsSource="{x:Bind ViewModel, Mode=OneWay}" /> - + \ No newline at end of file diff --git a/Hyperbar.Windows/SettingsViewModel.cs b/Hyperbar.Windows/SettingsViewModel.cs index e1927cf..0a5111d 100644 --- a/Hyperbar.Windows/SettingsViewModel.cs +++ b/Hyperbar.Windows/SettingsViewModel.cs @@ -1,19 +1,21 @@ -namespace Hyperbar.Windows; +using Hyperbar.UI.Windows; + +namespace Hyperbar.Windows; public partial class SettingsViewModel : ObservableCollectionViewModel { - public SettingsViewModel(IServiceProvider serviceProvider, + public SettingsViewModel(IViewModelTemplate template, + IServiceProvider serviceProvider, IServiceFactory serviceFactory, IMediator mediator, - IDisposer disposer, - IViewModelTemplateFactory templateFactory) : base(serviceProvider, serviceFactory, mediator, disposer) + IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer) { + Template = template; + Add("General"); Add("Widgets"); - - TemplateFactory = templateFactory; } - public IViewModelTemplateFactory TemplateFactory { get; } + public IViewModelTemplate Template { get; } } diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml index 404d0e0..bd74876 100644 --- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml +++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml @@ -3,4 +3,13 @@ x:Class="Hyperbar.Windows.WidgetSettingsNavigationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - Content="Widgets" /> + xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity" + xmlns:ui="using:Hyperbar.UI.Windows" + Content="Widgets"> + + + + + + diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs index 3573a21..a4b17fb 100644 --- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs +++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs @@ -1,10 +1,14 @@ +using Hyperbar.Widget; using Microsoft.UI.Xaml.Controls; namespace Hyperbar.Windows; -public sealed partial class WidgetSettingsNavigationView : +public partial class WidgetSettingsNavigationView : NavigationViewItem { public WidgetSettingsNavigationView() => InitializeComponent(); + + protected WidgetSettingsNavigationViewModel ViewModel => + (WidgetSettingsNavigationViewModel)DataContext; } diff --git a/Hyperbar/Lifecycles/NavigateHandler.cs b/Hyperbar/Lifecycles/NavigateHandler.cs index d89e049..c249d07 100644 --- a/Hyperbar/Lifecycles/NavigateHandler.cs +++ b/Hyperbar/Lifecycles/NavigateHandler.cs @@ -5,7 +5,7 @@ namespace Hyperbar; public class NavigateHandler : INotificationHandler { - private readonly IEnumerable contentTemplateDescriptors; + private readonly IViewModelTemplateDescriptorProvider contentTemplateDescriptors; private readonly IServiceProvider provider; private readonly IMediator mediator; private readonly IEnumerable navigationDescriptors; @@ -13,7 +13,7 @@ public class NavigateHandler : public NavigateHandler(IServiceProvider provider, IMediator mediator, IEnumerable navigationDescriptors, - IEnumerable contentTemplateDescriptors) + IViewModelTemplateDescriptorProvider contentTemplateDescriptors) { this.provider = provider; this.mediator = mediator; @@ -24,7 +24,7 @@ public class NavigateHandler : public async Task Handle(Navigate args, CancellationToken cancellationToken) { - if (contentTemplateDescriptors.FirstOrDefault(x => x.Key == args.Key) + if (contentTemplateDescriptors.Get(args.Key) is IViewModelTemplateDescriptor contentTemplateDescriptor) { if (navigationDescriptors.FirstOrDefault(x => contentTemplateDescriptor.TemplateType == x.Type || diff --git a/Hyperbar/Templates/IViewModelTemplateFactory.cs b/Hyperbar/Templates/IViewModelTemplateFactory.cs deleted file mode 100644 index d46f917..0000000 --- a/Hyperbar/Templates/IViewModelTemplateFactory.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Hyperbar; - -public interface IViewModelTemplateFactory -{ - object? Create(object key); -} \ No newline at end of file diff --git a/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs b/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs index f80fc22..166c790 100644 --- a/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs +++ b/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs @@ -5,7 +5,7 @@ public class ViewModelTemplateDescriptorProvider(IEnumerable x.Key == key) + if (descriptors.FirstOrDefault(x => x.Key.Equals(key)) is IViewModelTemplateDescriptor descriptor) { return descriptor; diff --git a/Hyperbar/Templates/ViewModelTemplateFactory.cs b/Hyperbar/Templates/ViewModelTemplateFactory.cs deleted file mode 100644 index e2bf4e4..0000000 --- a/Hyperbar/Templates/ViewModelTemplateFactory.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Hyperbar; - -public class ViewModelTemplateFactory(IViewModelTemplateDescriptorProvider descriptors, - IServiceProvider services) : - IViewModelTemplateFactory -{ - public object? Create(object key) - { - if (descriptors.Get(key) - is IViewModelTemplateDescriptor descriptor) - { - if (services.GetRequiredKeyedService(descriptor.TemplateType, - descriptor.Key) is { } template) - { - return template; - } - } - - return default; - } -} \ No newline at end of file