using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace NaughtyAttributes.Editor { public abstract class SpecialCasePropertyDrawerBase { public bool OnGUI(Rect rect, NaughtyProperty naughtyProperty) { bool changeDetected = false; // Check if visible bool visible = PropertyUtility.IsVisible(naughtyProperty.showIfAttribute, naughtyProperty.serializedProperty); if (!visible) { return false; } // Validate ValidatorAttribute[] validatorAttributes = naughtyProperty.validatorAttributes; foreach (var validatorAttribute in validatorAttributes) { validatorAttribute.GetValidator().ValidateProperty(naughtyProperty.serializedProperty); } // Check if enabled and draw EditorGUI.BeginChangeCheck(); bool enabled = PropertyUtility.IsEnabled(naughtyProperty.readOnlyAttribute, naughtyProperty.enableIfAttribute, naughtyProperty.serializedProperty); using (new EditorGUI.DisabledScope(disabled: !enabled)) { OnGUI_Internal(rect, naughtyProperty.serializedProperty, PropertyUtility.GetLabel(naughtyProperty.labelAttribute, naughtyProperty.serializedProperty)); } // Call OnValueChanged callbacks if (EditorGUI.EndChangeCheck()) { changeDetected = true; PropertyUtility.CallOnValueChangedCallbacks(naughtyProperty.serializedProperty); } return changeDetected; } public float GetPropertyHeight(SerializedProperty property) { return GetPropertyHeight_Internal(property); } protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); protected abstract float GetPropertyHeight_Internal(SerializedProperty property); } public static class SpecialCaseDrawerAttributeExtensions { private static Dictionary _drawersByAttributeType; static SpecialCaseDrawerAttributeExtensions() { _drawersByAttributeType = new Dictionary(); _drawersByAttributeType[typeof(ReorderableListAttribute)] = ReorderableListPropertyDrawer.Instance; } public static SpecialCasePropertyDrawerBase GetDrawer(this SpecialCaseDrawerAttribute attr) { SpecialCasePropertyDrawerBase drawer; if (_drawersByAttributeType.TryGetValue(attr.GetType(), out drawer)) { return drawer; } else { return null; } } } }