Fixed perf issues

This commit is contained in:
TheXamlGuy
2024-07-02 23:38:51 +01:00
parent 929d72e4e8
commit e1ffb541f6
29 changed files with 139 additions and 82 deletions
+8 -6
View File
@@ -142,7 +142,7 @@ public partial class App : Application
services.AddTemplate<WalletViewModel, WalletView>("Wallet");
services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ItemCollection");
services.AddHandler<SynchronizeItemCollectionViewModelHandler>();
services.AddHandler<ItemCollectionViewModelActivatedHandler>();
services.AddTemplate<WalletHeaderViewModel, WalletHeaderView>("WalletHeader");
services.AddTemplate<BackActionViewModel, BackActionView>();
@@ -151,15 +151,17 @@ public partial class App : Application
services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection");
services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>();
services.AddHandler<SynchronizeCategoriesNavigationViewModelHandler>();
services.AddHandler<CategoriesNavigationViewModelActivationHandler>();
services.AddHandler<SynchronizeItemCategoryViewModelHandler>();
services.AddHandler<ItemCategoryViewModelActivatedHandler>();
services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>();
services.AddTemplate<AddItemNavigationViewModel, AddItemNavigationView>();
services.AddTemplate<ItemNavigationViewModel, ItemNavigationView>();
services.AddHandler<ItemNavigationViewModelActivatedHandler>();
services.AddTemplate<EmptyItemCollectionViewModel, EmptyItemCollectionView>("EmptyItemCollection");
services.AddScoped<IDecoratorService<ItemHeaderConfiguration>, DecoratorService<ItemHeaderConfiguration>>();
@@ -170,8 +172,8 @@ public partial class App : Application
services.AddTemplate<ItemHeaderViewModel, ItemHeaderView>();
services.AddTemplate<ItemContentViewModel, ItemContentView>();
services.AddHandler<SynchronizeItemContentViewModelHandler>();
services.AddHandler<SynchronizeItemContentFromCategoryViewModelHandler>();
services.AddHandler<ItemContentViewModelActivationHandler>();
services.AddHandler<ItemContentFromCategoryViewModelActivationHandler>();
services.AddTemplate<ItemSectionViewModel, ItemSectionView>();
@@ -230,7 +232,7 @@ public partial class App : Application
services.AddHandler<CreateProfileImageHandler>();
services.AddTemplate<MainViewModel, MainView>("Main");
services.AddHandler<SynchronizeMainViewModelHandler>();
services.AddHandler<MainViewModelActivationHandler>();
services.AddTransient<FooterViewModel>();
+6 -3
View File
@@ -17,13 +17,16 @@
<Parameter Key="Name" Value="{Binding Name}" />
<Parameter Key="ImageDescriptor" Value="{Binding ImageDescriptor}" />
<Parameter Key="FromCategory" Value="{x:False}" />
<Parameter Key="Favourite" Value="{Binding Favourite}" />
<Parameter Key="Archived" Value="{Binding Archived}" />
<Parameter Key="Favourite" Value="{Binding IsFavourite}" />
<Parameter Key="Archived" Value="{Binding IsArchived}" />
<Parameter Key="State" Value="{x:Static vm:ItemState.Read}" />
<Parameter Key="IsBackStackEnabled" Value="{x:False}" />
<Parameter Key="ClearBackStack" Value="{x:True}" />
</NavigateAction>
</AttachedEventTriggerBehaviour>
<EventTriggerBehavior EventName="AttachedToVisualTree">
<InvokeCommandAction Command="{Binding AttachedCommand}" />
</EventTriggerBehavior>
</Interaction.Behaviors>
<Grid
Margin="0,6,6,6"
@@ -41,7 +44,7 @@
FontFamily="{DynamicResource FluentThemeFontFamily}"
FontSize="16"
Foreground="{DynamicResource StarredIconForegroundBrush}"
IsVisible="{Binding Favourite}"
IsVisible="{Binding IsFavourite}"
Text="&#xEF60;" />
</Grid>
<StackPanel Grid.Column="1" Margin="12,0,0,0">
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class ArchiveItemActionViewModel(IServiceProvider provider,
IRemovable
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Archive.As<Item>());
private void Invoke() => Publisher.Publish(Archive.As<Item>());
}
@@ -2,13 +2,13 @@
namespace Wallet;
public class SynchronizeCategoriesNavigationViewModelHandler(IMediator mediator,
public class CategoriesNavigationViewModelActivationHandler(IMediator mediator,
IItemConfigurationCollection configurations,
IServiceFactory serviceFactory,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<CategoryNavigationViewModel>>
INotificationHandler<ActivationEventArgs<CategoryNavigationViewModel>>
{
public async Task Handle(SynchronizeEventArgs<CategoryNavigationViewModel> args)
public async Task Handle(ActivationEventArgs<CategoryNavigationViewModel> args)
{
IReadOnlyCollection<(string Name, int Count)>? counts = await mediator.Handle<CountEventArgs<Item>,
IReadOnlyCollection<(string, int)>>(Count.As<Item>());
+3 -3
View File
@@ -19,13 +19,13 @@ public class ConfirmCreateItemHandler(IMediator mediator,
IImageDescriptor? imageDescriptor = headerConfiguration.ImageDescriptor;
Guid id = Guid.NewGuid();
Item<(Guid, string, string, IImageDescriptor?)> item = new((id, name, category, imageDescriptor));
publisher.Publish(Created.As(item));
await mediator.Handle<CreateEventArgs<(Guid, string, string, IImageDescriptor?,
ItemConfiguration)>, bool>(new CreateEventArgs<(Guid, string, string, IImageDescriptor?,
ItemConfiguration)>((id, name, category, imageDescriptor ?? default, itemConfiguration)));
Item<(Guid, string, string)> item = new((id, name, category));
publisher.Publish(Created.As(item));
publisher.Publish(Changed.As<Item>());
}
}
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class ConfirmItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Confirm.As<Item>());
private void Invoke() => Publisher.Publish(Confirm.As<Item>());
}
+2 -2
View File
@@ -58,11 +58,11 @@ public partial class CreateWalletViewModel :
}
[RelayCommand]
public async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
private async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
IImageDescriptor>(Create.As<ProfileImage>());
[RelayCommand]
public void Remove() => ImageDescriptor = null;
private void Remove() => ImageDescriptor = null;
protected override void OnPropertyChanged(PropertyChangedEventArgs args)
{
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class DeleteItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Delete.As<Item>());
private void Invoke() => Publisher.Publish(Delete.As<Item>());
}
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class DismissItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Cancel.As<Item>());
private void Invoke() => Publisher.Publish(Cancel.As<Item>());
}
+1 -1
View File
@@ -11,5 +11,5 @@ public partial class EditItemActionViewModel(IServiceProvider provider,
IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer)
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Update.As<Item>());
private void Invoke() => Publisher.Publish(Update.As<Item>());
}
+1 -1
View File
@@ -13,7 +13,7 @@ public partial class FavouriteItemActionViewModel(IServiceProvider provider,
IRemovable
{
[RelayCommand]
public void Invoke()
private void Invoke()
{
if (!Value)
{
+1 -1
View File
@@ -16,5 +16,5 @@ public partial class HyperlinkEntryViewModel(IServiceProvider provider,
double width) : ItemEntryViewModel<string>(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value, width)
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Create.As(new Hyperlink(Value)));
private void Invoke() => Publisher.Publish(Create.As(new Hyperlink(Value)));
}
+1 -4
View File
@@ -1,7 +1,4 @@
namespace Wallet;
public interface IItemViewModel :
IDisposable
{
}
IDisposable;
+1 -1
View File
@@ -23,5 +23,5 @@ public partial class ItemCategoryNavigationViewModel(IServiceProvider provider,
private bool isSelected = isSelected;
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new ItemCategory<string>(Name)));
private void Invoke() => Publisher.Publish(Notify.As(new ItemCategory<string>(Name)));
}
@@ -2,12 +2,12 @@
namespace Wallet;
public class SynchronizeItemCategoryViewModelHandler(IItemConfigurationCollection configurations,
public class ItemCategoryViewModelActivatedHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemCategoryNavigationViewModel>>
INotificationHandler<ActivationEventArgs<ItemCategoryNavigationViewModel>>
{
public Task Handle(SynchronizeEventArgs<ItemCategoryNavigationViewModel> args)
public Task Handle(ActivationEventArgs<ItemCategoryNavigationViewModel> args)
{
bool selected = true;
foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations)
+4 -4
View File
@@ -42,7 +42,7 @@ public partial class ItemCollectionViewModel :
if (args.Sender is Filter filter)
{
configuration = configuration with { Filter = filter.Value };
Synchronize(true);
Activate(true);
}
return Task.CompletedTask;
@@ -53,7 +53,7 @@ public partial class ItemCollectionViewModel :
if (args.Sender is Search<string> search)
{
configuration = configuration with { Query = search.Value };
Synchronize(true);
Activate(true);
}
return Task.CompletedTask;
@@ -69,6 +69,6 @@ public partial class ItemCollectionViewModel :
return base.OnActivated();
}
protected override SynchronizeExpression BuildAggregateExpression() =>
new(Toolkit.Foundation.Synchronize.As<ItemNavigationViewModel, ItemCollectionConfiguration>(configuration));
protected override ActivationBuilder ActivationBuilder() =>
new(Activation.As<ItemNavigationViewModel, ItemCollectionConfiguration>(configuration));
}
@@ -3,13 +3,13 @@ using Toolkit.Foundation;
namespace Wallet;
public class SynchronizeItemCollectionViewModelHandler(IMediator mediator,
public class ItemCollectionViewModelActivatedHandler(IMediator mediator,
IServiceProvider serviceProvider,
ICache<Item<(Guid, string)>> cache,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemNavigationViewModel, ItemCollectionConfiguration>>
INotificationHandler<ActivationEventArgs<ItemNavigationViewModel, ItemCollectionConfiguration>>
{
public async Task Handle(SynchronizeEventArgs<ItemNavigationViewModel,
public async Task Handle(ActivationEventArgs<ItemNavigationViewModel,
ItemCollectionConfiguration> args)
{
if (args.Value is ItemCollectionConfiguration configuration)
@@ -3,14 +3,14 @@ using Toolkit.Foundation;
namespace Wallet;
public class SynchronizeItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations,
public class ItemContentFromCategoryViewModelActivationHandler(IItemConfigurationCollection configurations,
IDecoratorService<ItemConfiguration> itemConfigurationDecorator,
IServiceFactory serviceFactory,
IMediator mediator,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<IItemEntryViewModel, string>>
INotificationHandler<ActivationEventArgs<IItemEntryViewModel, string>>
{
public async Task Handle(SynchronizeEventArgs<IItemEntryViewModel, string> args)
public async Task Handle(ActivationEventArgs<IItemEntryViewModel, string> args)
{
if (args.Value is string category)
{
+1 -1
View File
@@ -21,7 +21,7 @@ public partial class ItemContentViewModel(IServiceProvider provider,
if (args.Sender is ItemCategory<string> category
&& category.Value is string value)
{
Fetch(() => new SynchronizeExpression(new SynchronizeEventArgs<IItemEntryViewModel,
Activate(() => new ActivationBuilder(new ActivationEventArgs<IItemEntryViewModel,
string>(value)), true);
}
@@ -3,14 +3,14 @@ using Toolkit.Foundation;
namespace Wallet;
public class SynchronizeItemContentViewModelHandler(IDecoratorService<Item<(Guid, string)>> itemDecorator,
public class ItemContentViewModelActivationHandler(IDecoratorService<Item<(Guid, string)>> itemDecorator,
IDecoratorService<ItemConfiguration> itemConfigurationDecorator,
IMediator mediator,
IServiceFactory serviceFactory,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<ItemSectionViewModel>>
INotificationHandler<ActivationEventArgs<ItemSectionViewModel>>
{
public async Task Handle(SynchronizeEventArgs<ItemSectionViewModel> args)
public async Task Handle(ActivationEventArgs<ItemSectionViewModel> args)
{
if (itemDecorator.Service is Item<(Guid, string)> item)
{
+5 -5
View File
@@ -6,20 +6,20 @@ namespace Wallet;
public class ItemCreatedHandler(IServiceProvider serviceProvider,
ICache<Item<(Guid, string)>> cache,
IPublisher publisher) :
INotificationHandler<CreatedEventArgs<Item<(Guid, string, string, IImageDescriptor?)>>>
INotificationHandler<CreatedEventArgs<Item<(Guid, string, string)>>>
{
public Task Handle(CreatedEventArgs<Item<(Guid, string, string, IImageDescriptor?)>> args)
public Task Handle(CreatedEventArgs<Item<(Guid, string, string)>> args)
{
if (args.Sender is Item<(Guid, string, string, IImageDescriptor?)> item)
if (args.Sender is Item<(Guid, string, string)> item)
{
(Guid id, string name, string category, IImageDescriptor? imageDescriptor) = item.Value;
(Guid id, string name, string category) = item.Value;
IServiceScope serviceScope = serviceProvider.CreateScope();
IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService<IServiceFactory>();
IDecoratorService<Item<(Guid, string)>> decoratorService = serviceScope.ServiceProvider.GetRequiredService<IDecoratorService<Item<(Guid, string)>>>();
if (serviceFactory.Create<ItemNavigationViewModel>(args => args.Initialize(),
id, name, "Description", category, imageDescriptor, true)
id, name, "Description", category, true)
is ItemNavigationViewModel viewModel)
{
Item<(Guid, string)> cachedItem = new((id, name));
+2 -2
View File
@@ -74,11 +74,11 @@ public partial class ItemHeaderViewModel :
}
[RelayCommand]
public async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
private async Task Import() => ImageDescriptor = await Mediator.Handle<CreateEventArgs<ProfileImage>,
IImageDescriptor>(Create.As<ProfileImage>());
[RelayCommand]
public void Remove() => ImageDescriptor = null;
private void Remove() => ImageDescriptor = null;
protected override void OnValueChanged()
{
+58 -20
View File
@@ -1,4 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Diagnostics;
using Toolkit.Foundation;
namespace Wallet;
@@ -15,10 +17,9 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
string name = "",
string description = "",
string category = "",
IImageDescriptor? imageDescriptor = default,
bool isSelected = false,
bool favourite = false,
bool archived = false) :
bool isFavourite = false,
bool isArchived = false) :
Observable(provider, factory, mediator, publisher, subscriber, disposer),
INotificationHandler<ArchiveEventArgs<Item>>,
INotificationHandler<UnarchiveEventArgs<Item>>,
@@ -26,28 +27,30 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
INotificationHandler<UnfavouriteEventArgs<Item>>,
INotificationHandler<DeleteEventArgs<Item>>,
INotificationHandler<NotifyEventArgs<ItemHeader<string>>>,
INotificationHandler<NotifyEventArgs<Item<IImageDescriptor>>>,
IKeyed<Guid>,
ISelectable,
IRemovable
{
[ObservableProperty]
private bool archived = archived;
[ObservableProperty]
private string? category = category;
[ObservableProperty]
private string? description = description;
[ObservableProperty]
private bool favourite = favourite;
[ObservableProperty]
private Guid id = id;
[ObservableProperty]
private IImageDescriptor? imageDescriptor = imageDescriptor;
private IImageDescriptor? imageDescriptor;
[ObservableProperty]
private bool isArchived = isArchived;
[ObservableProperty]
private bool isAttached;
[ObservableProperty]
private bool isFavourite = isFavourite;
[ObservableProperty]
private bool isSelected = isSelected;
@@ -58,17 +61,29 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
private string named = $"{named}";
public IContentTemplate Template { get; set; } = template;
public Task Handle(ArchiveEventArgs<Item> args) =>
Task.Run(Dispose);
public Task Handle(ArchiveEventArgs<Item> args)
{
Dispose();
return Task.CompletedTask;
}
public Task Handle(UnarchiveEventArgs<Item> args) =>
Task.Run(Dispose);
public Task Handle(UnarchiveEventArgs<Item> args)
{
Dispose();
return Task.CompletedTask;
}
public Task Handle(FavouriteEventArgs<Item> args) =>
Task.FromResult(Favourite = true);
public Task Handle(FavouriteEventArgs<Item> args)
{
IsFavourite = true;
return Task.CompletedTask;
}
public Task Handle(UnfavouriteEventArgs<Item> args) =>
Task.FromResult(Favourite = false);
public Task Handle(UnfavouriteEventArgs<Item> args)
{
IsFavourite = false;
return Task.CompletedTask;
}
public Task Handle(NotifyEventArgs<ItemHeader<string>> args)
{
@@ -80,6 +95,29 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
return Task.CompletedTask;
}
public Task Handle(DeleteEventArgs<Item> args) =>
Task.Run(Dispose);
public Task Handle(DeleteEventArgs<Item> args)
{
Dispose();
return Task.CompletedTask;
}
public Task Handle(NotifyEventArgs<Item<IImageDescriptor>> args)
{
if (args.Sender is Item<IImageDescriptor> item)
{
ImageDescriptor = item.Value;
}
return Task.CompletedTask;
}
[RelayCommand]
private void Attached()
{
if (!IsAttached)
{
Publisher.Publish(Activation.As<ItemNavigationViewModel, Guid>(Id));
IsAttached = true;
}
}
}
@@ -0,0 +1,20 @@
using Toolkit.Foundation;
namespace Wallet;
public class ItemNavigationViewModelActivatedHandler(IMediator mediator,
IPublisher publisher) :
INotificationHandler<ActivationEventArgs<ItemNavigationViewModel, Guid>>
{
public async Task Handle(ActivationEventArgs<ItemNavigationViewModel, Guid> args)
{
Guid id = args.Value;
IImageDescriptor? imageDescriptor = await mediator.Handle<RequestEventArgs<ItemImage<Guid>>,
IImageDescriptor>(Request.As(new ItemImage<Guid>(id)));
if (imageDescriptor is not null)
{
publisher.Publish(Notify.As(new Item<IImageDescriptor>(imageDescriptor)));
}
}
}
-3
View File
@@ -146,7 +146,4 @@ public partial class ItemViewModel :
return base.OnActivated();
}
protected override SynchronizeExpression BuildAggregateExpression() =>
new(Toolkit.Foundation.Synchronize.As<IItemViewModel, (string, string, ItemState)>(("", Name, State)));
}
@@ -3,11 +3,11 @@ using Toolkit.Foundation;
namespace Wallet;
public class SynchronizeMainViewModelHandler(IPublisher publisher,
public class MainViewModelActivationHandler(IPublisher publisher,
IWalletHostCollection Wallets) :
INotificationHandler<SynchronizeEventArgs<IMainNavigationViewModel>>
INotificationHandler<ActivationEventArgs<IMainNavigationViewModel>>
{
public Task Handle(SynchronizeEventArgs<IMainNavigationViewModel> args)
public Task Handle(ActivationEventArgs<IMainNavigationViewModel> args)
{
bool selected = true;
+1 -1
View File
@@ -15,6 +15,6 @@ public partial class SearchWalletActionViewModel(IServiceProvider provider,
private int index = 2;
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Search<string>(Value)),
private void Invoke() => Publisher.Publish(Notify.As(new Search<string>(Value)),
nameof(ItemCollectionViewModel));
}
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class UnarchiveItemActionViewModel(IServiceProvider provider,
IRemovable
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Unarchive.As<Item>());
private void Invoke() => Publisher.Publish(Unarchive.As<Item>());
}
+1 -1
View File
@@ -12,5 +12,5 @@ public partial class UnfavouriteItemActionViewModel(IServiceProvider provider,
IRemovable
{
[RelayCommand]
public void Invoke() => Publisher.Publish(Unfavourite.As<Item>());
private void Invoke() => Publisher.Publish(Unfavourite.As<Item>());
}