From a49e2a8fae17329234c5df4d13ebf78a0b6926a6 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 5 May 2024 17:41:38 +0100 Subject: [PATCH] Improve vault navifaiton --- Bitvault.Avalonia/AllNavigationView.axaml | 9 ++++- Bitvault.Avalonia/ArchiveNavigationView.axaml | 9 ++++- Bitvault.Avalonia/StarredNavigationView.axaml | 9 ++++- Bitvault.Avalonia/VaultNavigationView.axaml | 9 +++-- Bitvault.Avalonia/VaultView.axaml | 8 ----- Bitvault/AllNavigationViewModel.cs | 16 ++------- Bitvault/ArchiveNavigationViewModel.cs | 16 ++------- Bitvault/CategoriesNavigationViewModel.cs | 12 ++----- Bitvault/FilterVaultNavigationViewModel.cs | 35 +++++++++++++++++++ Bitvault/OpenVaultViewModel.cs | 2 +- Bitvault/StarredNavigationViewModel.cs | 16 ++------- Bitvault/Vault.cs | 8 +++-- Bitvault/VaultCategory.cs | 3 -- Bitvault/VaultNavigationViewModel.cs | 31 +++++++++++----- Bitvault/VaultViewModel.cs | 12 +++++++ 15 files changed, 116 insertions(+), 79 deletions(-) create mode 100644 Bitvault/FilterVaultNavigationViewModel.cs delete mode 100644 Bitvault/VaultCategory.cs diff --git a/Bitvault.Avalonia/AllNavigationView.axaml b/Bitvault.Avalonia/AllNavigationView.axaml index 03e5e46..8a10fd3 100644 --- a/Bitvault.Avalonia/AllNavigationView.axaml +++ b/Bitvault.Avalonia/AllNavigationView.axaml @@ -8,7 +8,14 @@ IsSelected="{Binding Selected, Mode=TwoWay}"> - + + + + + + + + diff --git a/Bitvault.Avalonia/ArchiveNavigationView.axaml b/Bitvault.Avalonia/ArchiveNavigationView.axaml index 8ce53f7..2cd3b36 100644 --- a/Bitvault.Avalonia/ArchiveNavigationView.axaml +++ b/Bitvault.Avalonia/ArchiveNavigationView.axaml @@ -8,7 +8,14 @@ IsSelected="{Binding Selected, Mode=TwoWay}"> - + + + + + + + + diff --git a/Bitvault.Avalonia/StarredNavigationView.axaml b/Bitvault.Avalonia/StarredNavigationView.axaml index 7be3a08..7a4a441 100644 --- a/Bitvault.Avalonia/StarredNavigationView.axaml +++ b/Bitvault.Avalonia/StarredNavigationView.axaml @@ -8,7 +8,14 @@ IsSelected="{Binding Selected, Mode=TwoWay}"> - + + + + + + + + diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml b/Bitvault.Avalonia/VaultNavigationView.axaml index dbfbda3..5be01f8 100644 --- a/Bitvault.Avalonia/VaultNavigationView.axaml +++ b/Bitvault.Avalonia/VaultNavigationView.axaml @@ -6,7 +6,7 @@ x:Name="NavigationViewItem" x:DataType="vm:VaultNavigationViewModel" Content="{Binding Name}" - IsExpanded="{Binding Expanded, Mode=TwoWay}" + IsExpanded="{Binding Expanded}" IsSelected="{Binding Selected}" MenuItemsSource="{Binding}" NavigationViewItemExtension.IsItemClickEnabled="True" @@ -38,7 +38,7 @@ PropertyName="SelectsOnInvoked" TargetObject="{Binding #NavigationViewItem}" Value="False" /> - + @@ -46,7 +46,6 @@ - @@ -55,11 +54,11 @@ - + - + diff --git a/Bitvault.Avalonia/VaultView.axaml b/Bitvault.Avalonia/VaultView.axaml index 8d3a857..2afad88 100644 --- a/Bitvault.Avalonia/VaultView.axaml +++ b/Bitvault.Avalonia/VaultView.axaml @@ -35,13 +35,5 @@ ItemTemplate="{ReflectionBinding Template}" ItemsSource="{Binding}" /> - - - diff --git a/Bitvault/AllNavigationViewModel.cs b/Bitvault/AllNavigationViewModel.cs index 5121637..ce1b68f 100644 --- a/Bitvault/AllNavigationViewModel.cs +++ b/Bitvault/AllNavigationViewModel.cs @@ -1,6 +1,4 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; @@ -9,13 +7,5 @@ public partial class AllNavigationViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscriber subscriber, - IDisposer disposer) : - ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), - IVaultNavigationViewModel -{ - [ObservableProperty] - private bool selected; - - [RelayCommand] - public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("All"))); -} \ No newline at end of file + IDisposer disposer, + string name) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); diff --git a/Bitvault/ArchiveNavigationViewModel.cs b/Bitvault/ArchiveNavigationViewModel.cs index 2e10997..96467bd 100644 --- a/Bitvault/ArchiveNavigationViewModel.cs +++ b/Bitvault/ArchiveNavigationViewModel.cs @@ -1,6 +1,4 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; @@ -9,13 +7,5 @@ public partial class ArchiveNavigationViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscriber subscriber, - IDisposer disposer) : - ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), - IVaultNavigationViewModel -{ - [ObservableProperty] - private bool selected; - - [RelayCommand] - public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Archive"))); -} \ No newline at end of file + IDisposer disposer, + string name) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); \ No newline at end of file diff --git a/Bitvault/CategoriesNavigationViewModel.cs b/Bitvault/CategoriesNavigationViewModel.cs index 8f62447..11182fb 100644 --- a/Bitvault/CategoriesNavigationViewModel.cs +++ b/Bitvault/CategoriesNavigationViewModel.cs @@ -1,5 +1,4 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; @@ -8,10 +7,5 @@ public partial class CategoriesNavigationViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscriber subscriber, - IDisposer disposer) : - ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), - IVaultNavigationViewModel -{ - [ObservableProperty] - private bool selected; -} \ No newline at end of file + IDisposer disposer, + string name) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); \ No newline at end of file diff --git a/Bitvault/FilterVaultNavigationViewModel.cs b/Bitvault/FilterVaultNavigationViewModel.cs new file mode 100644 index 0000000..4a7a626 --- /dev/null +++ b/Bitvault/FilterVaultNavigationViewModel.cs @@ -0,0 +1,35 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class FilterVaultNavigationViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer, + string name) : + ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), + IVaultNavigationViewModel, + INotificationHandler>, + INotificationHandler> +{ + [ObservableProperty] + private bool activated; + + [ObservableProperty] + private bool selected; + + public Task Handle(Vault args, + CancellationToken cancellationToken = default) => + Task.FromResult(Activated = false); + + public Task Handle(Vault args, + CancellationToken cancellationToken = default) => + Task.FromResult(Activated = true); + + [RelayCommand] + public void Invoke() => Publisher.Publish(Vault.As(new Selected(name))); +} \ No newline at end of file diff --git a/Bitvault/OpenVaultViewModel.cs b/Bitvault/OpenVaultViewModel.cs index 1293b7d..5b1d38c 100644 --- a/Bitvault/OpenVaultViewModel.cs +++ b/Bitvault/OpenVaultViewModel.cs @@ -22,7 +22,7 @@ public partial class OpenVaultViewModel(IServiceProvider provider, { if (await Mediator.Handle, bool>(Open.As(new Vault(Password)))) { - await Publisher.Publish(); + await Publisher.Publish(Vault.As()); } } } diff --git a/Bitvault/StarredNavigationViewModel.cs b/Bitvault/StarredNavigationViewModel.cs index 79f28f2..8c906fc 100644 --- a/Bitvault/StarredNavigationViewModel.cs +++ b/Bitvault/StarredNavigationViewModel.cs @@ -1,6 +1,4 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; @@ -9,13 +7,5 @@ public partial class StarredNavigationViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscriber subscriber, - IDisposer disposer) : - ObservableViewModel(provider, factory, mediator, publisher, subscriber, disposer), - IVaultNavigationViewModel -{ - [ObservableProperty] - private bool selected; - - [RelayCommand] - public void Invoke() => Publisher.Publish(Changed.As(new VaultCategory("Starred"))); -} \ No newline at end of file + IDisposer disposer, + string name) : FilterVaultNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); \ No newline at end of file diff --git a/Bitvault/Vault.cs b/Bitvault/Vault.cs index 5f7e3ce..3a4bd4d 100644 --- a/Bitvault/Vault.cs +++ b/Bitvault/Vault.cs @@ -2,6 +2,8 @@ namespace Bitvault; +public record Vault(TValue? Value = default); + public record Vault { public Vault(string name, string password) @@ -16,10 +18,10 @@ public record Vault } - public Vault() - { + public static Vault As(TValue value) => new(value); + + public static Vault As() where TValue : new() => new(new TValue()); - } [MaybeNull] public string Name { get; } diff --git a/Bitvault/VaultCategory.cs b/Bitvault/VaultCategory.cs deleted file mode 100644 index eecc42e..0000000 --- a/Bitvault/VaultCategory.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace Bitvault; - -public record VaultCategory(string Name); diff --git a/Bitvault/VaultNavigationViewModel.cs b/Bitvault/VaultNavigationViewModel.cs index f946991..8e91d55 100644 --- a/Bitvault/VaultNavigationViewModel.cs +++ b/Bitvault/VaultNavigationViewModel.cs @@ -6,9 +6,14 @@ namespace Bitvault; public partial class VaultNavigationViewModel : ObservableCollectionViewModel, IMainNavigationViewModel, - INotificationHandler, - INotificationHandler + INotificationHandler>, + INotificationHandler>, + INotificationHandler>, + INotificationHandler> { + [ObservableProperty] + private bool activated; + [ObservableProperty] private bool expanded = true; @@ -36,22 +41,32 @@ public partial class VaultNavigationViewModel : public IContentTemplate Template { get; set; } - public Task Handle(Opened args, CancellationToken cancellationToken = default) + public Task Handle(Vault args, + CancellationToken cancellationToken = default) { - Add(); - Add(); - Add(); - Add(); + Add("All"); + Add("Starred"); + Add("Archive"); + Add("Categories"); Opened = true; return Task.CompletedTask; } - public Task Handle(Closed args, CancellationToken cancellationToken = default) + public Task Handle(Vault args, + CancellationToken cancellationToken = default) { Opened = true; Clear(); return Task.CompletedTask; } + + public Task Handle(Vault args, + CancellationToken cancellationToken = default) => + Task.FromResult(Activated = false); + + public Task Handle(Vault args, + CancellationToken cancellationToken = default) => + Task.FromResult(Activated = true); } \ No newline at end of file diff --git a/Bitvault/VaultViewModel.cs b/Bitvault/VaultViewModel.cs index 4fc8b61..eeb0cb2 100644 --- a/Bitvault/VaultViewModel.cs +++ b/Bitvault/VaultViewModel.cs @@ -12,4 +12,16 @@ public partial class VaultViewModel(IServiceProvider provider, IContentTemplate template) : ObservableCollectionViewModel(provider, factory, mediator, publisher, subscriber, disposer) { public IContentTemplate Template { get; set; } = template; + + public override async Task Activated() + { + await Publisher.Publish(Vault.As()); + await base.Activated(); + } + + public override async Task Deactivated() + { + await Publisher.Publish(Vault.As()); + await base.Deactivated(); + } } \ No newline at end of file