Files
Toolkit2/Toolkit.Foundation/Observable.cs
T
TheXamlGuy 93c7a43ab4 Codemaid
2024-07-17 21:43:58 +01:00

164 lines
3.7 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
namespace Toolkit.Foundation;
public partial class Observable(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableObject,
IObservableViewModel,
IActivityIndicator,
IInitialization,
IActivated,
IDeactivating,
IDeactivated,
IDisposable,
IServiceProviderRequired,
IServiceFactoryRequired,
IMediatorRequired,
IPublisherRequired,
IDisposerRequired
{
private readonly Dictionary<string, object> trackedProperties = [];
[ObservableProperty]
private bool isActivated;
[ObservableProperty]
private bool isActive;
[ObservableProperty]
private bool isInitialized;
public IDisposer Disposer { get; } = disposer;
public IServiceFactory Factory { get; } = factory;
public IMediator Mediator { get; } = mediator;
public IServiceProvider Provider { get; } = provider;
public IPublisher Publisher { get; } = publisher;
public ISubscriber Subscriber { get; } = subscriber;
public virtual Task OnActivated()
{
IsActivated = true;
return Task.CompletedTask;
}
public void Commit()
{
foreach (object trackedProperty in trackedProperties.Values)
{
((dynamic)trackedProperty).Commit();
}
}
public virtual Task OnDeactivated()
{
IsActivated = false;
return Task.CompletedTask;
}
public virtual Task OnDeactivating() =>
Task.CompletedTask;
public virtual void Dispose()
{
GC.SuppressFinalize(this);
Disposer.Dispose(this);
}
public virtual void OnInitialize()
{
}
public virtual void Initialize()
{
if (IsInitialized)
{
return;
}
IsInitialized = true;
Subscriber.Subscribe(this);
OnInitialize();
}
public void Revert()
{
foreach (object trackedProperty in trackedProperties.Values)
{
((dynamic)trackedProperty).Revert();
}
}
public void Track<T>(string propertyName, Func<T> getter, Action<T> setter)
{
if (!trackedProperties.ContainsKey(propertyName))
{
T initialValue = getter();
trackedProperties[propertyName] = new TrackedProperty<T>(initialValue, setter, getter);
}
}
}
public partial class Observable<TValue> :
Observable
where TValue : notnull
{
[ObservableProperty]
private TValue? value;
public Observable(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
TValue? value = default) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Value = value;
}
protected virtual void OnValueChanged()
{
}
private partial void OnValueChanged(TValue? value) => OnValueChanged();
}
public partial class Observable<TKey, TValue> :
Observable
where TKey : notnull
{
[ObservableProperty]
private TKey key;
[ObservableProperty]
private TValue? value;
public Observable(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer,
TKey key,
TValue? value = default) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Key = key;
Value = value;
}
protected virtual void OnValueChanged()
{
}
private partial void OnValueChanged(TValue? value) => OnValueChanged();
}