using System;
namespace RosettaUI.UndoSystem
{
///
/// 汎用的な値の変更を記録するUndoRecord
///
public class UndoRecordValueChange : UndoRecordFlexBase, IUndoRecord
{
private readonly ValueChangeRecord _valueChangeRecord = new();
private string _label;
private Action _applyValue;
public string Name => $"{_label} ({_valueChangeRecord})";
public void Initialize(string label, TValue before, TValue after, Action applyValue)
{
_label = label;
_applyValue = applyValue;
_valueChangeRecord.Initialize(before, after);
}
public void Undo() => _applyValue(_valueChangeRecord.Before);
public void Redo() => _applyValue(_valueChangeRecord.After);
protected override bool CanMargeDefault(IUndoRecord newer)
{
// デフォルトは同じラベルならマージ可能とする
return (newer is UndoRecordValueChange newRecord) && _label == newRecord._label;
}
protected override void MargeDefault(IUndoRecord newer)
{
if (newer is UndoRecordValueChange newerRecord)
{
_valueChangeRecord.AfterRaw = newerRecord._valueChangeRecord.AfterRaw;
}
}
public override void Dispose()
{
base.Dispose();
_valueChangeRecord.Clear();
_applyValue = null;
}
}
public static partial class Undo
{
public static UndoRecordValueChange RecordValueChange(string label, TValue before, TValue after, Action applyValue)
{
using var _ = UndoRecorder>.Get(out var record);
record.Initialize(label, before, after, applyValue);
return record;
}
}
}