public static void DrawNodePreview(System.Type nodeType, NodeDataAttribute nodeData, params NodeHandleAttribute[] nodeHandles) { InitiateNodeStyles(); Rect nodeRect = new Rect(new Vector2(16f, 16f), nodeData.nodeSize + new Vector2(nodeHandleWidth * 2f, 0f)); GUILayout.BeginArea(nodeRect); // Draw Background Color oldColor = GUI.backgroundColor; GUI.backgroundColor = nodeData.nodeColor; GUILayout.BeginArea(new Rect(nodeHandleWidth, 0f, nodeRect.width - nodeHandleWidth * 2f, nodeRect.height), nodeBGStyle); GUI.backgroundColor = oldColor; // Draw Header Rect headerRect = new Rect(0f, 0f, nodeRect.width - nodeHandleWidth * 2f, 22f); GUI.Label(headerRect, new GUIContent(nodeData.nodeName, nodeData.nodeDescription), nodeHeaderStyle); // Draw Node Editor GUI GUILayout.BeginArea(new Rect(8f, 32f, nodeData.nodeSize.x - 16f, nodeData.nodeSize.y - 48f)); if (nodeType != null) { DialogCanvas tempCanvas = DialogCanvas.CreateCanvas <DialogCanvas>(); Node tempNode = Node.CreateNode(nodeType, Vector2.zero); tempCanvas.nodes.Add(tempNode); Editor editor = Editor.CreateEditor(tempNode); NodeInspector nodeEditor = editor as NodeInspector; if (nodeEditor != null) { nodeEditor.OnDrawNodeGUI(new Rect(0f, 0f, nodeData.nodeSize.x - 16f, nodeData.nodeSize.y - 48f), tempCanvas); } else { editor.OnInspectorGUI(); } DestroyImmediate(editor); DestroyImmediate(tempNode); DestroyImmediate(tempCanvas); } else { GUI.Label(new Rect(0f, 0f, nodeData.nodeSize.x - 16f, nodeData.nodeSize.y - 48f), "No GUI given", nodeHeaderStyle); } GUILayout.EndArea(); GUILayout.EndArea(); // Draw Handles DrawHandles(nodeHandles, Northwind.Essentials.VectorMath.Step(nodeData.nodeSize, 16f), ConnectionType.Input); DrawHandles(nodeHandles, Northwind.Essentials.VectorMath.Step(nodeData.nodeSize, 16f), ConnectionType.Output); GUILayout.EndArea(); }
public static string Load(ref DialogCanvas canvas) { string newPath = EditorUtility.OpenFilePanel("Load Node Canvas", "Assets/", "asset"); if (string.IsNullOrEmpty(newPath)) { return(""); } else if (!newPath.Contains(Application.dataPath)) { return(""); } return(LoadCanvas(ref canvas, newPath)); }
public static string SaveCanvas(DialogCanvas canvas, string path) { if (string.IsNullOrEmpty(path)) { return(""); } if (AssetDatabase.GetAssetPath(canvas) == "") { AssetDatabase.CreateAsset(canvas, path); } SaveAllSubData(new ScriptableObject[] { canvas.startNode }, canvas); SaveAllSubData(canvas.nodes.ToArray(), canvas); SaveAllSubData(canvas.connections.ToArray(), canvas); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); return(path); }
public static string ExportCanvas(DialogCanvas canvas, string path) { if (string.IsNullOrEmpty(path)) { return(""); } string textFile = JsonUtility.ToJson(canvas); string absPath = Application.dataPath + "/" + path.Replace("Assets/", ""); if (File.Exists(absPath)) { File.Delete(absPath); } using (FileStream fs = File.Create(absPath)) { System.Byte[] info = new System.Text.UTF8Encoding(true).GetBytes(textFile); fs.Write(info, 0, info.Length); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); return(path); }
public static string Export(ref DialogCanvas canvas, string path = "") { //Copy Canvas DialogCanvas savedCanvas = Object.Instantiate(canvas) as DialogCanvas; //Copy all Nodes for (int n = 0; n < canvas.nodes.Count; n++) { savedCanvas.nodes[n] = (Object.Instantiate(canvas.nodes[n]) as Node); savedCanvas.nodes[n].name = canvas.nodes[n].name; } //Copy Start Node savedCanvas.startNode = (Object.Instantiate(canvas.startNode) as StartNode); savedCanvas.startNode.name = canvas.startNode.name; //Copy all Connections for (int c = 0; c < canvas.connections.Count; c++) { savedCanvas.connections[c] = (Object.Instantiate(canvas.connections[c]) as NodeConnection); savedCanvas.connections[c].name = canvas.connections[c].name; } //Rebind Connections to Nodes for (int c = 0; c < canvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < canvas.connections[c].froms.Count; subNodeID++) { if (canvas.connections[c].froms[subNodeID] == canvas.startNode) { savedCanvas.connections[c].froms[subNodeID] = savedCanvas.startNode; } else { savedCanvas.connections[c].froms[subNodeID] = savedCanvas.nodes[canvas.nodes.IndexOf(canvas.connections[c].froms[subNodeID])]; } } if (canvas.connections[c].to == canvas.startNode) { savedCanvas.connections[c].to = savedCanvas.startNode; } else { savedCanvas.connections[c].to = savedCanvas.nodes[canvas.nodes.IndexOf(canvas.connections[c].to)]; } } //Rebind Nodes to Connections for (int c = 0; c < savedCanvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < savedCanvas.connections[c].froms.Count; subNodeID++) { List <NodeHandlePackage> fromsPackage = NodeOperator.GetConnections(savedCanvas.connections[c].froms[subNodeID], ConnectionType.Output); for (int fp = 0; fp < fromsPackage.Count; fp++) { if (fromsPackage[fp].handle.ID == savedCanvas.connections[c].fromAttributes[subNodeID].ID) { fromsPackage[fp].info.SetValue(savedCanvas.connections[c].froms[subNodeID], savedCanvas.connections[c]); } } } List <NodeHandlePackage> tosPackage = NodeOperator.GetConnections(savedCanvas.connections[c].to, ConnectionType.Input); for (int fp = 0; fp < tosPackage.Count; fp++) { if (tosPackage[fp].handle.ID == savedCanvas.connections[c].toAttribute.ID) { tosPackage[fp].info.SetValue(savedCanvas.connections[c].to, savedCanvas.connections[c]); } } } //Get Saving Path string newPath = path == "" ? EditorUtility.SaveFilePanelInProject("Export Node Canvas", "Node Canvas", "json", "", "Assets/") : path; //Send copied files and canvas to saving return(ExportCanvas(savedCanvas, newPath)); }
public static string LoadCanvas(ref DialogCanvas canvas, string path) { path = path.Replace(Application.dataPath, "Assets"); DialogCanvas loadedCanvas = AssetDatabase.LoadAssetAtPath <DialogCanvas>(path); if (!loadedCanvas) { return(""); } // If no canvas was initialized then skip destrcution if (canvas != null) { //Destroy all temporary nodes for (int n = canvas.nodes.Count - 1; n >= 0; n--) { DestroyImmediate(canvas.nodes[n]); canvas.nodes.RemoveAt(n); } //Destroy all temporary connections for (int c = canvas.connections.Count - 1; c >= 0; c--) { DestroyImmediate(canvas.connections[c]); canvas.connections.RemoveAt(c); } //Destroy Start Node DestroyImmediate(canvas.startNode); canvas.startNode = null; //Destroy the temporary canvas DestroyImmediate(canvas); } //Copy Canvas canvas = Object.Instantiate(loadedCanvas) as DialogCanvas; //Copy all Nodes for (int n = canvas.nodes.Count - 1; n >= 0; n--) { if (canvas.nodes[n] == null) { canvas.nodes.RemoveAt(n); continue; } canvas.nodes[n] = Object.Instantiate(loadedCanvas.nodes[n]) as Node; canvas.nodes[n].name = loadedCanvas.nodes[n].name; } //Copy Start Node canvas.startNode = (Object.Instantiate(loadedCanvas.startNode) as StartNode); canvas.startNode.name = loadedCanvas.startNode.name; //Copy all Connections for (int c = 0; c < canvas.connections.Count; c++) { canvas.connections[c] = (Object.Instantiate(loadedCanvas.connections[c]) as NodeConnection); canvas.connections[c].name = loadedCanvas.connections[c].name; } //Rebind Connections to Nodes for (int c = 0; c < loadedCanvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < loadedCanvas.connections[c].froms.Count; subNodeID++) { if (loadedCanvas.connections[c].froms[subNodeID] == loadedCanvas.startNode) { canvas.connections[c].froms[subNodeID] = canvas.startNode; } else { canvas.connections[c].froms[subNodeID] = canvas.nodes[loadedCanvas.nodes.IndexOf(loadedCanvas.connections[c].froms[subNodeID])]; } } if (loadedCanvas.connections[c].to == loadedCanvas.startNode) { canvas.connections[c].to = canvas.startNode; } else { canvas.connections[c].to = canvas.nodes[loadedCanvas.nodes.IndexOf(loadedCanvas.connections[c].to)]; } } //Rebind Nodes to Connections for (int c = 0; c < canvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < canvas.connections[c].froms.Count; subNodeID++) { List <NodeHandlePackage> fromsPackage = NodeOperator.GetConnections(canvas.connections[c].froms[subNodeID], ConnectionType.Output); for (int fp = 0; fp < fromsPackage.Count; fp++) { if (fromsPackage[fp].handle.ID == canvas.connections[c].fromAttributes[subNodeID].ID) { fromsPackage[fp].info.SetValue(canvas.connections[c].froms[subNodeID], canvas.connections[c]); } } } List <NodeHandlePackage> tosPackage = NodeOperator.GetConnections(canvas.connections[c].to, ConnectionType.Input); for (int fp = 0; fp < tosPackage.Count; fp++) { if (tosPackage[fp].handle.ID == canvas.connections[c].toAttribute.ID) { tosPackage[fp].info.SetValue(canvas.connections[c].to, canvas.connections[c]); } } } //Rebind Nodes to DefinedPoints List <string> keys = new List <string>(loadedCanvas.definedPoints.Keys); for (int k = 0; k < keys.Count; k++) { int nodeID = loadedCanvas.nodes.IndexOf(loadedCanvas.definedPoints[keys[k]]); canvas.definedPoints[keys[k]] = canvas.nodes[nodeID]; } return(path); }
public static string Save(ref DialogCanvas canvas, string path = "") { //Copy Canvas DialogCanvas savedCanvas; string npath = path.Replace(Application.dataPath, "Assets"); DialogCanvas loadedCanvas = AssetDatabase.LoadAssetAtPath <DialogCanvas>(npath); if (loadedCanvas) { savedCanvas = loadedCanvas; for (int n = savedCanvas.nodes.Count - 1; n >= 0; n--) { DestroyImmediate(savedCanvas.nodes[n], true); } for (int c = savedCanvas.connections.Count - 1; c >= 0; c--) { DestroyImmediate(savedCanvas.connections[c], true); } DestroyImmediate(savedCanvas.startNode, true); savedCanvas.nodes = new List <Node>(new Node[canvas.nodes.Count]); savedCanvas.connections = new List <NodeConnection>(new NodeConnection[canvas.connections.Count]); savedCanvas.canvasName = canvas.canvasName; savedCanvas.canvasDescription = canvas.canvasDescription; } else { savedCanvas = Object.Instantiate(canvas) as DialogCanvas; } savedCanvas.canvasTimestamp = System.DateTime.Now.ToString("yyyy / MM / dd - HH:mm: ss"); //Copy all Nodes for (int n = canvas.nodes.Count - 1; n >= 0; n--) { if (canvas.nodes[n] == null) { savedCanvas.nodes.RemoveAt(n); continue; } savedCanvas.nodes[n] = (Object.Instantiate(canvas.nodes[n]) as Node); savedCanvas.nodes[n].name = canvas.nodes[n].name; } //Copy Start Node savedCanvas.startNode = (Object.Instantiate(canvas.startNode) as StartNode); savedCanvas.startNode.name = canvas.startNode.name; //Copy all Connections for (int c = 0; c < canvas.connections.Count; c++) { savedCanvas.connections[c] = (Object.Instantiate(canvas.connections[c]) as NodeConnection); savedCanvas.connections[c].name = canvas.connections[c].name; } //Rebind Connections to Nodes for (int c = 0; c < canvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < canvas.connections[c].froms.Count; subNodeID++) { if (canvas.connections[c].froms[subNodeID] == canvas.startNode) { savedCanvas.connections[c].froms[subNodeID] = savedCanvas.startNode; } else { savedCanvas.connections[c].froms[subNodeID] = savedCanvas.nodes[canvas.nodes.IndexOf(canvas.connections[c].froms[subNodeID])]; } } if (canvas.connections[c].to == canvas.startNode) { savedCanvas.connections[c].to = savedCanvas.startNode; } else { savedCanvas.connections[c].to = savedCanvas.nodes[canvas.nodes.IndexOf(canvas.connections[c].to)]; } } //Rebind Nodes to Connections for (int c = 0; c < savedCanvas.connections.Count; c++) { for (int subNodeID = 0; subNodeID < savedCanvas.connections[c].froms.Count; subNodeID++) { List <NodeHandlePackage> fromsPackage = NodeOperator.GetConnections(savedCanvas.connections[c].froms[subNodeID], ConnectionType.Output); for (int fp = 0; fp < fromsPackage.Count; fp++) { if (fromsPackage[fp].handle.ID == savedCanvas.connections[c].fromAttributes[subNodeID].ID) { fromsPackage[fp].info.SetValue(savedCanvas.connections[c].froms[subNodeID], savedCanvas.connections[c]); } } } List <NodeHandlePackage> tosPackage = NodeOperator.GetConnections(savedCanvas.connections[c].to, ConnectionType.Input); for (int fp = 0; fp < tosPackage.Count; fp++) { if (tosPackage[fp].handle.ID == savedCanvas.connections[c].toAttribute.ID) { tosPackage[fp].info.SetValue(savedCanvas.connections[c].to, savedCanvas.connections[c]); } } } //Rebind Nodes to DefinedPoints List <string> keys = new List <string>(canvas.definedPoints.Keys); for (int k = 0; k < keys.Count; k++) { int nodeID = canvas.nodes.IndexOf(canvas.definedPoints[keys[k]]); savedCanvas.definedPoints[keys[k]] = savedCanvas.nodes[nodeID]; } //Get Saving Path string newPath = path == "" ? EditorUtility.SaveFilePanelInProject("Save Node Canvas", "Node Canvas", "asset", "", "Assets/") : path; //Send copied files and canvas to saving return(SaveCanvas(savedCanvas, newPath)); }
private void OnEnable() { canvas = (DialogCanvas)target; }
public virtual void OnDrawNodeGUI(Rect rect, DialogCanvas canvas) { OnDrawNodeGUI(rect); }
public virtual void PrepareNode(DialogCanvas canvas, string canvasRoot, string contentRoot) { }
public virtual void OnDelete(DialogCanvas canvas) { }