using System;
namespace RosettaUI.UndoSystem
{
///
/// Undo/Redoを行う汎用的なUndoRecord
///
public class UndoRecordAction: UndoRecordFlexBase, IUndoRecord
{
private Action _undoAction;
private Action _redoAction;
public string Name { get; private set; }
public void Initialize(string name, Action undoAction, Action redoAction)
{
Name = name;
_undoAction = undoAction;
_redoAction = redoAction;
}
public void Undo() => _undoAction?.Invoke();
public void Redo() => _redoAction?.Invoke();
public override void Dispose()
{
base.Dispose();
_undoAction = null;
_redoAction = null;
}
}
///
/// データを保存してUndo/Redoを行う汎用的なUndoRecord
///
public class UndoRecordAction : UndoRecordFlexBase, IUndoRecord
{
private TData _data;
private Action _undoAction;
private Action _redoAction;
public string Name { get; private set; }
public void Initialize(string name, TData data, Action undoAction, Action redoAction)
{
Name = name;
_data = data;
_undoAction = undoAction;
_redoAction = redoAction;
}
public void Undo() => _undoAction?.Invoke(_data);
public void Redo() => _redoAction?.Invoke(_data);
public override void Dispose()
{
base.Dispose();
if (_data is IDisposable disposable)
{
disposable.Dispose();
}
_data = default;
_undoAction = null;
_redoAction = null;
}
}
public static partial class Undo
{
public static UndoRecordAction RecordAction(string label, Action undoAction, Action redoAction)
{
using var _ = UndoRecorder.Get(out var record);
record.Initialize(label, undoAction, redoAction);
return record;
}
public static UndoRecordAction RecordAction(string label, TData data, Action undoAction, Action redoAction)
{
using var _ = UndoRecorder>.Get(out var record);
record.Initialize(label, data, undoAction, redoAction);
return record;
}
}
}