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