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);
        }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #4
0
        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));
        }