Files
Toolkit2/Toolkit.Foundation/Observable.cs
T
2024-06-10 22:29:18 +01:00

172 lines
3.8 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
namespace Toolkit.Foundation;
public partial class Observable :
ObservableObject,
IObservableViewModel,
IActivityIndicator,
IInitializer,
IActivated,
IDeactivating,
IDeactivated,
IDeactivatable,
IDisposable,
IServiceProviderRequired,
IServiceFactoryRequired,
IMediatorRequired,
IPublisherRequired,
IDisposerRequired
{
private readonly Dictionary<string, object> trackedProperties = [];
[ObservableProperty]
private bool initialized;
[ObservableProperty]
private bool active;
public Observable(IServiceProvider
provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer)
{
Provider = provider;
Factory = factory;
Mediator = mediator;
Publisher = publisher;
Disposer = disposer;
subscriber.Add(this);
}
public event EventHandler? DeactivateHandler;
public IDisposer Disposer { get; }
public IServiceFactory Factory { get; }
public IMediator Mediator { get; }
public IServiceProvider Provider { get; }
public IPublisher Publisher { get; }
public void Commit()
{
foreach (object trackedProperty in trackedProperties.Values)
{
((dynamic)trackedProperty).Commit();
}
}
public Task Deactivate()
{
DeactivateHandler?.Invoke(this, new EventArgs());
return Task.CompletedTask;
}
public virtual void Dispose()
{
GC.SuppressFinalize(this);
Disposer.Dispose(this);
}
public Task Initialize()
{
if (Initialized)
{
return Task.CompletedTask;
}
Initialized = 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<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,
ISubscription subscriber,
IDisposer disposer,
TValue value) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Value = value;
}
protected virtual void OnValueChanged()
{
}
partial void OnValueChanged(TValue value) => OnValueChanged();
}
public partial class Observable<TKey, TValue> :
Observable
where TKey : notnull
where TValue : notnull
{
[ObservableProperty]
private TKey key;
[ObservableProperty]
private TValue value;
public Observable(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
TKey key,
TValue value) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Key = key;
Value = value;
}
protected virtual void OnValueChanged()
{
}
partial void OnValueChanged(TValue value) => OnValueChanged();
}