public virtual bool LoadGraphData()
        {
            ClearGraphData();
            m_NoSelectLabel.visible = false;
            m_GraphView.visible     = true;

            if (m_DialogData == null || m_DialogData.m_dialogNodes.Count == 0)
            {
                return(false);
            }

            // create the nodes
            List <DialogueNode> createdNodes = new List <DialogueNode>();

            for (int i = 0; i < m_DialogData.m_dialogNodes.Count; ++i)
            {
                int index = 0;

                DialogueNode node = DeserializeNode(m_DialogData.m_dialogNodes[i]);
                createdNodes.Add(node);
                m_GraphView.AddElement(node);
                node.title = m_DialogData.m_dialogNodes[i].m_title;

                for (int j = 0; j < m_DialogData.m_dialogNodes[i].inputNodeCount; j++)
                {
                    node.addInput();
                }

                for (int j = 0; j < m_DialogData.m_dialogNodes[i].outputNodeCount; j++)
                {
                    node.addOutput();
                }

                foreach (VisualElement element in node.outputContainer)
                {
                    if (element.childCount > 1 && element[0] is TextField)
                    {
                        ((TextField)element[0]).value =
                            m_DialogData.m_dialogNodes[i].m_outputDialogs[index++];
                    }
                }

                foreach (VisualElement element in node.mainContainer)
                {
                    if (element is TextField)
                    {
                        if (((TextField)element).name == "characterName")
                        {
                            ((TextField)element).value = m_DialogData.m_dialogNodes[i].m_speakingCharacterName;
                        }
                        else if (((TextField)element).name == "characterDialogue")
                        {
                            ((TextField)element).value = m_DialogData.m_dialogNodes[i].m_characterDialogue;
                        }
                    }
                }
            }

            //connect the nodes
            for (int i = 0; i < m_DialogData.m_dialogNodes.Count; ++i)
            {
                for (int iEdge = 0; iEdge < m_DialogData.m_dialogNodes[i].m_outputs.Count; ++iEdge)
                {
                    SerializableDialogData.SerializableDialogEdge edge = m_DialogData.m_dialogNodes[i].m_outputs[iEdge];
                    Port outputPort = createdNodes[i].outputContainer[edge.m_sourcePort][1] as Port;
                    Port inputPort  = createdNodes[edge.m_targetNode].inputContainer[edge.m_targetPort] as Port;
                    m_GraphView.AddElement(outputPort.ConnectTo(inputPort));
                }
            }

            return(true);
        }
        public void SaveGraphData()
        {
            if (m_DialogData == null)
            {
                return;
            }

            List <Node> nodes = m_GraphView.nodes.ToList();

            SerializableDialogData dialogGraphData = ScriptableObject.CreateInstance <SerializableDialogData>();

            dialogGraphData.m_dialogNodes = new List <SerializableDialogData.SerializableDialogNode>();

            string outPutString = string.Empty;

            for (int i = 0; i < nodes.Count; ++i)
            {
                SerializableDialogData.SerializableDialogNode dialogGraphNode =
                    new SerializableDialogData.SerializableDialogNode();
                Node currentNode = nodes[i];

                dialogGraphNode.inputNodeCount  = currentNode.inputContainer.childCount;
                dialogGraphNode.outputNodeCount = currentNode.outputContainer.childCount;

                dialogGraphNode.m_title         = currentNode.title;
                dialogGraphNode.m_position      = currentNode.GetPosition().position;
                dialogGraphNode.m_outputs       = new List <SerializableDialogData.SerializableDialogEdge>();
                dialogGraphNode.m_outputDialogs = new List <string>();

                foreach (VisualElement element in currentNode.mainContainer)
                {
                    if (element is TextField)
                    {
                        if (((TextField)element).name == "characterName")
                        {
                            dialogGraphNode.m_speakingCharacterName = ((TextField)element).value;
                        }
                        else if (((TextField)element).name == "characterDialogue")
                        {
                            dialogGraphNode.m_characterDialogue = ((TextField)element).value;
                        }
                    }
                }

                foreach (VisualElement element in currentNode.outputContainer)
                {
                    if (element.childCount > 1 && element[0] is TextField)
                    {
                        outPutString = ((TextField)element[0]).value;
                        dialogGraphNode.m_outputDialogs.Add(outPutString);
                    }

                    if (element.childCount > 1 && element[1] is Port)
                    {
                        foreach (Edge edge in ((Port)element[1]).connections)
                        {
                            SerializableDialogData.SerializableDialogEdge serializedEdge =
                                new SerializableDialogData.SerializableDialogEdge();

                            var sourceContainer = currentNode.outputContainer.First(e => e[1] == edge.output);
                            serializedEdge.m_sourcePort = sourceContainer == null ? -1 : currentNode.outputContainer.IndexOf(sourceContainer);
                            serializedEdge.m_targetPort = edge.input.node.inputContainer.IndexOf(edge.input);
                            serializedEdge.m_targetNode = nodes.IndexOf(edge.input.node);
                            if (serializedEdge.m_sourcePort == -1 || serializedEdge.m_targetPort == -1)
                            {
                                continue;
                            }

                            dialogGraphNode.m_outputs.Add(serializedEdge);
                        }
                    }
                }

                dialogGraphData.m_dialogNodes.Add(dialogGraphNode);
            }

            EditorUtility.CopySerialized(dialogGraphData, m_DialogData);
            AssetDatabase.SaveAssets();
        }