using System;
using UnityEditor;
namespace Unity.Pipeline.Editor.Authoring
{
///
///
/// Groups all Undo operations registered during its lifetime into a single, collapsible Editor
/// Undo step, so a multi-step agent action reverts as one. Register mutations inside the scope
/// with Undo.RegisterCreatedObjectUndo / RegisterCompleteObjectUndo / etc.
///
///
///
/// using (new AuthoringUndoScope("Create Enemy"))
/// {
/// var go = new GameObject("Enemy");
/// Undo.RegisterCreatedObjectUndo(go, "Create Enemy");
/// // ... further registered mutations collapse into the same step
/// }
///
///
///
/// NOTE: minimal seed for the shared safety policy (CAT-2509). AssetDatabase operations
/// (folder/asset creation, import) are NOT part of Unity's Undo system, so this scope only
/// affects scene/object mutations.
///
///
public sealed class AuthoringUndoScope : IDisposable
{
private readonly int m_Group;
private bool m_Canceled;
/// Start a new collapsible Undo group.
/// Name shown for the collapsed Undo step.
public AuthoringUndoScope(string name)
{
Undo.IncrementCurrentGroup();
m_Group = Undo.GetCurrentGroup();
if (!string.IsNullOrEmpty(name))
Undo.SetCurrentGroupName(name);
}
///
/// Skip the collapse on dispose. Call after the scope's registered operations have been
/// reverted wholesale (e.g. Undo.RevertAllDownToGroup(group) on a transactional batch
/// abort): the group id no longer refers to this scope's operations on the Undo stack, and
/// collapsing a discarded id could fold whatever now sits at that index into a stray group.
///
public void Cancel() => m_Canceled = true;
/// Collapse all Undo operations registered during this scope into one step, unless was called.
public void Dispose()
{
if (!m_Canceled)
Undo.CollapseUndoOperations(m_Group);
}
}
}