diff --git a/Source/Editor/Surface/Archetypes/BehaviorTree.cs b/Source/Editor/Surface/Archetypes/BehaviorTree.cs index f8cd7bb5a..07005df28 100644 --- a/Source/Editor/Surface/Archetypes/BehaviorTree.cs +++ b/Source/Editor/Surface/Archetypes/BehaviorTree.cs @@ -755,6 +755,29 @@ namespace FlaxEditor.Surface.Archetypes } } + /// + public override void OnDeleted(SurfaceNodeActions action) + { + // Unlink from the current parent (when deleted by user) + var node = Node; + if (node != null) + { + if (action == SurfaceNodeActions.User) + { + var decorators = node.DecoratorIds; + decorators.Remove(ID); + node.DecoratorIds = decorators; + } + else + { + node._decorators = null; + node.ResizeAuto(); + } + } + + base.OnDeleted(action); + } + public override void OnSurfaceCanEditChanged(bool canEdit) { base.OnSurfaceCanEditChanged(canEdit); diff --git a/Source/Editor/Surface/Undo/AddRemoveNodeAction.cs b/Source/Editor/Surface/Undo/AddRemoveNodeAction.cs index ba6770287..0deb66fbe 100644 --- a/Source/Editor/Surface/Undo/AddRemoveNodeAction.cs +++ b/Source/Editor/Surface/Undo/AddRemoveNodeAction.cs @@ -19,6 +19,7 @@ namespace FlaxEditor.Surface.Undo private ushort _typeId; private Float2 _nodeLocation; private object[] _nodeValues; + private SurfaceNodeActions _actionType = SurfaceNodeActions.User; // Action usage flow is first to apply user effect such as removing/adding node, then we use Undo type so node can react to this public AddRemoveNodeAction(SurfaceNode node, bool isAdd) { @@ -38,6 +39,7 @@ namespace FlaxEditor.Surface.Undo Add(); else Remove(); + _actionType = SurfaceNodeActions.Undo; } /// @@ -67,8 +69,8 @@ namespace FlaxEditor.Surface.Undo else if (_nodeValues != null && _nodeValues.Length != 0) throw new InvalidOperationException("Invalid node values."); node.Location = _nodeLocation; - context.OnControlLoaded(node, SurfaceNodeActions.Undo); - node.OnSurfaceLoaded(SurfaceNodeActions.Undo); + context.OnControlLoaded(node, _actionType); + node.OnSurfaceLoaded(_actionType); context.MarkAsModified(); } @@ -89,7 +91,7 @@ namespace FlaxEditor.Surface.Undo // Remove node context.Nodes.Remove(node); - context.OnControlDeleted(node, SurfaceNodeActions.Undo); + context.OnControlDeleted(node, _actionType); context.MarkAsModified(); } diff --git a/Source/Editor/Surface/VisjectSurface.cs b/Source/Editor/Surface/VisjectSurface.cs index 3ac702549..530f3265f 100644 --- a/Source/Editor/Surface/VisjectSurface.cs +++ b/Source/Editor/Surface/VisjectSurface.cs @@ -837,7 +837,7 @@ namespace FlaxEditor.Surface actions.Add(action); } - Undo.AddAction(new MultiUndoAction(actions, nodes.Count == 1 ? "Remove node" : "Remove nodes")); + AddBatchedUndoAction(new MultiUndoAction(actions, nodes.Count == 1 ? "Remove node" : "Remove nodes")); } }