Esempio n. 1
0
        void DrawField(Field field, bool withOverride)
        {
            int indentLevel = attributes[field.field].indentLevel;

            if (indentLevel == 0)
            {
                --EditorGUI.indentLevel;    //alignment provided by the space for override checkbox
            }
            else
            {
                for (int i = indentLevel - 1; i > 0; --i)
                {
                    ++EditorGUI.indentLevel;
                }
            }
            bool enabled = field.IsOverrideableWithDependencies(serializedFrameSettings, defaultFrameSettings);

            withOverride &= enabled & GUI.enabled;
            bool shouldBeDisabled = withOverride || !enabled || !GUI.enabled;

            using (new EditorGUILayout.HorizontalScope())
            {
                var overrideRect = GUILayoutUtility.GetRect(15f, 17f, GUILayout.ExpandWidth(false)); //15 = kIndentPerLevel
                if (withOverride)
                {
                    bool originalValue = serializedFrameSettings.GetOverrides(field.field);
                    overrideRect.yMin       += 4f;
                    EditorGUI.showMixedValue = serializedFrameSettings.HaveMultipleOverride(field.field);
                    bool modifiedValue = GUI.Toggle(overrideRect, originalValue, overrideTooltip, CoreEditorStyles.smallTickbox);
                    EditorGUI.showMixedValue = false;

                    if (originalValue ^ modifiedValue)
                    {
                        serializedFrameSettings.SetOverrides(field.field, modifiedValue);
                    }

                    shouldBeDisabled = !modifiedValue;
                }
                using (new EditorGUI.DisabledScope(shouldBeDisabled))
                {
                    EditorGUI.showMixedValue = serializedFrameSettings.HaveMultipleValue(field.field);
                    using (new EditorGUILayout.VerticalScope())
                    {
                        //the following block will display a default value if provided instead of actual value (case if(true))
                        if (shouldBeDisabled)
                        {
                            if (field.overridedDefaultValue == null)
                            {
                                switch (attributes[field.field].type)
                                {
                                case FrameSettingsFieldAttribute.DisplayType.BoolAsCheckbox:
                                    DrawFieldShape(field.label, defaultFrameSettings.IsEnabled(field.field));
                                    break;

                                case FrameSettingsFieldAttribute.DisplayType.BoolAsEnumPopup:
                                    //shame but it is not possible to use Convert.ChangeType to convert int into enum in current C#
                                    //rely on string parsing for the moment
                                    var oldEnumValue = Enum.Parse(attributes[field.field].targetType, defaultFrameSettings.IsEnabled(field.field) ? "1" : "0");
                                    DrawFieldShape(field.label, oldEnumValue);
                                    break;

                                case FrameSettingsFieldAttribute.DisplayType.Others:
                                    var oldValue = field.customGetter();
                                    DrawFieldShape(field.label, oldValue);
                                    break;

                                default:
                                    throw new ArgumentException("Unknown FrameSettingsFieldAttribute");
                                }
                            }
                            else
                            {
                                DrawFieldShape(field.label, field.overridedDefaultValue);
                            }
                        }
                        else
                        {
                            switch (attributes[field.field].type)
                            {
                            case FrameSettingsFieldAttribute.DisplayType.BoolAsCheckbox:
                                bool oldBool = serializedFrameSettings.IsEnabled(field.field) ?? false;
                                bool newBool = (bool)DrawFieldShape(field.label, oldBool);
                                if (oldBool ^ newBool)
                                {
                                    Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field);
                                    serializedFrameSettings.SetEnabled(field.field, newBool);
                                }
                                break;

                            case FrameSettingsFieldAttribute.DisplayType.BoolAsEnumPopup:
                                //shame but it is not possible to use Convert.ChangeType to convert int into enum in current C#
                                //Also, Enum.Equals and Enum operator!= always send true here. As it seams to compare object reference instead of value.
                                var    oldBoolValue    = serializedFrameSettings.IsEnabled(field.field);
                                int    oldEnumIntValue = -1;
                                int    newEnumIntValue;
                                object newEnumValue;
                                if (oldBoolValue.HasValue)
                                {
                                    var oldEnumValue = Enum.GetValues(attributes[field.field].targetType).GetValue(oldBoolValue.Value ? 1 : 0);
                                    newEnumValue    = Convert.ChangeType(DrawFieldShape(field.label, oldEnumValue), attributes[field.field].targetType);
                                    oldEnumIntValue = ((IConvertible)oldEnumValue).ToInt32(System.Globalization.CultureInfo.CurrentCulture);
                                    newEnumIntValue = ((IConvertible)newEnumValue).ToInt32(System.Globalization.CultureInfo.CurrentCulture);
                                }
                                else     //in multi edition, do not assume any previous value
                                {
                                    newEnumIntValue = EditorGUILayout.Popup(field.label, -1, Enum.GetNames(attributes[field.field].targetType));
                                    newEnumValue    = newEnumIntValue < 0 ? null : Enum.GetValues(attributes[field.field].targetType).GetValue(newEnumIntValue);
                                }
                                if (oldEnumIntValue != newEnumIntValue)
                                {
                                    Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field);
                                    serializedFrameSettings.SetEnabled(field.field, Convert.ToInt32(newEnumValue) == 1);
                                }
                                break;

                            case FrameSettingsFieldAttribute.DisplayType.Others:
                                var oldValue = field.customGetter();
                                var newValue = DrawFieldShape(field.label, oldValue);
                                if (oldValue != newValue)
                                {
                                    Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field);
                                    field.customSetter(newValue);
                                }
                                break;

                            default:
                                throw new ArgumentException("Unknown FrameSettingsFieldAttribute");
                            }
                        }
                    }
                    EditorGUI.showMixedValue = false;
                }
            }
            if (indentLevel == 0)
            {
                ++EditorGUI.indentLevel;
            }
            else
            {
                for (int i = indentLevel - 1; i > 0; --i)
                {
                    --EditorGUI.indentLevel;
                }
            }
        }