public void DeleteConnectionPort(ConnectionPort dynamicPort) { dynamicPort?.ClearConnections(); dynamicConnectionPorts.Remove(dynamicPort); DestroyImmediate(dynamicPort); ConnectionPortManager.UpdateRepresentativePortLists(this); }
public ConnectionPort CreateConnectionPort(ConnectionPortAttribute specificationAttribute) { ConnectionPort port = specificationAttribute.CreateNew(this); if (port == null) { return(null); } dynamicConnectionPorts.Add(port); ConnectionPortManager.UpdateRepresentativePortLists(this); return(port); }
//Edit to framework: (added to support inserting connection ports at an index) public ConnectionPort CreateConnectionPort(ConnectionPortAttribute specificationAttribute, int index) { if (index >= 0 && index <= dynamicConnectionPorts.Count) { ConnectionPort port = specificationAttribute.CreateNew(this); if (port == null) { return(null); } dynamicConnectionPorts.Insert(index, port); ConnectionPortManager.UpdateRepresentativePortLists(this); return(port); } return(null); }
/// <summary> /// Validates this canvas, checking for any broken nodes or references and cleans them. /// </summary> public void Validate() { NodeEditor.checkInit(false); // Check Groups CheckNodeCanvasList(ref groups, "groups"); // Check Nodes and their connection ports CheckNodeCanvasList(ref nodes, "nodes"); foreach (Node node in nodes) { ConnectionPortManager.UpdateConnectionPorts(node); foreach (ConnectionPort port in node.connectionPorts) { port.Validate(node); } ConnectionPortManager.UpdatePortLists(node); ConnectionPortManager.UpdateRepresentativePortLists(node); } // Check EditorStates if (editorStates == null) { editorStates = new NodeEditorState[0]; } editorStates = editorStates.Where((NodeEditorState state) => state != null).ToArray(); foreach (NodeEditorState state in editorStates) { if (!nodes.Contains(state.selectedNode)) { state.selectedNode = null; } } // Validate CanvasType-specific stuff ValidateSelf(); }
/// <summary> /// Creates a copy of the specified node at pos on the specified canvas, optionally auto-connecting the specified output to a matching input /// silent disables any events /// </summary> public static Node CreateCopy(Node toCopy, Vector2 pos, NodeCanvas hostCanvas, ConnectionPort connectingPort = null, bool silent = false) { if (toCopy == null || hostCanvas == null) { throw new ArgumentException(); } if (!NodeCanvasManager.CheckCanvasCompability(toCopy.GetID, hostCanvas.GetType())) { throw new UnityException("Cannot create Node with ID '" + toCopy.GetID + "' as it is not compatible with the current canvas type (" + hostCanvas.GetType().ToString() + ")!"); } if (!hostCanvas.CanAddNode(toCopy.GetID)) { throw new UnityException("Cannot create Node with ID '" + toCopy.GetID + "' on the current canvas of type (" + hostCanvas.GetType().ToString() + ")!"); } Node node = ScriptableObject.Instantiate(toCopy); //Clone static connection ports foreach (ConnectionPortDeclaration portDecl in ConnectionPortManager.GetPortDeclarationEnumerator(node, true)) { ConnectionPort port = (ConnectionPort)portDecl.portField.GetValue(node); port = portDecl.portInfo.CreateNew(node); portDecl.portField.SetValue(node, port); } //Clone dynamic connection ports for (int i = 0; i < node.dynamicConnectionPorts.Count; ++i) { node.dynamicConnectionPorts[i] = ScriptableObject.Instantiate(node.dynamicConnectionPorts[i]); node.dynamicConnectionPorts[i].body = node; node.dynamicConnectionPorts[i].ClearConnections(); } ConnectionPortManager.UpdateRepresentativePortLists(node); //Clone child SOs System.Func <ScriptableObject, ScriptableObject> copySOs = (ScriptableObject so) => ScriptableObject.Instantiate(so);; node.CopyScriptableObjects(copySOs); if (node == null) { return(null); } // Init node state node.name = node.Title; node.autoSize = node.DefaultSize; node.position = pos; ConnectionPortManager.UpdateConnectionPorts(node); if (connectingPort != null) { // Handle auto-connection and link the output to the first compatible input for (int i = 0; i < node.connectionPorts.Count; i++) { if (node.connectionPorts[i].TryApplyConnection(connectingPort, silent)) { break; } } } // Add node to host canvas hostCanvas.nodes.Add(node); if (!silent) { // Callbacks hostCanvas.OnNodeChange(connectingPort != null ? connectingPort.body : node); NodeEditorCallbacks.IssueOnAddNode(node); hostCanvas.Validate(); NodeEditor.RepaintClients(); } return(node); }