From e7337280223d5b721dfa89a02adff9fb9fbc094f Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 19 May 2024 14:18:08 +0100 Subject: [PATCH] Add contextual commands --- Bitvault.Avalonia/App.axaml.cs | 4 +- Bitvault.Avalonia/ContainerView.axaml | 8 +--- Bitvault.Avalonia/CreateItemActionView.axaml | 4 -- Bitvault.Avalonia/ItemNavigationView.axaml | 8 +--- ...s => AggerateContainerViewModelHandler.cs} | 7 ++-- ...ler.cs => AggerateMainViewModelHandler.cs} | 8 ++-- Bitvault/ArchiveItemActionViewModel.cs | 3 +- Bitvault/CommandCollection.cs | 12 ++++++ Bitvault/ContainerViewModel.cs | 17 ++------- Bitvault/ItemCommandHeaderViewModel.cs | 38 +++++++++++-------- Bitvault/ItemViewModel.cs | 22 ++++------- 11 files changed, 60 insertions(+), 71 deletions(-) rename Bitvault/{EnumerateContainerViewModelHandler.cs => AggerateContainerViewModelHandler.cs} (85%) rename Bitvault/{MainViewModelHandler.cs => AggerateMainViewModelHandler.cs} (75%) create mode 100644 Bitvault/CommandCollection.cs diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 74bc733..481049c 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -83,7 +83,7 @@ public partial class App : Application services.AddScoped(); services.AddTemplate("Container"); - services.AddHandler(); + services.AddHandler(); services.AddTemplate(); services.AddTemplate("ContainerHeader"); @@ -119,7 +119,7 @@ public partial class App : Application services.AddInitializer(); services.AddTemplate("Main"); - services.AddHandler(); + services.AddHandler(); services.AddTransient(); diff --git a/Bitvault.Avalonia/ContainerView.axaml b/Bitvault.Avalonia/ContainerView.axaml index 703f224..e8c014f 100644 --- a/Bitvault.Avalonia/ContainerView.axaml +++ b/Bitvault.Avalonia/ContainerView.axaml @@ -47,12 +47,8 @@ BorderThickness="1,1,0,0" CornerRadius="8 0 0 0"> - - + + diff --git a/Bitvault.Avalonia/CreateItemActionView.axaml b/Bitvault.Avalonia/CreateItemActionView.axaml index 59aa433..66b4c04 100644 --- a/Bitvault.Avalonia/CreateItemActionView.axaml +++ b/Bitvault.Avalonia/CreateItemActionView.axaml @@ -15,10 +15,6 @@ ToolTip.Tip="Add item"> - - - - - - - + Scope="self" /> diff --git a/Bitvault/EnumerateContainerViewModelHandler.cs b/Bitvault/AggerateContainerViewModelHandler.cs similarity index 85% rename from Bitvault/EnumerateContainerViewModelHandler.cs rename to Bitvault/AggerateContainerViewModelHandler.cs index ce33150..0263308 100644 --- a/Bitvault/EnumerateContainerViewModelHandler.cs +++ b/Bitvault/AggerateContainerViewModelHandler.cs @@ -3,13 +3,14 @@ using Toolkit.Foundation; namespace Bitvault; -public class EnumerateContainerViewModelHandler(IMediator mediator, +public class AggerateContainerViewModelHandler(IMediator mediator, IServiceProvider serviceProvider, ICache cache, IPublisher publisher) : - INotificationHandler> + INotificationHandler> { - public async Task Handle(Enumerate args) + public async Task Handle(Aggerate args) { if (args.Options is ContainerViewModelConfiguration configuration) { diff --git a/Bitvault/MainViewModelHandler.cs b/Bitvault/AggerateMainViewModelHandler.cs similarity index 75% rename from Bitvault/MainViewModelHandler.cs rename to Bitvault/AggerateMainViewModelHandler.cs index 2c1cb47..b99a7a3 100644 --- a/Bitvault/MainViewModelHandler.cs +++ b/Bitvault/AggerateMainViewModelHandler.cs @@ -3,11 +3,11 @@ using Toolkit.Foundation; namespace Bitvault; -public class MainViewModelHandler(IPublisher publisher, +public class AggerateMainViewModelHandler(IPublisher publisher, IContainerHostCollection containers) : - INotificationHandler> + INotificationHandler> { - public Task Handle(EnumerateEventArgs args) + public Task Handle(AggerateEventArgs args) { foreach (IComponentHost container in containers.OrderBy(x => x.GetConfiguration() is ContainerConfiguration configuration ? configuration.Name : null)) @@ -18,7 +18,7 @@ public class MainViewModelHandler(IPublisher publisher, { if (factory.Create(configuration.Name) is ContainerNavigationViewModel viewModel) { - publisher.Publish(new CreateEventArgs(viewModel), + publisher.Publish(Create.As(viewModel), nameof(MainViewModel)); } } diff --git a/Bitvault/ArchiveItemActionViewModel.cs b/Bitvault/ArchiveItemActionViewModel.cs index e74a387..e3cde98 100644 --- a/Bitvault/ArchiveItemActionViewModel.cs +++ b/Bitvault/ArchiveItemActionViewModel.cs @@ -8,7 +8,8 @@ public partial class ArchiveItemActionViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), + IRemovable { [RelayCommand] public void Invoke() => Publisher.Publish(Archive.As()); diff --git a/Bitvault/CommandCollection.cs b/Bitvault/CommandCollection.cs new file mode 100644 index 0000000..23ad771 --- /dev/null +++ b/Bitvault/CommandCollection.cs @@ -0,0 +1,12 @@ +using System.Collections.ObjectModel; + +namespace Bitvault; + +public class CommandCollection : + ReadOnlyCollection +{ + public CommandCollection(IList list) : base(list) + { + + } +} diff --git a/Bitvault/ContainerViewModel.cs b/Bitvault/ContainerViewModel.cs index 933c498..81f0c0f 100644 --- a/Bitvault/ContainerViewModel.cs +++ b/Bitvault/ContainerViewModel.cs @@ -1,17 +1,8 @@ using CommunityToolkit.Mvvm.ComponentModel; -using Microsoft.EntityFrameworkCore; -using System.Collections.ObjectModel; using Toolkit.Foundation; namespace Bitvault; -public class ItemCommandCollection : ObservableCollection -{ - public void Add(IDisposable diposer) - { - - } -} [Enumerate(nameof(ContainerViewModel))] public partial class ContainerViewModel(IServiceProvider provider, @@ -48,7 +39,7 @@ public partial class ContainerViewModel(IServiceProvider provider, if (args.Value is Filter filter) { configuration = configuration with { Filter = filter.Value }; - Enumerate(); + Aggerate(); } return Task.CompletedTask; @@ -58,12 +49,12 @@ public partial class ContainerViewModel(IServiceProvider provider, if (args.Value is Search search) { configuration = configuration with { Query = search.Value }; - Enumerate(); + Aggerate(); } return Task.CompletedTask; } - protected override IEnumerate PrepareEnumeration(object? key) => - EnumerateEventArgs.With(configuration) with { Key = key }; + protected override IAggerate OnAggerate(object? key) => + AggerateEventArgs.With(configuration) with { Key = key }; } \ No newline at end of file diff --git a/Bitvault/ItemCommandHeaderViewModel.cs b/Bitvault/ItemCommandHeaderViewModel.cs index 1705326..58619e0 100644 --- a/Bitvault/ItemCommandHeaderViewModel.cs +++ b/Bitvault/ItemCommandHeaderViewModel.cs @@ -2,24 +2,30 @@ namespace Bitvault; -public partial class ItemCommandHeaderViewModel : ObservableCollection +public partial class ItemCommandHeaderViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + IContentTemplate template) : + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), + INotificationHandler> { - public ItemCommandHeaderViewModel(IServiceProvider provider, - IServiceFactory factory, - IMediator mediator, - IPublisher publisher, - ISubscription subscriber, - IDisposer disposer, - IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer) + public IContentTemplate Template { get; set; } = template; + + public Task Handle(NotifyEventArgs args) { - Add(); - Add(); - Add(); - Add(); - Add(); + Clear(); - Template = template; + if (args.Value is CommandCollection commandCollection) + { + foreach (IDisposable command in commandCollection) + { + Add(command); + } + } + + return Task.CompletedTask; } - - public IContentTemplate Template { get; set; } } \ No newline at end of file diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index de963f1..e53c7ca 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -1,33 +1,25 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; public partial class ItemViewModel : ObservableCollection { - [ObservableProperty] - private int? id; - - [ObservableProperty] - private bool immutable; - public ItemViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - IContentTemplate template, - bool immutable = true, - int? id = null, - string? name = null) : base(provider, factory, mediator, publisher, subscriber, disposer) + IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; - Id = id; - Immutable = immutable; - Add(immutable, name ?? ""); + Publisher.Publish(Notify.As(Factory.Create(new List + { + Factory.Create(), + Factory.Create(), + }))); } public IContentTemplate Template { get; set; }