You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.8 KiB
99 lines
2.8 KiB
using UnityEditor; |
|
using UnityEngine; |
|
|
|
namespace NaughtyAttributes.Editor |
|
{ |
|
public abstract class PropertyDrawerBase : PropertyDrawer |
|
{ |
|
private SpecialCaseDrawerAttribute _cachedSpecialCaseDrawerAttribute; |
|
|
|
public sealed override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) |
|
{ |
|
// Check if visible |
|
bool visible = PropertyUtility.IsVisible(property); |
|
if (!visible) |
|
{ |
|
return; |
|
} |
|
|
|
// Validate |
|
ValidatorAttribute[] validatorAttributes = PropertyUtility.GetAttributes<ValidatorAttribute>(property); |
|
foreach (var validatorAttribute in validatorAttributes) |
|
{ |
|
validatorAttribute.GetValidator().ValidateProperty(property); |
|
} |
|
|
|
// Check if enabled and draw |
|
EditorGUI.BeginChangeCheck(); |
|
bool enabled = PropertyUtility.IsEnabled(property); |
|
|
|
using (new EditorGUI.DisabledScope(disabled: !enabled)) |
|
{ |
|
OnGUI_Internal(rect, property, PropertyUtility.GetLabel(property)); |
|
} |
|
|
|
// Call OnValueChanged callbacks |
|
if (EditorGUI.EndChangeCheck()) |
|
{ |
|
PropertyUtility.CallOnValueChangedCallbacks(property); |
|
} |
|
} |
|
|
|
protected abstract void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label); |
|
|
|
sealed override public float GetPropertyHeight(SerializedProperty property, GUIContent label) |
|
{ |
|
bool visible = PropertyUtility.IsVisible(property); |
|
if (!visible) |
|
{ |
|
return 0.0f; |
|
} |
|
|
|
return GetPropertyHeight_Internal(property, label); |
|
} |
|
|
|
protected virtual float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) |
|
{ |
|
return EditorGUI.GetPropertyHeight(property, includeChildren: true); |
|
} |
|
|
|
protected float GetPropertyHeight(SerializedProperty property) |
|
{ |
|
if (_cachedSpecialCaseDrawerAttribute == null) |
|
_cachedSpecialCaseDrawerAttribute = PropertyUtility.GetAttribute<SpecialCaseDrawerAttribute>(property); |
|
|
|
SpecialCaseDrawerAttribute specialCaseAttribute = _cachedSpecialCaseDrawerAttribute; |
|
if (specialCaseAttribute != null) |
|
{ |
|
return specialCaseAttribute.GetDrawer().GetPropertyHeight(property); |
|
} |
|
|
|
return EditorGUI.GetPropertyHeight(property, includeChildren: true); |
|
} |
|
|
|
public virtual float GetHelpBoxHeight() |
|
{ |
|
return EditorGUIUtility.singleLineHeight * 2.0f; |
|
} |
|
|
|
public void DrawDefaultPropertyAndHelpBox(Rect rect, SerializedProperty property, string message, MessageType messageType) |
|
{ |
|
float indentLength = NaughtyEditorGUI.GetIndentLength(rect); |
|
Rect helpBoxRect = new Rect( |
|
rect.x + indentLength, |
|
rect.y, |
|
rect.width - indentLength, |
|
GetHelpBoxHeight()); |
|
|
|
NaughtyEditorGUI.HelpBox(helpBoxRect, message, MessageType.Warning, context: property.serializedObject.targetObject); |
|
|
|
Rect propertyRect = new Rect( |
|
rect.x, |
|
rect.y + GetHelpBoxHeight(), |
|
rect.width, |
|
GetPropertyHeight(property)); |
|
|
|
EditorGUI.PropertyField(propertyRect, property, true); |
|
} |
|
} |
|
}
|
|
|