using System.Collections.Generic; using System.Linq; using UnityEngine.Pool; namespace RosettaUI.UndoSystem { /// /// ListViewのアイテム追加を元に戻すためのUndoRecord /// Redo時に削除されたアイテムを復元する必要があるためUndoRecordItemRemoveのように、Undo時削除するまえにの値を記録しておく必要がある /// public class UndoRecordListItemAdd : UndoRecordListItemRestoreBase { public override string Name => $"List Item Add index:({string.Join(", ", records.Select(r => r.index))})"; public void Initialize(ListViewItemContainerElement listElement, IEnumerable indices) { base.Initialize(listElement); ClearRecords(); // Undo時に必要なのはインデックスだけなのでインデックスのみのRestoreRecordを保存 records.AddRange(indices.Select(i => new ListViewItemContainerElement.RestoreRecord(i, false, null, null, null))); } // 追加されたアイテムを削除する // Redo時に復元するため、削除するまえの値を記録しておく public override void Undo() { using var _ = ListPool.Get(out var indices); indices.AddRange(records.Select(r => r.index)); ClearRecords(); records.AddRange(Element.GetListEditor().CreateRestoreRecords(indices)); Element.GetListEditor().RemoveItems(indices); } public override void Redo() { Element.GetListEditor().ApplyRestoreRecords(records); } } public static partial class Undo { public static void RecordListItemAdd(ListViewItemContainerElement listElement, int index) { using var _ = ListPool.Get(out var indices); indices.Add(index); RecordListItemAdd(listElement, indices); } public static void RecordListItemAdd(ListViewItemContainerElement listElement, IEnumerable indices) { if (!UndoHistory.CanAdd) return; using (UndoRecorder.Get(out var record)) { record.Initialize(listElement, indices); } } } }