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