public void Open(ScriptGraphAsset scriptGraphAsset)
        {
            this.scriptGraphAsset = scriptGraphAsset;

            graphView = new ScriptGraphView(this);
            this.rootVisualElement.Add(graphView);

            this.Show();
        }
        private void Load(ScriptGraphAsset asset)
        {
            var tempNodeList = new List <ScriptGraphNode>(asset.list.Count);

            foreach (var data in asset.list)
            {
                ScriptGraphNode node = ScriptNodeDeserializer.Deserialze(data);
                node.onNodeContentChanged = OnNodeContentChanged;
                this.AddElement(node);
                tempNodeList.Add(node);
            }

            foreach (ScriptGraphNode nodeLeft in tempNodeList)
            {
                int portIndex = 0;

                for (int i = 0; i < nodeLeft.outIds.Count; ++i)
                {
                    int outputId = nodeLeft.outIds[i];

                    if (outputId <= 0)
                    {
                        portIndex++;
                        continue;
                    }

                    foreach (ScriptGraphNode nodeRight in tempNodeList)
                    {
                        if (outputId == nodeRight.id)
                        {
                            Edge edge = new Edge()
                            {
                                output = nodeLeft.outputPorts[portIndex++],
                                input  = nodeRight.inputPort
                            };

                            edge.output.Connect(edge);
                            edge.input.Connect(edge);

                            AddElement(edge);
                        }
                    }
                }
            }
        }
        private static void ConvertToMacro()
        {
            var selection = GraphWindow.active?.reference?.graph?.Canvas().selection;

            if (selection != null && selection.Count > 0)
            {
                var path = EditorUtility.SaveFilePanelInProject("Save Selection to Script Graph Asset", "", "asset", "");
                if (!string.IsNullOrEmpty(path))
                {
                    ConvertToEmbed();
                    var superUnit = selection.ToList()[0] as NestedNode;
                    var asset     = ScriptGraphAsset.CreateInstance <ScriptGraphAsset>();
                    AssetDatabase.CreateAsset(asset, path);
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                    asset.graph = superUnit.nest.embed;
                    superUnit.nest.SwitchToMacro(asset);
                }
            }
        }