private float CalculateBackgroundHeight(GenericGamepadProfileSelector.Profile profile)
        {
            int   constraintCount  = profile.Constraints.Count;
            int   fieldCount       = 2;
            float fieldHeight      = 18.0f;
            float constraintHeight = 18.0f;

            if (constraintCount > 0)
            {
                return(fieldCount * fieldHeight + Math.Max(constraintCount - 1, 0) * constraintHeight + 37.0f);
            }
            else
            {
                return(fieldCount * fieldHeight + 45.0f);
            }
        }
        private CollectionAction DisplayEntry(int index)
        {
            GenericGamepadProfileSelector.Profile profile = m_selector.GetProfile(index);
            SerializedProperty profileSP      = m_profiles.GetArrayElementAtIndex(index);
            SerializedProperty isExpanded     = profileSP.FindPropertyRelative("IsExpanded");
            SerializedProperty gamepadProfile = profileSP.FindPropertyRelative("GamepadProfile");
            SerializedProperty constraints    = profileSP.FindPropertyRelative("Constraints");
            CollectionAction   entryAction    = CollectionAction.None;

            string label = "Profile " + (index + 1);

            if (isExpanded.boolValue)
            {
                label += " (Click to collapse)";
            }
            else
            {
                label += " (Click to expand)";
            }

            if (GUILayout.Button(label, m_headerStyle, GUILayout.ExpandWidth(true)))
            {
                isExpanded.boolValue = !isExpanded.boolValue;
            }

            if (isExpanded.boolValue)
            {
                Rect bgRect = GUILayoutUtility.GetLastRect();
                bgRect.y     += 18;
                bgRect.height = CalculateBackgroundHeight(profile);
                GUI.Box(bgRect, "", (GUIStyle)"RL Background");

                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(4.0f);
                EditorGUILayout.BeginVertical();

                EditorGUILayout.PropertyField(gamepadProfile);
                GUILayout.Space(4.0f);
                EditorGUILayout.LabelField("Constraints", EditorStyles.boldLabel);
                if (constraints.arraySize > 0)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Space(14.0f);
                    GUILayout.BeginVertical();

                    for (int i = 0; i < constraints.arraySize; i++)
                    {
                        SerializedProperty constraint = constraints.GetArrayElementAtIndex(i);
                        SerializedProperty type       = constraint.FindPropertyRelative("Type");
                        SerializedProperty content    = constraint.FindPropertyRelative("Content");

                        GUILayout.BeginHorizontal();
                        EditorGUILayout.PropertyField(type, GUIContent.none);
                        EditorGUILayout.PropertyField(content, GUIContent.none);
                        GUILayout.Space(40.0f);
                        EditorGUILayout.EndHorizontal();

                        Rect constraintRect = GUILayoutUtility.GetLastRect();
                        Rect plusRect       = new Rect(constraintRect.xMax - 36, constraintRect.y, 16, constraintRect.height);
                        Rect minusRect      = new Rect(constraintRect.xMax - 16, constraintRect.y, 16, constraintRect.height);
                        if (GUI.Button(plusRect, m_constraintPlusButtonContent, m_footerButtonStyle))
                        {
                            constraints.InsertArrayElementAtIndex(i);
                            break;
                        }
                        if (GUI.Button(minusRect, m_constraintMinusButtonContent, m_footerButtonStyle))
                        {
                            constraints.DeleteArrayElementAtIndex(i--);
                        }
                    }

                    EditorGUILayout.EndVertical();
                    GUILayout.Space(14.0f);
                    EditorGUILayout.EndHorizontal();
                }
                else
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Space(8.0f);
                    GUILayout.BeginVertical();

                    if (GUILayout.Button("Add Constraint", GUILayout.Height(24.0f)))
                    {
                        constraints.InsertArrayElementAtIndex(0);
                    }

                    EditorGUILayout.EndVertical();
                    GUILayout.Space(8.0f);
                    EditorGUILayout.EndHorizontal();
                }

                GUILayout.Space(5.0f);
                EditorGUILayout.EndVertical();
                GUILayout.Space(4.0f);
                EditorGUILayout.EndHorizontal();
                GUILayout.Space(2.0f);
            }
            else
            {
                GUILayout.Box("", (GUIStyle)"RL Background", GUILayout.ExpandWidth(true), GUILayout.Height(10));
                GUILayout.Space(-3.0f);
            }

            EditorGUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            GUILayout.Label("", (GUIStyle)"RL Background", GUILayout.Width(60.0f), GUILayout.Height(20));

            Rect lastRect = GUILayoutUtility.GetLastRect();

            if (GUI.Button(new Rect(lastRect.x, lastRect.y, lastRect.width / 2, lastRect.height), m_profilePlusButtonContent, m_footerButtonStyle))
            {
                entryAction = CollectionAction.Add;
            }
            if (GUI.Button(new Rect(lastRect.center.x, lastRect.y, lastRect.width / 2, lastRect.height), m_profileMinusButtonContent, m_footerButtonStyle))
            {
                entryAction = CollectionAction.Remove;
            }

            EditorGUILayout.EndHorizontal();
            GUILayout.Space(5);
            return(entryAction);
        }