static bool EvaluateBoolWithOverride(FrameSettingsField field, Field forField, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings, bool negative) { bool value; if (forField.customOverrideable != null) { return(forField.customOverrideable() ^ negative); } if (serializedFrameSettings.GetOverrides(field)) { value = serializedFrameSettings.IsEnabled(field) ?? false; } else { value = defaultFrameSettings.IsEnabled(field); } return(value ^ negative); }
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; } } }