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; } } }