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
}
}