public static bool TryGetDecoratorDrawerTypes([NotNull] LinkedMemberInfo memberInfo, out object[] decoratorAttributes, out Type[] drawerTypes) { //TO DO: Add support for PropertyAttribute.order drawerTypes = null; decoratorAttributes = null; var attributes = memberInfo.GetAttributes(Types.PropertyAttribute); for (int n = attributes.Length - 1; n >= 0; n--) { var attribute = attributes[n]; Type drawerType; if (TryGetDecoratorDrawerType(attribute.GetType(), out drawerType)) { if (drawerTypes == null) { decoratorAttributes = new[] { attribute }; drawerTypes = new[] { drawerType }; } else { decoratorAttributes = decoratorAttributes.Add(attribute); drawerTypes = drawerTypes.Add(drawerType); } } } return(drawerTypes != null); }
public IUseDrawer GetAttributeThatDefinesDrawer([NotNull] LinkedMemberInfo memberInfo, Type drawerType) { var attributes = memberInfo.GetAttributes(false, true); for (int n = 0, count = attributes.Length; n < count; n++) { var useDrawer = attributes[n] as IUseDrawer; if (useDrawer != null && useDrawer.GetDrawerType(memberInfo.Type, GetClassDrawerType(memberInfo.Type)) == drawerType) { return(useDrawer); } } attributes = memberInfo.Type.GetCustomAttributes(false); PluginAttributeConverterProvider.ConvertAll(ref attributes); for (int n = 0, count = attributes.Length; n < count; n++) { var useDrawer = attributes[n] as IUseDrawer; if (useDrawer != null && useDrawer.GetDrawerType(memberInfo.Type, GetClassDrawerType(memberInfo.Type)) == drawerType) { return(useDrawer); } } return(null); }
public static void TryGetDecoratorDrawer([NotNull] IDrawerProvider drawerProvider, [NotNull] LinkedMemberInfo memberInfo, ref List <IDrawer> addResultToEndOfArray, IParentDrawer parent) { var propertyAttributes = memberInfo.GetAttributes <PropertyAttribute>(); for (int n = 0, count = propertyAttributes.Length; n < count; n++) { var propertyAttribute = propertyAttributes[n]; IDecoratorDrawerDrawer add; if (drawerProvider.TryGetForDecoratorDrawer(propertyAttribute, propertyAttribute.GetType(), parent, memberInfo, out add)) { addResultToEndOfArray.Add(add); } } }
private void Setup(object setValue, [CanBeNull] UnityEditor.PropertyDrawer setDrawerInstance, [NotNull] Type drawerType, LinkedMemberInfo setMemberInfo, IParentDrawer setParent, GUIContent setLabel, bool setReadOnly) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(drawerType != null); #endif if (setDrawerInstance == null) { setDrawerInstance = (UnityEditor.PropertyDrawer)drawerType.CreateInstance(); } drawerInstance = setDrawerInstance; #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(drawerInstance != null, "Failed to create PropertyDrawer instance of type " + StringUtils.ToString(drawerType) + " for field of type " + StringUtils.ToString(DrawerUtility.GetType(setMemberInfo, setValue)) + " and attribute " + StringUtils.TypeToString(setMemberInfo == null ? null : setMemberInfo.GetAttribute <PropertyAttribute>())); #endif memberInfo = setMemberInfo; var serializedProperty = SerializedProperty; if (serializedProperty != null) { // This is not fool-proof, because e.g. a custom property might use a foldout drawer // but could not figure out a better solution yet usesFoldout = serializedProperty.isArray; } else { usesFoldout = false; } var attField = drawerType.GetField("m_Attribute", BindingFlags.Instance | BindingFlags.NonPublic); if (setMemberInfo != null) { var atts = setMemberInfo.GetAttributes(Types.PropertyAttribute); if (atts.Length > 0) { attField.SetValue(drawerInstance, atts[0]); } attField = drawerType.GetField("m_FieldInfo", BindingFlags.Instance | BindingFlags.NonPublic); attField.SetValue(drawerInstance, setMemberInfo.FieldInfo); } else { Debug.LogError("PropertyDrawerDrawer(\"" + (setLabel != null ? setLabel.text : "") + "\").Setup(" + drawerType.Name + ") - fieldInfo was null (parent=" + StringUtils.ToString(setParent) + ")"); } base.Setup(setValue, DrawerUtility.GetType(setMemberInfo, setValue), setMemberInfo, setParent, setLabel, setReadOnly); }
/// <summary> /// Attempts to get PropertyDrawer Type for given class or from attributes on the field /// </summary> /// <param name="classMemberType"> Type of the class for which we are trying to find the PropertyDrawer. </param> /// <param name="memberInfo"> LinkedMemberInfo of the property for which we are trying to find the PropertyDrawer. </param> /// <param name="propertyAttribute"> [out] PropertyAttribute found on the property. </param> /// <param name="drawerType"> [out] Type of the PropertyDrawer for the PropertyAttribute. </param> /// <returns> /// True if target has a PropertyDrawer, false if not. /// </returns> public static bool TryGetPropertyDrawerType([NotNull] Type classMemberType, [NotNull] LinkedMemberInfo memberInfo, out PropertyAttribute propertyAttribute, out Type drawerType) { var attributes = memberInfo.GetAttributes(Types.PropertyAttribute); for (int n = attributes.Length - 1; n >= 0; n--) { var attribute = attributes[n]; if (TryGetPropertyDrawerType(attribute.GetType(), out drawerType)) { propertyAttribute = attribute as PropertyAttribute; return(true); } } propertyAttribute = null; return(TryGetPropertyDrawerType(classMemberType, out drawerType)); }
public IDrawer GetForField([CanBeNull] object value, [NotNull] Type fieldType, [CanBeNull] LinkedMemberInfo memberInfo, [CanBeNull] IParentDrawer parent, [CanBeNull] GUIContent label, bool readOnly) { #if DEV_MODE && PI_ASSERTATIONS Debug.Assert(fieldType != null, "CreateDefaultDrawer - null type!"); Debug.Assert(memberInfo != null || value != null || fieldType.IsUnityObject() || Nullable.GetUnderlyingType(fieldType) != null, "CreateDefaultDrawer - both fieldInfo and value null!"); if (memberInfo != null) { Debug.Assert(memberInfo.Type.IsAssignableFrom(fieldType), "CreateDefaultDrawer - memberInfo.Type " + StringUtils.ToString(memberInfo.Type) + " was not assignable from type " + StringUtils.ToString(fieldType) + "!"); } #endif #if DEV_MODE && DEBUG_GET_FOR_FIELD Debug.Log("GetForField(" + StringUtils.ToStringSansNamespace(fieldType) + ", " + StringUtils.ToString(label) + ")..."); #endif Type drawerType; if (memberInfo != null && memberInfo.MemberInfo != null && UseDrawerAttributeUtility.TryGetCustomDrawerForClassMember(this, memberInfo.MemberInfo, out drawerType)) { if (typeof(IPropertyDrawerDrawer).IsAssignableFrom(drawerType)) { var definingPropertyAttribute = GetAttributeThatDefinesDrawer(memberInfo, drawerType) as Attribute; if (definingPropertyAttribute != null) { return(GetForPropertyDrawer(drawerType, definingPropertyAttribute, value, memberInfo, parent, label, readOnly)); } } return(GetForField(drawerType, value, fieldType, memberInfo, parent, label, readOnly)); } if (memberInfo != null) { var attributes = memberInfo.GetAttributes <PropertyAttribute>(); int attributeCount = attributes.Length; if (attributeCount > 0) { // E.g. List<string> => List<>. Type fieldTypeOrGenericTypeDefinition; if (fieldType.IsGenericType && !fieldType.IsGenericTypeDefinition) { fieldTypeOrGenericTypeDefinition = fieldType.GetGenericTypeDefinition(); } else { fieldTypeOrGenericTypeDefinition = fieldType; } bool isCollection = memberInfo.IsCollection; for (int n = 0; n < attributeCount; n++) { var fieldAttribute = attributes[n]; drawerType = GetDrawerTypeForPropertyAttribute(fieldAttribute.GetType(), fieldTypeOrGenericTypeDefinition); if (drawerType != null) { #if DEV_MODE && (DEBUG_GET_FOR_FIELD || DEBUG_GET_FOR_PROPERTY_DRAWER) Debug.Log("<color=green>PropertyDrawer drawer</color> for field " + StringUtils.ToStringSansNamespace(fieldType) + " and attribute " + fieldAttribute.GetType().Name + ": " + drawerType.Name); #endif return(GetForPropertyDrawer(drawerType, fieldAttribute, value, memberInfo, parent, label, readOnly)); } } for (int n = 0; n < attributeCount; n++) { var fieldAttribute = attributes[n]; for (var baseType = fieldType.BaseType; baseType != null; baseType = baseType.BaseType) { // E.g. List<string> => List<>. if (baseType.IsGenericType && !baseType.IsGenericTypeDefinition) { fieldTypeOrGenericTypeDefinition = baseType.GetGenericTypeDefinition(); } else { fieldTypeOrGenericTypeDefinition = baseType; } drawerType = GetDrawerTypeForPropertyAttribute(fieldAttribute.GetType(), fieldTypeOrGenericTypeDefinition); if (drawerType != null) { #if DEV_MODE && (DEBUG_GET_FOR_FIELD || DEBUG_GET_FOR_PROPERTY_DRAWER) Debug.Log("<color=green>PropertyDrawer drawer</color> for field " + fieldType.Name + " and attribute " + fieldAttribute.GetType().Name + ": " + drawerType.Name); #endif return(GetForPropertyDrawer(drawerType, fieldAttribute, value, memberInfo, parent, label, readOnly)); } } } } } drawerType = GetDrawerTypeForFieldWithPropertyDrawer(fieldType, memberInfo); if (drawerType != null) { #if DEV_MODE && (DEBUG_GET_FOR_FIELD || DEBUG_GET_FOR_PROPERTY_DRAWER) Debug.Log("<color=green>PropertyDrawer drawer</color> for field " + StringUtils.ToStringSansNamespace(fieldType) + ": " + StringUtils.ToStringSansNamespace(drawerType)); #endif return(GetForPropertyDrawer(drawerType, null, value, memberInfo, parent, label, readOnly)); } drawerType = GetDrawerTypeForField(fieldType); #if DEV_MODE && DEBUG_GET_FOR_FIELD Debug.Log("<color=green>Field drawer</color> for field " + StringUtils.ToStringSansNamespace(fieldType) + ": " + StringUtils.ToStringSansNamespace(drawerType) + "\nmemberInfo=" + (memberInfo == null ? StringUtils.Null : memberInfo.LinkedMemberType.ToString()) + ", IsCollection=" + (memberInfo != null && memberInfo.IsCollection ? StringUtils.True : StringUtils.False) + ", Attributes=" + (memberInfo == null ? "n/a" : StringUtils.ToString(memberInfo.GetAttributes <PropertyAttribute>()))); #endif return(GetForField(drawerType, value, fieldType, memberInfo, parent, label, readOnly)); }