diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 0d88697..36e25d6 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -31,18 +31,13 @@ public partial class App : Application services.AddTemplate("MainWindow"); } + services.AddSingleton(); + services.AddTemplate("Main"); - services.AddHandler(); + services.AddHandler(); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - - services.AddTemplate("Vault"); - - services.AddConfiguration($"{nameof(VaultConfiguration)}:Personal"); + services.AddConfiguration(args => args.Name = "Personal", + $"{nameof(VaultConfiguration)}:Personal"); }) .Build(); diff --git a/Bitvault.Avalonia/MainWindow.axaml b/Bitvault.Avalonia/MainWindow.axaml index 64f1b8e..caddc6a 100644 --- a/Bitvault.Avalonia/MainWindow.axaml +++ b/Bitvault.Avalonia/MainWindow.axaml @@ -2,14 +2,16 @@ x:Class="Bitvault.Avalonia.MainWindow" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:vm="using:Bitvault" xmlns:windowing="using:FluentAvalonia.UI.Windowing" + x:DataType="vm:MainWindowViewModel" Background="Transparent" - TransparencyLevelHint="Mica"> - + diff --git a/Bitvault.Avalonia/MainWindow.axaml.cs b/Bitvault.Avalonia/MainWindow.axaml.cs index b4fb74a..5d5e479 100644 --- a/Bitvault.Avalonia/MainWindow.axaml.cs +++ b/Bitvault.Avalonia/MainWindow.axaml.cs @@ -10,5 +10,6 @@ public partial class MainWindow : AppWindow { InitializeComponent(); TitleBar.ExtendsContentIntoTitleBar = true; + TitleBar.TitleBarHitTestType = TitleBarHitTestType.Complex; } } diff --git a/Bitvault.Avalonia/VaultComponent.cs b/Bitvault.Avalonia/VaultComponent.cs index 3d16ac7..2bd9b7b 100644 --- a/Bitvault.Avalonia/VaultComponent.cs +++ b/Bitvault.Avalonia/VaultComponent.cs @@ -9,6 +9,12 @@ public class VaultComponent : ComponentBuilder.Create() .AddServices(services => { - + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + + services.AddTemplate("Vault"); }); } diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml b/Bitvault.Avalonia/VaultNavigationView.axaml index a36f646..a0b14ec 100644 --- a/Bitvault.Avalonia/VaultNavigationView.axaml +++ b/Bitvault.Avalonia/VaultNavigationView.axaml @@ -4,5 +4,5 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:Bitvault" x:DataType="vm:VaultNavigationViewModel" - Content="Test" + Content="{Binding Name}" MenuItemsSource="{Binding}" /> diff --git a/Bitvault/IMainNavigationViewModel.cs b/Bitvault/IMainNavigationViewModel.cs index cdc3f28..4f58127 100644 --- a/Bitvault/IMainNavigationViewModel.cs +++ b/Bitvault/IMainNavigationViewModel.cs @@ -1,4 +1,3 @@ namespace Bitvault; public interface IMainNavigationViewModel; - diff --git a/Bitvault/IVaultHostCollection.cs b/Bitvault/IVaultHostCollection.cs new file mode 100644 index 0000000..f8593b4 --- /dev/null +++ b/Bitvault/IVaultHostCollection.cs @@ -0,0 +1,9 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public interface IVaultHostCollection : + IEnumerable +{ + void Add(IComponentHost host); +} diff --git a/Bitvault/MainViewHandler.cs b/Bitvault/MainViewHandler.cs deleted file mode 100644 index bb14d25..0000000 --- a/Bitvault/MainViewHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Toolkit.Foundation; - -namespace Bitvault; - -public class MainViewHandler(IPublisher publisher, - IServiceFactory factory) : - INotificationHandler> -{ - public async Task Handle(Enumerate args, - CancellationToken cancellationToken = default) - { - - } -} \ No newline at end of file diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs index 3bab1eb..de69028 100644 --- a/Bitvault/MainViewModel.cs +++ b/Bitvault/MainViewModel.cs @@ -2,6 +2,7 @@ namespace Bitvault; +[Notification(nameof(MainViewModel))] public partial class MainViewModel : ObservableCollectionViewModel { @@ -13,7 +14,6 @@ public partial class MainViewModel : IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { Template = template; - Add(); } public IContentTemplate Template { get; set; } diff --git a/Bitvault/MainViewModelHandler.cs b/Bitvault/MainViewModelHandler.cs new file mode 100644 index 0000000..a3f323d --- /dev/null +++ b/Bitvault/MainViewModelHandler.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using Toolkit.Foundation; + +namespace Bitvault; + +public class MainViewModelHandler(IPublisher publisher, + IVaultHostCollection vaults) : + INotificationHandler> +{ + public async Task Handle(Enumerate args, + CancellationToken cancellationToken = default) + { + foreach (IComponentHost vault in vaults) + { + if (vault.Services.GetRequiredService() is VaultConfiguration configuration) + { + if (vault.Services.GetRequiredService() is IServiceFactory factory) + { + if (factory.Create(configuration.Name) is VaultNavigationViewModel viewModel) + { + await publisher.Publish(new Create(viewModel), + nameof(MainViewModel), cancellationToken); + } + } + } + } + } +} diff --git a/Bitvault/VaultComponentsInitializer.cs b/Bitvault/VaultComponentsInitializer.cs index 1829013..5dc00fc 100644 --- a/Bitvault/VaultComponentsInitializer.cs +++ b/Bitvault/VaultComponentsInitializer.cs @@ -5,7 +5,8 @@ namespace Bitvault; public class VaultComponentsInitializer(IServiceProvider provider, IProxyServiceCollection proxy, - IEnumerable> configurations) : IInitializer + IEnumerable> configurations, + IVaultHostCollection vaults) : IInitializer { public Task Initialize() { @@ -37,10 +38,11 @@ public class VaultComponentsInitializer(IServiceProvider provider, services.AddRange(proxy.Services); }); - builder.AddConfiguration(configuration.Section); - + builder.AddConfiguration(configuration.Section, configuration.Value); IComponentHost host = builder.Build(); host.StartAsync(); + + vaults.Add(host); } } diff --git a/Bitvault/VaultConfiguration.cs b/Bitvault/VaultConfiguration.cs index c137168..b8ecf7d 100644 --- a/Bitvault/VaultConfiguration.cs +++ b/Bitvault/VaultConfiguration.cs @@ -1,9 +1,8 @@ -using System.Text.Json.Serialization; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; public record VaultConfiguration : ComponentConfiguration { - + public string? Name { get; set; } } diff --git a/Bitvault/VaultHostCollection.cs b/Bitvault/VaultHostCollection.cs new file mode 100644 index 0000000..635bdc8 --- /dev/null +++ b/Bitvault/VaultHostCollection.cs @@ -0,0 +1,22 @@ +using System.Collections; +using Toolkit.Foundation; + +namespace Bitvault; + +public class VaultHostCollection : + IVaultHostCollection + +{ + private readonly List hosts = []; + + public void Add(IComponentHost host) + { + hosts.Add(host); + } + + public IEnumerator GetEnumerator() => + hosts.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => + hosts.GetEnumerator(); +} diff --git a/Bitvault/VaultNavigationViewModel.cs b/Bitvault/VaultNavigationViewModel.cs index 69eef58..e00f837 100644 --- a/Bitvault/VaultNavigationViewModel.cs +++ b/Bitvault/VaultNavigationViewModel.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using CommunityToolkit.Mvvm.ComponentModel; +using Toolkit.Foundation; namespace Bitvault; @@ -6,14 +7,19 @@ public partial class VaultNavigationViewModel : ObservableCollectionViewModel, IMainNavigationViewModel { + [ObservableProperty] + private string name; + public VaultNavigationViewModel(IServiceProvider serviceProvider, - IServiceFactory serviceFactory, + IServiceFactory serviceFactory, IPublisher publisher, ISubscriber subscriber, IDisposer disposer, - IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) + IContentTemplate template, + string name) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { Template = template; + Name = name; Add(); Add();