private void DrawEndGameCondition(EndGameCondition condition)
        {
            var oldLabelWidth = EditorGUIUtility.labelWidth;

            EditorGUIUtility.labelWidth = EditorConfig.LargeLabelWidth;

            GUILayout.BeginVertical();

            var fields = condition.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public).OrderBy(x => ((OrderAttribute)x.GetCustomAttributes(typeof(OrderAttribute), false)[0]).Order).ToArray();

            for (var i = 0; i < fields.Length; i++)
            {
                var attribute = Attribute.GetCustomAttribute(fields[i], typeof(FieldAttribute)) as FieldAttribute;
                if (attribute != null)
                {
                    GUILayout.BeginHorizontal();
                    attribute.Draw(gameConfig, condition, ref fields[i]);
                    GUILayout.EndHorizontal();
                }
            }

            GUILayout.EndVertical();

            EditorGUIUtility.labelWidth = oldLabelWidth;
        }
        public GameConfigurationEditor(GameConfiguration config) : base(config)
        {
            gameStartActionList = EditorUtils.SetupReorderableList("Game start actions", gameConfig.properties.gameStartActions, ref currentGameStartAction, (rect, x) =>
            {
                EditorGUI.LabelField(new Rect(rect.x, rect.y, 200, EditorGUIUtility.singleLineHeight), x.name);
            },
                                                                   (x) =>
            {
                currentGameStartAction = x;
            },
                                                                   () =>
            {
                var menu        = new GenericMenu();
                var actionTypes = AppDomain.CurrentDomain.GetAllDerivedTypes(typeof(GameAction));
                foreach (var action in actionTypes)
                {
                    menu.AddItem(new GUIContent(StringUtils.DisplayCamelCaseString(action.Name)), false, CreateGameStartActionCallback, action);
                }
                menu.ShowAsContext();
            },
                                                                   (x) =>
            {
                currentGameStartAction = null;
            });

            turnStartActionList = EditorUtils.SetupReorderableList("Turn start actions", gameConfig.properties.turnStartActions, ref currentTurnStartAction, (rect, x) =>
            {
                EditorGUI.LabelField(new Rect(rect.x, rect.y, 200, EditorGUIUtility.singleLineHeight), x.name);
            },
                                                                   (x) =>
            {
                currentTurnStartAction = x;
            },
                                                                   () =>
            {
                var menu        = new GenericMenu();
                var actionTypes = AppDomain.CurrentDomain.GetAllDerivedTypes(typeof(GameAction));
                foreach (var action in actionTypes)
                {
                    menu.AddItem(new GUIContent(StringUtils.DisplayCamelCaseString(action.Name)), false, CreateTurnStartActionCallback, action);
                }
                menu.ShowAsContext();
            },
                                                                   (x) =>
            {
                currentTurnStartAction = null;
            });

            turnEndActionList = EditorUtils.SetupReorderableList("Turn end actions", gameConfig.properties.turnEndActions, ref currentTurnEndAction, (rect, x) =>
            {
                EditorGUI.LabelField(new Rect(rect.x, rect.y, 200, EditorGUIUtility.singleLineHeight), x.name);
            },
                                                                 (x) =>
            {
                currentTurnEndAction = x;
            },
                                                                 () =>
            {
                var menu        = new GenericMenu();
                var actionTypes = AppDomain.CurrentDomain.GetAllDerivedTypes(typeof(GameAction));
                foreach (var action in actionTypes)
                {
                    menu.AddItem(new GUIContent(StringUtils.DisplayCamelCaseString(action.Name)), false, CreateTurnEndActionCallback, action);
                }
                menu.ShowAsContext();
            },
                                                                 (x) =>
            {
                currentTurnEndAction = null;
            });

            endGameConditionList = EditorUtils.SetupReorderableList("End game conditions", gameConfig.properties.endGameConditions, ref currentEndGameCondition, (rect, x) =>
            {
                var conditionString = x.type.ToString() + ": " + x.GetReadableString(gameConfig);
                EditorGUI.LabelField(new Rect(rect.x, rect.y, 200, EditorGUIUtility.singleLineHeight), conditionString);
            },
                                                                    (x) =>
            {
                currentEndGameCondition = x;
            },
                                                                    () =>
            {
                var menu           = new GenericMenu();
                var conditionTypes = AppDomain.CurrentDomain.GetAllDerivedTypes(typeof(EndGameCondition));
                foreach (var condition in conditionTypes)
                {
                    menu.AddItem(new GUIContent(StringUtils.DisplayCamelCaseString(condition.Name)), false, CreateEndGameConditionCallback, condition);
                }
                menu.ShowAsContext();
            },
                                                                    (x) =>
            {
                currentEndGameCondition = null;
            });
        }