diff --git a/Source/Editor/Surface/SurfaceNode.cs b/Source/Editor/Surface/SurfaceNode.cs index 633b41373..1ebc1c1c5 100644 --- a/Source/Editor/Surface/SurfaceNode.cs +++ b/Source/Editor/Surface/SurfaceNode.cs @@ -390,6 +390,11 @@ namespace FlaxEditor.Surface UpdateBoxesTypes(); } + /// + /// Array of nodes that are sealed to this node - sealed nodes are duplicated/copied/pasted/removed in a batch. Null if unused. + /// + public virtual SurfaceNode[] SealedNodes => null; + /// /// Gets a value indicating whether this node uses dependent boxes. /// diff --git a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs index aee617ad3..7df90f298 100644 --- a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs +++ b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs @@ -65,6 +65,25 @@ namespace FlaxEditor.Surface return; } + // Collect sealed nodes to be copied as well + foreach (var control in selection.ToArray()) + { + if (control is SurfaceNode node) + { + var sealedNodes = node.SealedNodes; + if (sealedNodes != null) + { + foreach (var sealedNode in sealedNodes) + { + if (sealedNode != null && !selection.Contains(sealedNode)) + { + selection.Add(sealedNode); + } + } + } + } + } + var dataModel = new DataModel(); var dataModelNodes = new List(selection.Count); var dataModelComments = new List(); diff --git a/Source/Editor/Surface/VisjectSurface.cs b/Source/Editor/Surface/VisjectSurface.cs index 5104adc27..012d98778 100644 --- a/Source/Editor/Surface/VisjectSurface.cs +++ b/Source/Editor/Surface/VisjectSurface.cs @@ -749,7 +749,25 @@ namespace FlaxEditor.Surface { if (nodes == null) nodes = new List(); - nodes.Add(node); + var sealedNodes = node.SealedNodes; + if (sealedNodes != null) + { + foreach (var sealedNode in sealedNodes) + { + if (sealedNode != null) + { + if (sealedNode.IsSelected) + { + selectionChanged = true; + sealedNode.IsSelected = false; + } + if (!nodes.Contains(sealedNode)) + nodes.Add(sealedNode); + } + } + } + if (!nodes.Contains(node)) + nodes.Add(node); } } else