public override void OnInspectorGUI()
        {
            GUILayout.Label("Advanced Gesture States", EditorStyles.boldLabel);
            // do not draw the control variables
            AdvancedGesture advTarget = (AdvancedGesture)target;

            advTarget.gestureCooldown            = EditorGUILayout.FloatField("Cooldown (seconds)", advTarget.gestureCooldown);
            advTarget.allowedWhileHoldingObjects = EditorGUILayout.Toggle("Allow While Holding", advTarget.allowedWhileHoldingObjects);

            foreach (AdvancedGestureState advState in advTarget.advancedGestureStateList)
            {
                DrawAdvancedGestureState(advState);
            }

            if (GUILayout.Button("Add Gesture State"))
            {
                advTarget.advancedGestureStateList.Add(new AdvancedGestureState());
            }

            if (stateToDelete != null)
            {
                advTarget.advancedGestureStateList.Remove(stateToDelete);
                stateToDelete = null;
            }
            // set dirty to ensure the object is saved
            EditorUtility.SetDirty(target);
        }
        /// <summary>
        /// Draws the inspector for a single AdvancedGestureState
        /// </summary>
        protected void DrawAdvancedGestureState(AdvancedGestureState advState)
        {
            GUILayout.BeginHorizontal();
            advState.gestureName = GUILayout.TextField(advState.gestureName);
            if (GUILayout.Button("Remove Gesture State"))
            {
                stateToDelete = advState;
            }
            GUILayout.EndHorizontal();
            advState.coreGesture = (Gesture)EditorGUILayout.ObjectField("Core Gesture", advState.coreGesture, typeof(Gesture), false);
            advState.holdTime    = EditorGUILayout.Slider("Gesture Hold Time", advState.holdTime, 0.0f, 5.0f);

            foreach (AdvancedGestureCondition condition in advState.AdvancedGestureConditionList)
            {
                DrawAdvancedGestureCondition(condition);
            }

            GUILayout.BeginHorizontal();
            advState.editorNewConditionType = (AdvancedGestureState.AdvancedConditionType)EditorGUILayout.EnumPopup(advState.editorNewConditionType, GUILayout.Width(ENUM_WIDTH));
            if (GUILayout.Button("Add"))
            {
                switch (advState.editorNewConditionType)
                {
                case AdvancedGestureState.AdvancedConditionType.Hold:
                {
                    advState.holdConditionList.Add(new HoldGestureCondition());
                    break;
                }

                case AdvancedGestureState.AdvancedConditionType.Movement:
                {
                    advState.movementConditionList.Add(new MovementGestureCondition());
                    break;
                }

                case AdvancedGestureState.AdvancedConditionType.PalmAngle:
                {
                    advState.palmConditions.Add(new PalmNormalCondition());
                    break;
                }

                case AdvancedGestureState.AdvancedConditionType.SimultaneousAction:
                {
                    advState.simultaneousGestureConditionList.Add(new SimultaneousGesture());
                    break;
                }
                }
            }
            GUILayout.EndHorizontal();

            if (conditionToDelete != null)
            {
                if (conditionToDelete is HoldGestureCondition)
                {
                    advState.holdConditionList.Remove((HoldGestureCondition)conditionToDelete);
                }
                else if (conditionToDelete is MovementGestureCondition)
                {
                    advState.movementConditionList.Remove((MovementGestureCondition)conditionToDelete);
                }
                else if (conditionToDelete is PalmNormalCondition)
                {
                    advState.palmConditions.Remove((PalmNormalCondition)conditionToDelete);
                }
                else if (conditionToDelete is SimultaneousGesture)
                {
                    advState.simultaneousGestureConditionList.Remove((SimultaneousGesture)conditionToDelete);
                }
                conditionToDelete = null;
            }
        }