public override void OnInspectorGUI()
 {
     showDefaultInspector = EditorGUILayout.Toggle("Show Default inspector", showDefaultInspector);
     if (showDefaultInspector)
     {
         DrawDefaultInspector();
     }
     else
     {
         CustomGUI.DrawSeparator(Color.gray);
         ShowNodesAndPathInInspector();
     }
 }
        private void ShowNodesAndPathInInspector()
        {
            script.graphData.nodeSize                = EditorGUILayout.Slider("Node gizmo Size", script.graphData.nodeSize, 0.1f, 3f);
            script.graphData.lineColor               = EditorGUILayout.ColorField("Path Color", script.graphData.lineColor);
            script.graphData.lineType                = (PathLineType)EditorGUILayout.EnumPopup("Path Type", script.graphData.lineType);
            script.graphData.heightFromTheGround     = EditorGUILayout.FloatField("Offset from ground( Height )", script.graphData.heightFromTheGround);
            script.graphData.groundColliderLayerName = EditorGUILayout.TextField("Ground collider layer name", script.graphData.groundColliderLayerName);
            EditorGUILayout.Space();
            GUILayout.Label("<size=12><b>Nodes</b></size>", CustomGUI.GetStyleWithRichText());

            if (script.graphData.nodes.Count > 0)
            {
                showNodeIDsInTheScene = EditorGUILayout.Toggle("Show Node IDs in scene", showNodeIDsInTheScene);

                List <Node> nodeList = script.graphData.nodes;
                for (int j = 0; j < nodeList.Count; j++)
                {
                    GUILayout.BeginHorizontal();
                    {
                        EditorGUILayout.LabelField("\t" + "Node <Color=" + nodeGUITextColor + ">" + nodeList[j].autoGeneratedID + "</Color>", CustomGUI.GetStyleWithRichText(), GUILayout.Width(120f));

                        nodeList[j].SetPosition(EditorGUILayout.Vector3Field("", nodeList[j].Position));
                        EditorGUILayout.LabelField("Enable", EditorStyles.miniLabel, GUILayout.Width(50f)); nodeList[j].SetAsOpen(EditorGUILayout.Toggle(nodeList[j].IsOpen));

                        if (GUILayout.Button("+", GUILayout.Width(25f)))
                        {
                            AddNode(nodeList[j].Position + Vector3.right + Vector3.up, j + 1);
                        }
                        if (GUILayout.Button("-", GUILayout.Width(25f)))
                        {
                            DeleteNode(j);
                        }
                    }
                    GUILayout.EndHorizontal();
                }
            }
            else
            {
                EditorGUILayout.LabelField("<Color=green> Nodes are empty. Use <b>Add Node</b> in scene view to create Nodes!</Color>", CustomGUI.GetStyleWithRichText(CustomGUI.SetAlignmentForText(TextAnchor.MiddleCenter)));
            }
            EditorGUILayout.Space();
            GUILayout.Label("<size=12><b>Paths</b></size>", CustomGUI.GetStyleWithRichText());

            if (script.graphData.paths.Count > 0)
            {
                showPathIDsInTheScene = EditorGUILayout.Toggle("Show Path IDs in scene", showPathIDsInTheScene);
                drawPathsInTheScene   = EditorGUILayout.Toggle("Draw Paths", drawPathsInTheScene);
                showCostsInTheScene   = EditorGUILayout.Toggle("Show Path Costs in scene", showCostsInTheScene);

                List <Path> paths = script.graphData.paths;
                for (int j = 0; j < paths.Count; j++)
                {
                    GUILayout.BeginHorizontal();
                    {
                        EditorGUILayout.LabelField("\t" + "Path <Color=" + pathGUITextColor + ">" + paths[j].autoGeneratedID + "</Color>", CustomGUI.GetStyleWithRichText(), GUILayout.Width(120f));

                        EditorGUILayout.LabelField("From", EditorStyles.miniLabel, GUILayout.Width(30f)); paths[j].IDOfA = EditorGUILayout.IntField(paths[j].IDOfA, GUILayout.Width(50f));
                        EditorGUILayout.LabelField("To", EditorStyles.miniLabel, GUILayout.Width(25f)); paths[j].IDOfB   = EditorGUILayout.IntField(paths[j].IDOfB, GUILayout.Width(50f));
                        EditorGUILayout.LabelField("<Color=" + costGUITextColor + ">" + "Cost" + "</Color>", CustomGUI.GetStyleWithRichText(EditorStyles.miniLabel), GUILayout.Width(30f)); paths[j].cost = EditorGUILayout.IntField(paths[j].cost, GUILayout.Width(50f));

                        EditorGUILayout.LabelField("One Way", EditorStyles.miniLabel, GUILayout.Width(50f)); paths[j].isOneWay = EditorGUILayout.Toggle(paths[j].isOneWay);
                        EditorGUILayout.LabelField("Enable", EditorStyles.miniLabel, GUILayout.Width(50f)); paths[j].isOpen    = EditorGUILayout.Toggle(paths[j].isOpen);

                        if (GUILayout.Button("+", GUILayout.Width(25f)))
                        {
                            AddPath(j + 1);
                        }
                        if (GUILayout.Button("-", GUILayout.Width(25f)))
                        {
                            DeletePath(j);
                        }
                    }
                    GUILayout.EndHorizontal();
                }
            }
            else
            {
                EditorGUILayout.LabelField("<Color=green> Paths are empty. Use <b>Connect Nodes</b> in scene view to create Paths!</Color>", CustomGUI.GetStyleWithRichText(CustomGUI.SetAlignmentForText(TextAnchor.MiddleCenter)));
            }

            if (GUI.changed)
            {
                MarkThisDirty();
            }
        }
        private void DrawGUIDisplayForNodes()
        {
            if (!showNodeIDsInTheScene)
            {
                return;
            }

            Node    currNode;
            Vector2 guiPosition;

            Handles.BeginGUI();

            for (int i = 0; i < script.graphData.nodes.Count; i++)
            {
                currNode    = script.graphData.nodes[i];
                guiPosition = HandleUtility.WorldToGUIPoint(currNode.Position);
                GUI.Label(new Rect(guiPosition.x - 10, guiPosition.y - 30, 20, 20), "<Color=" + nodeGUITextColor + ">" + currNode.autoGeneratedID.ToString() + "</Color>", CustomGUI.GetStyleWithRichText());
            }
            Handles.EndGUI();
        }
        private void DrawPathLine()
        {
            List <Path> paths = script.graphData.paths;
            List <Node> nodes = script.graphData.nodes;
            Vector3     currNode;
            Vector2     guiPosition;

            if (paths == null || nodes == null)
            {
                return;
            }

            Handles.color = script.graphData.lineColor;
            Node a, b;

            for (int i = 0; i < paths.Count; i++)
            {
                if (!paths[i].isOpen)
                {
                    continue;
                }

                a = b = null;
                if (script.graphData.nodesSorted.ContainsKey(paths[i].IDOfA))
                {
                    a = script.graphData.nodesSorted[paths[i].IDOfA];
                }

                if (script.graphData.nodesSorted.ContainsKey(paths[i].IDOfB))
                {
                    b = script.graphData.nodesSorted[paths[i].IDOfB];
                }

                if (a != null && b != null && a != b && a.IsOpen && b.IsOpen)
                {
                    if (drawPathsInTheScene)
                    {
                        Handles.DrawLine(a.Position, b.Position);
                    }

                    Handles.BeginGUI();
                    {
                        currNode    = (a.Position + b.Position) / 2;
                        guiPosition = HandleUtility.WorldToGUIPoint(currNode);
                        string str = "";
                        if (showPathIDsInTheScene)
                        {
                            str += "<Color=" + pathGUITextColor + ">" + paths[i].autoGeneratedID.ToString() + "</Color>";
                        }
                        if (showCostsInTheScene)
                        {
                            if (!string.IsNullOrEmpty(str))
                            {
                                str += "<Color=" + "#ffffff" + ">" + "  Cost: " + "</Color>";
                            }
                            str += "<Color=" + costGUITextColor + ">" + paths[i].cost.ToString() + "</Color>";
                        }

                        if (!string.IsNullOrEmpty(str))
                        {
                            GUI.Label(new Rect(guiPosition.x - 10, guiPosition.y - 30, 40, 20), str, CustomGUI.GetStyleWithRichText());
                        }
                    }
                    Handles.EndGUI();
                }
            }
            Handles.color = Color.white;
        }