using System; using UnityEngine; namespace KitsuneCafe.Sys.Attributes { /// /// Draws the field/property ONLY if the compared property compared by the comparison type with the value of comparedValue returns true. /// Based on: https://forum.unity.com/threads/draw-a-field-only-if-a-condition-is-met.448855/ /// [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)] public class DrawIfAttribute : PropertyAttribute { #region Fields public string ComparedPropertyName { get; private set; } public object ComparedValue { get; private set; } public DisablingType DisablingType { get; private set; } public bool IsEnumWithFlags { get; private set; } #endregion /// /// Only draws the field if the condition is true.

/// Supports Boolean and Enum. ///
/// The name of the property that is being compared (case sensitive). /// The value the property is being compared to. /// Determine if it will hide the field or make it read only if the condition is NOT met. /// The type of the ComparedValue object to determine if it's an enum with the [Flags] attribute or not. /// Defaulted to DisablingType.DontDraw. public DrawIfAttribute(string comparedPropertyName, object comparedValue, DisablingType disablingType = DisablingType.DontDraw, Type type = null) { ComparedPropertyName = comparedPropertyName; ComparedValue = comparedValue; DisablingType = disablingType; IsEnumWithFlags = HasFlagsAttribute(type); } /// /// Determine if an Enum type has the [Flags] attribute /// /// /// private bool HasFlagsAttribute(Type type) { if (type == null || type.IsEnum == false) { return false; } return type.IsDefined(typeof(FlagsAttribute), inherit: false); } } /// /// Types of comperisons. /// public enum DisablingType { ReadOnly = 2, DontDraw = 3 } }