From 246dab4297b5d9dca8bd0dc4457177f4998b9008 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Thu, 23 May 2024 01:08:24 +0100 Subject: [PATCH] Added TrackedProperty for commiting and reverting values --- Toolkit.Foundation/Observable.cs | 50 ++++++++++++++++++++------- Toolkit.Foundation/TrackedProperty.cs | 10 ++++++ 2 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 Toolkit.Foundation/TrackedProperty.cs diff --git a/Toolkit.Foundation/Observable.cs b/Toolkit.Foundation/Observable.cs index 884dd49..b0d48b9 100644 --- a/Toolkit.Foundation/Observable.cs +++ b/Toolkit.Foundation/Observable.cs @@ -17,6 +17,8 @@ public partial class Observable : IPublisherRequired, IDisposerRequired { + private readonly Dictionary trackedProperties = []; + [ObservableProperty] private bool isInitialized; @@ -48,8 +50,13 @@ public partial class Observable : public IPublisher Publisher { get; } - public virtual Task OnActivated() => - Task.CompletedTask; + public void Commit() + { + foreach (object trackedProperty in trackedProperties.Values) + { + ((dynamic)trackedProperty).Commit(); + } + } public Task Deactivate() { @@ -57,12 +64,6 @@ public partial class Observable : return Task.CompletedTask; } - public virtual Task OnDeactivated() => - Task.CompletedTask; - - public virtual Task OnDeactivating() => - Task.CompletedTask; - public virtual void Dispose() { GC.SuppressFinalize(this); @@ -79,13 +80,39 @@ public partial class Observable : IsInitialized = true; return Task.CompletedTask; } + + public virtual Task OnActivated() => + Task.CompletedTask; + + public virtual Task OnDeactivated() => + Task.CompletedTask; + + public virtual Task OnDeactivating() => + Task.CompletedTask; + + public void Revert() + { + foreach (object trackedProperty in trackedProperties.Values) + { + ((dynamic)trackedProperty).Revert(); + } + } + + public void Track(string propertyName, Func getter, Action setter) + { + if (!trackedProperties.ContainsKey(propertyName)) + { + T initialValue = getter(); + trackedProperties[propertyName] = new TrackedProperty(initialValue, setter, getter); + } + } } public partial class Observable(IServiceProvider provider, IServiceFactory factory, - IMediator mediator, - IPublisher publisher, - ISubscription subscriber, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, IDisposer disposer, TValue? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer) { @@ -93,7 +120,6 @@ public partial class Observable(IServiceProvider provider, private TValue? value = value; } - public partial class Observable(IServiceProvider provider, IServiceFactory factory, IMediator mediator, diff --git a/Toolkit.Foundation/TrackedProperty.cs b/Toolkit.Foundation/TrackedProperty.cs new file mode 100644 index 0000000..f14a62c --- /dev/null +++ b/Toolkit.Foundation/TrackedProperty.cs @@ -0,0 +1,10 @@ +namespace Toolkit.Foundation; + +public class TrackedProperty(T initial, + Action revert, + Func commit) +{ + public void Commit() => initial = commit(); + + public void Revert() => revert(initial); +}