void DrawGroupGUI(int index)
        {
            TriggerGroup       group            = spline.triggerGroups[index];
            SerializedObject   serializedObject = new SerializedObject(spline);
            SerializedProperty groups           = serializedObject.FindProperty("triggerGroups");
            SerializedProperty groupProperty    = groups.GetArrayElementAtIndex(index);

            EditorGUI.indentLevel += 2;
            if (selectedGroup == index && renameGroup)
            {
                if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter))
                {
                    renameGroup = false;
                    Repaint();
                }
                group.name = EditorGUILayout.TextField(group.name);
            }
            else
            {
                group.open = EditorGUILayout.Foldout(group.open, index + " - " + group.name);
            }
            Rect lastRect = GUILayoutUtility.GetLastRect();

            if (lastRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown && Event.current.button == 1)
            {
                GenericMenu menu = new GenericMenu();
                menu.AddItem(new GUIContent("Rename"), false, delegate { RecordUndo("Rename Trigger Group"); selectedGroup = index; renameGroup = true; renameTrigger = false; Repaint(); });
                menu.AddItem(new GUIContent("Delete"), false, delegate {
                    RecordUndo("Delete Trigger Group");
                    ArrayUtility.RemoveAt(ref spline.triggerGroups, index);
                    Repaint();
                });
                menu.ShowAsContext();
            }
            EditorGUI.indentLevel -= 2;
            if (!group.open)
            {
                return;
            }

            for (int i = 0; i < group.triggers.Length; i++)
            {
                DrawTriggerGUI(i, index, groupProperty);
            }
            if (GUI.changed)
            {
                serializedObject.ApplyModifiedProperties();
            }

            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Add Trigger"))
            {
                RecordUndo("Add Trigger");
                SplineTrigger newTrigger = new SplineTrigger(addTriggerType);
                newTrigger.name = "Trigger " + (group.triggers.Length + 1);
                ArrayUtility.Add(ref group.triggers, newTrigger);
            }
            addTriggerType = (SplineTrigger.Type)EditorGUILayout.EnumPopup(addTriggerType);
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();
            EditorGUILayout.Space();
        }
        void DrawTriggerGUI(int index, int groupIndex, SerializedProperty groupProperty)
        {
            bool               isSelected       = selected == index && selectedGroup == groupIndex;
            TriggerGroup       group            = spline.triggerGroups[groupIndex];
            SplineTrigger      trigger          = group.triggers[index];
            SerializedProperty triggersProperty = groupProperty.FindPropertyRelative("triggers");
            SerializedProperty triggerProperty  = triggersProperty.GetArrayElementAtIndex(index);
            SerializedProperty eventProperty    = triggerProperty.FindPropertyRelative("onCross");
            SerializedProperty positionProperty = triggerProperty.FindPropertyRelative("position");
            SerializedProperty colorProperty    = triggerProperty.FindPropertyRelative("color");
            SerializedProperty nameProperty     = triggerProperty.FindPropertyRelative("name");
            SerializedProperty enabledProperty  = triggerProperty.FindPropertyRelative("enabled");
            SerializedProperty workOnceProperty = triggerProperty.FindPropertyRelative("workOnce");
            SerializedProperty typeProperty     = triggerProperty.FindPropertyRelative("type");

            Color col = colorProperty.colorValue;

            if (isSelected)
            {
                col.a = 1f;
            }
            else
            {
                col.a = 0.6f;
            }
            GUI.backgroundColor = col;

            EditorGUILayout.BeginVertical(GUI.skin.box);
            GUI.backgroundColor = Color.white;
            if (trigger == null)
            {
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("NULL");
                if (GUILayout.Button("x"))
                {
                    ArrayUtility.RemoveAt(ref group.triggers, index);
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
                return;
            }


            if (isSelected && renameTrigger)
            {
                if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter))
                {
                    renameTrigger = false;
                    Repaint();
                }
                nameProperty.stringValue = EditorGUILayout.TextField(nameProperty.stringValue);
            }
            else
            {
                EditorGUILayout.LabelField(nameProperty.stringValue);
            }

            if (isSelected)
            {
                EditorGUILayout.Space();
                EditorGUILayout.PropertyField(enabledProperty);
                EditorGUILayout.PropertyField(colorProperty);

                EditorGUILayout.BeginHorizontal();
                positionProperty.floatValue = EditorGUILayout.Slider("Position", positionProperty.floatValue, 0f, 1f);
                if (GUILayout.Button("Set Distance", GUILayout.Width(85)))
                {
                    DistanceWindow w = EditorWindow.GetWindow <DistanceWindow>(true);
                    w.Init(OnSetDistance, spline.CalculateLength());
                    setDistanceGroup   = groupIndex;
                    setDistanceTrigger = index;
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.PropertyField(typeProperty);
                EditorGUILayout.PropertyField(workOnceProperty);

                EditorGUILayout.PropertyField(eventProperty);
            }
            EditorGUILayout.EndVertical();

            Rect lastRect = GUILayoutUtility.GetLastRect();

            if (lastRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown)
            {
                if (Event.current.button == 0)
                {
                    Select(groupIndex, index);
                }
                else if (Event.current.button == 1)
                {
                    GenericMenu menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Deselect"), false, delegate { Select(-1, -1); });
                    menu.AddItem(new GUIContent("Rename"), false, delegate { Select(groupIndex, index); renameTrigger = true; renameGroup = false; });
                    if (index > 0)
                    {
                        menu.AddItem(new GUIContent("Move Up"), false, delegate {
                            RecordUndo("Move Trigger Up");
                            SplineTrigger temp        = group.triggers[index - 1];
                            group.triggers[index - 1] = trigger;
                            group.triggers[index]     = temp;
                            selected--;
                            renameTrigger = false;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Move Up"));
                    }
                    if (index < group.triggers.Length - 1)
                    {
                        menu.AddItem(new GUIContent("Move Down"), false, delegate {
                            RecordUndo("Move Trigger Down");
                            SplineTrigger temp        = group.triggers[index + 1];
                            group.triggers[index + 1] = trigger;
                            group.triggers[index]     = temp;
                            selected--;
                            renameTrigger = false;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Move Down"));
                    }

                    menu.AddItem(new GUIContent("Duplicate"), false, delegate {
                        RecordUndo("Duplicate Trigger");
                        SplineTrigger newTrigger = new SplineTrigger(SplineTrigger.Type.Double);
                        newTrigger.color         = colorProperty.colorValue;
                        newTrigger.enabled       = enabledProperty.boolValue;
                        newTrigger.position      = positionProperty.floatValue;
                        newTrigger.type          = (SplineTrigger.Type)typeProperty.intValue;
                        newTrigger.name          = "Trigger " + (group.triggers.Length + 1);
                        ArrayUtility.Add(ref group.triggers, newTrigger);
                        Select(groupIndex, group.triggers.Length - 1);
                    });
                    menu.AddItem(new GUIContent("Delete"), false, delegate {
                        RecordUndo("Delete Trigger");
                        ArrayUtility.RemoveAt(ref group.triggers, index);
                        Select(-1, -1);
                    });
                    menu.ShowAsContext();
                }
            }
        }
        void DrawTriggerGUI(int index, int groupIndex, SerializedProperty groupProperty)
        {
            bool               isSelected       = selected == index && selectedGroup == groupIndex;
            TriggerGroup       group            = spline.triggerGroups[groupIndex];
            SplineTrigger      trigger          = group.triggers[index];
            SerializedProperty triggersProperty = groupProperty.FindPropertyRelative("triggers");
            SerializedProperty triggerProperty  = triggersProperty.GetArrayElementAtIndex(index);
            SerializedProperty eventProperty    = triggerProperty.FindPropertyRelative("onCross");

            Color col = trigger.color;

            if (isSelected)
            {
                col.a = 1f;
            }
            else
            {
                col.a = 0.6f;
            }
            GUI.backgroundColor = col;

            EditorGUILayout.BeginVertical(GUI.skin.box);
            GUI.backgroundColor = Color.white;
            if (trigger == null)
            {
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("NULL");
                if (GUILayout.Button("x"))
                {
                    ArrayUtility.RemoveAt(ref group.triggers, index);
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
                return;
            }


            if (isSelected && renameTrigger)
            {
                if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter))
                {
                    renameTrigger = false;
                    Repaint();
                }
                trigger.name = EditorGUILayout.TextField(trigger.name);
            }
            else
            {
                EditorGUILayout.LabelField(trigger.name);
            }

            if (isSelected)
            {
                EditorGUILayout.Space();
                trigger.enabled  = EditorGUILayout.Toggle("Enabled", trigger.enabled);
                trigger.color    = EditorGUILayout.ColorField("Color", trigger.color);
                trigger.position = EditorGUILayout.Slider("Position", (float)trigger.position, 0f, 1f);
                trigger.type     = (SplineTrigger.Type)EditorGUILayout.EnumPopup("Type", trigger.type);
                trigger.workOnce = EditorGUILayout.Toggle("Work Once", trigger.workOnce);

                EditorGUILayout.PropertyField(eventProperty);
            }
            EditorGUILayout.EndVertical();

            Rect lastRect = GUILayoutUtility.GetLastRect();

            if (lastRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDown)
            {
                if (Event.current.button == 0)
                {
                    Select(groupIndex, index);
                }
                else if (Event.current.button == 1)
                {
                    GenericMenu menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Deselect"), false, delegate { Select(-1, -1); });
                    menu.AddItem(new GUIContent("Rename"), false, delegate { Select(groupIndex, index); renameTrigger = true; renameGroup = false; });
                    if (index > 0)
                    {
                        menu.AddItem(new GUIContent("Move Up"), false, delegate {
                            RecordUndo("Move Trigger Up");
                            SplineTrigger temp        = group.triggers[index - 1];
                            group.triggers[index - 1] = trigger;
                            group.triggers[index]     = temp;
                            selected--;
                            renameTrigger = false;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Move Up"));
                    }
                    if (index < group.triggers.Length - 1)
                    {
                        menu.AddItem(new GUIContent("Move Down"), false, delegate {
                            RecordUndo("Move Trigger Down");
                            SplineTrigger temp        = group.triggers[index + 1];
                            group.triggers[index + 1] = trigger;
                            group.triggers[index]     = temp;
                            selected--;
                            renameTrigger = false;
                        });
                    }
                    else
                    {
                        menu.AddDisabledItem(new GUIContent("Move Down"));
                    }

                    menu.AddItem(new GUIContent("Duplicate"), false, delegate {
                        RecordUndo("Duplicate Trigger");
                        SplineTrigger newTrigger = new SplineTrigger(SplineTrigger.Type.Double);
                        newTrigger.color         = trigger.color;
                        newTrigger.enabled       = trigger.enabled;
                        newTrigger.position      = trigger.position;
                        newTrigger.type          = trigger.type;
                        newTrigger.name          = "Trigger " + (group.triggers.Length + 1);
                        ArrayUtility.Add(ref group.triggers, newTrigger);
                        Select(groupIndex, group.triggers.Length - 1);
                    });
                    menu.AddItem(new GUIContent("Delete"), false, delegate {
                        RecordUndo("Delete Trigger");
                        ArrayUtility.RemoveAt(ref group.triggers, index);
                        Select(-1, -1);
                    });
                    menu.ShowAsContext();
                }
            }
        }