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