using System;
namespace RosettaUI.UndoSystem
{
///
/// デリゲートで挙動をカスタマイズできる汎用的なUndoRecordの基底クラス
///
public abstract class UndoRecordFlexBase : IDisposable
{
public event Action onDispose;
public virtual bool IsAvailable => IsAvailableFunc?.Invoke() ?? true;
public Func IsAvailableFunc { get; set; }
public Func CanMargeFunc { get; set; }
public Action MergeAction { get; set; }
public bool CanMerge(IUndoRecord newer)
{
return CanMargeFunc?.Invoke(newer) ?? CanMargeDefault(newer);
}
public void Merge(IUndoRecord newer)
{
if (MergeAction != null)
{
MergeAction(newer);
return;
}
MargeDefault(newer);
}
protected virtual bool CanMargeDefault(IUndoRecord newer) => false;
protected virtual void MargeDefault(IUndoRecord newer)
{
}
public virtual void Dispose()
{
onDispose?.Invoke();
onDispose = null;
IsAvailableFunc = null;
CanMargeFunc = null;
MergeAction = null;
}
}
}