using System; using System.Collections; using System.Collections.Generic; using HurricaneVR.Framework.Core.Utils; using UnityEditor; using UnityEngine; namespace HurricaneVR.Editor { [CustomPropertyDrawer(typeof(DrawIfAttribute))] public class DrawIfPropertyDrawer : PropertyDrawer { #region Fields // Reference to the attribute on the property. DrawIfAttribute drawIf; // Field that is being compared. SerializedProperty comparedField; #endregion public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { if (!ShowMe(property) && drawIf.disablingType == DrawIfAttribute.DisablingType.DontDraw) return 0f; // The height of the property should be defaulted to the default height. return base.GetPropertyHeight(property, label); } /// /// Errors default to showing the property. /// private bool ShowMe(SerializedProperty property) { drawIf = attribute as DrawIfAttribute; // Replace propertyname to the value from the parameter string path = property.propertyPath.Contains(".") ? System.IO.Path.ChangeExtension(property.propertyPath, drawIf.comparedPropertyName) : drawIf.comparedPropertyName; comparedField = property.serializedObject.FindProperty(path); if (comparedField == null) { Debug.LogError("Cannot find property with name: " + path); return true; } // get the value & compare based on types switch (comparedField.type) { // Possible extend cases to support your own type case "bool": return comparedField.boolValue.Equals(drawIf.comparedValue); case "Enum": return comparedField.enumValueIndex.Equals((int)drawIf.comparedValue); default: Debug.LogError("Error: " + comparedField.type + " is not supported of " + path); return true; } } public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // If the condition is met, simply draw the field. if (ShowMe(property)) { EditorGUI.PropertyField(position, property, label); } //...check if the disabling type is read only. If it is, draw it disabled else if (drawIf.disablingType == DrawIfAttribute.DisablingType.ReadOnly) { GUI.enabled = false; EditorGUI.PropertyField(position, property, label); GUI.enabled = true; } } } public enum DisablingType { ReadOnly = 2, DontDraw = 3 } public enum ComparisonType { Equals = 1, NotEqual = 2, GreaterThan = 3, SmallerThan = 4, SmallerOrEqual = 5, GreaterOrEqual = 6 } }