示例#1
0
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            DynamicMemberAccess access = DynamicMemberAccess.Read;

            if (this.fieldInfo != null)
            {
                var attrib = this.fieldInfo.GetCustomAttributes(typeof(MemberProxy.ConfigAttribute), true).FirstOrDefault() as MemberProxy.ConfigAttribute;
                if (attrib != null)
                {
                    access = attrib.MemberAccessLevel;
                }
            }

            DrawMemberProxy(position, property, label);
        }
示例#2
0
        public static System.Reflection.MemberInfo DrawMemberProxy(Rect position, SerializedProperty property, GUIContent label, DynamicMemberAccess memberAccessLevel = DynamicMemberAccess.Read)
        {
            var r0 = new Rect(position.xMin, position.yMin, position.width, EditorGUIUtility.singleLineHeight);
            var r1 = new Rect(position.xMin, r0.yMax, position.width, EditorGUIUtility.singleLineHeight);

            var targProp   = property.FindPropertyRelative("_target");
            var memberProp = property.FindPropertyRelative("_memberName");

            SPEditorGUI.PropertyField(r0, targProp, label);
            System.Reflection.MemberInfo selectedMember;
            memberProp.stringValue = SPEditorGUI.ReflectedPropertyField(r1,
                                                                        EditorHelper.TempContent(" - Property", "The property on the target to set."),
                                                                        targProp.objectReferenceValue,
                                                                        memberProp.stringValue,
                                                                        memberAccessLevel,
                                                                        out selectedMember);
            return(selectedMember);
        }
        public static IEnumerable <System.Reflection.MemberInfo> GetEasilySerializedMembersFromType(System.Type tp, MemberTypes mask = MemberTypes.All, DynamicMemberAccess access = DynamicMemberAccess.ReadWrite)
        {
            if (tp == null)
            {
                yield break;
            }

            bool bRead   = access.HasFlag(DynamicMemberAccess.Read);
            bool bWrite  = access.HasFlag(DynamicMemberAccess.Write);
            var  members = com.spacepuppy.Dynamic.DynamicUtil.GetMembersFromType(tp, false);

            foreach (var mi in members)
            {
                if ((mi.MemberType & mask) == 0)
                {
                    continue;
                }

                if (mi.DeclaringType.IsAssignableFrom(typeof(UnityEngine.MonoBehaviour)) ||
                    mi.DeclaringType.IsAssignableFrom(typeof(SPComponent)) ||
                    mi.DeclaringType.IsAssignableFrom(typeof(SPNotifyingComponent)))
                {
                    continue;
                }

                switch (mi.MemberType)
                {
                case System.Reflection.MemberTypes.Method:
                {
                    var m = mi as System.Reflection.MethodInfo;
                    if (m.IsSpecialName)
                    {
                        continue;
                    }
                    if (m.IsGenericMethod)
                    {
                        continue;
                    }

                    var parr = m.GetParameters();
                    if (parr.Length == 0)
                    {
                        yield return(m);
                    }
                    else
                    {
                        bool pass = true;
                        foreach (var p in parr)
                        {
                            if (!(VariantReference.AcceptableType(p.ParameterType) || p.ParameterType == typeof(object)))
                            {
                                pass = false;
                                break;
                            }
                        }
                        if (pass)
                        {
                            yield return(m);
                        }
                    }
                }
                break;

                case System.Reflection.MemberTypes.Field:
                {
                    var f = mi as System.Reflection.FieldInfo;
                    if (f.IsSpecialName)
                    {
                        continue;
                    }

                    if (VariantReference.AcceptableType(f.FieldType))
                    {
                        yield return(f);
                    }
                }
                break;

                case System.Reflection.MemberTypes.Property:
                {
                    var p = mi as System.Reflection.PropertyInfo;
                    if (p.IsSpecialName)
                    {
                        continue;
                    }
                    if (!p.CanRead && bRead)
                    {
                        continue;
                    }
                    if (!p.CanWrite && bWrite)
                    {
                        continue;
                    }
                    if (p.GetIndexParameters().Length > 0)
                    {
                        continue;                                            //indexed properties are not allowed
                    }
                    if (VariantReference.AcceptableType(p.PropertyType))
                    {
                        yield return(p);
                    }
                }
                break;
                }
            }
        }
 public static string ReflectedPropertyField(Rect position, object targObj, string selectedMemberName, DynamicMemberAccess access)
 {
     System.Reflection.MemberInfo selectedMember;
     return(ReflectedPropertyField(position, GUIContent.none, targObj, selectedMemberName, access, out selectedMember));
 }
        public static string ReflectedPropertyAndCustomTweenAccessorField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Type propType)
        {
            if (targObj != null)
            {
                var members   = DynamicUtil.GetEasilySerializedMembers(targObj, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, access).ToArray();
                var accessors = CustomTweenMemberAccessorFactory.GetCustomAccessorIds(targObj.GetType());
                System.Array.Sort(accessors);

                using (var entries = TempCollection.GetList <GUIContent>(members.Length))
                {
                    int index = -1;
                    for (int i = 0; i < members.Length; i++)
                    {
                        var m = members[i];
                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)
                        {
                            entries.Add(EditorHelper.TempContent(string.Format("{0} ({1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj))));
                        }
                        else
                        {
                            entries.Add(EditorHelper.TempContent(string.Format("{0} (readonly - {1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj))));
                        }

                        if (index < 0 && m.Name == selectedMemberName)
                        {
                            //index = i;
                            index = entries.Count - 1;
                        }
                    }

                    for (int i = 0; i < accessors.Length; i++)
                    {
                        entries.Add(EditorHelper.TempContent(accessors[i]));
                        if (index < 0 && accessors[i] == selectedMemberName)
                        {
                            index = entries.Count - 1;
                        }
                    }


                    index = EditorGUI.Popup(position, label, index, entries.ToArray());
                    //selectedMember = (index >= 0) ? members[index] : null;
                    //return (selectedMember != null) ? selectedMember.Name : null;

                    if (index < 0)
                    {
                        propType = null;
                        return(null);
                    }
                    else if (index < members.Length)
                    {
                        propType = DynamicUtil.GetReturnType(members[index]);
                        return(members[index].Name);
                    }
                    else
                    {
                        var nm = accessors[index - members.Length];
                        ITweenMemberAccessor acc;
                        if (CustomTweenMemberAccessorFactory.TryGetMemberAccessor(targObj, nm, out acc))
                        {
                            propType = acc.GetMemberType();
                            if (VariantReference.AcceptableType(propType))
                            {
                                return(nm);
                            }
                        }
                    }

                    propType = null;
                    return(null);
                }
            }
            else
            {
                propType = null;
                EditorGUI.Popup(position, label, -1, new GUIContent[0]);
                return(null);
            }
        }
        private static string ReflectedRecursingPropertyField(GUIContent label, System.Type tp, string[] selectedMemberNameChain, int chainIndex, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)
        {
            if (tp != null)
            {
                var easyMembers = DynamicUtil.GetEasilySerializedMembersFromType(tp, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method, access).ToArray();
                var hardMembers = DynamicUtil.GetEditorCompatibleMembersFromType(tp, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, DynamicMemberAccess.Read).Where(m => !DynamicUtil.GetReturnType(m).IsValueType).Except(easyMembers).ToArray();

                var lst = new List <System.Reflection.MemberInfo>();
                lst.AddRange(easyMembers);
                lst.AddRange(hardMembers);
                var members = lst.ToArray();
                var entries = new GUIContent[members.Length];

                int index = -1;
                for (int i = 0; i < members.Length; i++)
                {
                    var m = members[i];
                    if (i < easyMembers.Length)
                    {
                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)
                        {
                            entries[i] = EditorHelper.TempContent(string.Format("{0} ({1})", m.Name, DynamicUtil.GetReturnType(m).Name));
                        }
                        else
                        {
                            entries[i] = EditorHelper.TempContent(string.Format("{0} (readonly - {1})", m.Name, DynamicUtil.GetReturnType(m).Name));
                        }
                    }
                    else
                    {
                        entries[i] = EditorHelper.TempContent(string.Format("-> {0} ({1})", m.Name, DynamicUtil.GetReturnType(m).Name));
                    }

                    if (index < 0 && selectedMemberNameChain != null && chainIndex < selectedMemberNameChain.Length && selectedMemberNameChain[chainIndex] == m.Name)
                    {
                        index = i;
                    }
                }

                index          = EditorGUILayout.Popup(label, index, entries);
                selectedMember = (index >= 0) ? members[index] : null;
                if (hardMembers.Contains(selectedMember))
                {
                    var m = selectedMember;
                    return(m.Name + "." + ReflectedRecursingPropertyField(EditorHelper.TempContent("|-> " + m.Name), DynamicUtil.GetReturnType(m), selectedMemberNameChain, chainIndex + 1, access, out selectedMember, allowSetterMethods));
                }
                else
                {
                    return((selectedMember != null) ? selectedMember.Name : null);
                }
            }
            else
            {
                selectedMember = null;
                EditorGUILayout.Popup(label, -1, new GUIContent[0]);
                return(null);
            }
        }
        /// <summary>
        /// Reflects the available properties and shows them in a dropdown
        /// </summary>
        public static string ReflectedPropertyField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember)
        {
            if (targObj != null)
            {
                var members = DynamicUtil.GetEasilySerializedMembers(targObj, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, access).ToArray();
                var entries = new GUIContent[members.Length];

                int index = -1;
                for (int i = 0; i < members.Length; i++)
                {
                    var m = members[i];
                    if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)
                    {
                        entries[i] = EditorHelper.TempContent(string.Format("{0} ({1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj)));
                    }
                    else
                    {
                        entries[i] = EditorHelper.TempContent(string.Format("{0} (readonly - {1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, DynamicUtil.GetValueWithMember(m, targObj)));
                    }

                    if (index < 0 && m.Name == selectedMemberName)
                    {
                        index = i;
                    }
                }

                index          = EditorGUI.Popup(position, label, index, entries);
                selectedMember = (index >= 0) ? members[index] : null;
                return((selectedMember != null) ? selectedMember.Name : null);
            }
            else
            {
                selectedMember = null;
                EditorGUI.Popup(position, label, -1, new GUIContent[0]);
                return(null);
            }
        }
        public static string ReflectedRecursingPropertyField(GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Reflection.MemberInfo selectedMember, bool allowSetterMethods = false)
        {
            if (targObj is IDynamic || targObj is IProxy)
            {
                var mask = allowSetterMethods ? System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property | System.Reflection.MemberTypes.Method : System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property;
                System.Reflection.MemberInfo[] members = null;
                System.Type targTp = null;
                if (targObj is IDynamic)
                {
                    targTp  = targObj.GetType();
                    members = DynamicUtil.GetEasilySerializedMembers(targObj, mask, access).ToArray();
                }
                else if (targObj is IProxy)
                {
                    targTp  = (targObj as IProxy).GetTargetType();
                    members = DynamicUtil.GetEasilySerializedMembersFromType(targTp, mask, access).ToArray();
                }
                else
                {
                    targTp  = typeof(object);
                    members = ArrayUtil.Empty <System.Reflection.MemberInfo>();
                }
                var entries = new GUIContent[members.Length + 1];

                int index = -1;
                for (int i = 0; i < members.Length; i++)
                {
                    var m = members[i];
                    if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)
                    {
                        entries[i] = EditorHelper.TempContent(string.Format("{0} ({1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));
                    }
                    else
                    {
                        entries[i] = EditorHelper.TempContent(string.Format("{0} (readonly - {1}) -> {2}", m.Name, DynamicUtil.GetReturnType(m).Name, EditorHelper.GetValueWithMemberSafe(m, targObj, true)));
                    }

                    if (index < 0 && m.Name == selectedMemberName)
                    {
                        index = i;
                    }
                }

                entries[entries.Length - 1] = EditorHelper.TempContent("...Custom");
                if (index < 0)
                {
                    index = entries.Length - 1;
                }

                if (index < members.Length)
                {
                    index          = EditorGUILayout.Popup(label, index, entries);
                    selectedMember = (index >= 0 && index < members.Length) ? members[index] : null;
                    return((selectedMember != null) ? selectedMember.Name : null);
                }
                else
                {
                    var position = EditorGUILayout.GetControlRect(label == GUIContent.none);
                    position = EditorGUI.PrefixLabel(position, label);
                    var r0 = new Rect(position.xMin, position.yMin, position.width / 2f, position.height);
                    var r1 = new Rect(r0.xMax, r0.yMin, position.width - r0.width, r0.height);
                    index = EditorGUI.Popup(r0, index, entries);
                    if (index < members.Length)
                    {
                        selectedMember = (index >= 0) ? members[index] : null;
                        return((selectedMember != null) ? selectedMember.Name : null);
                    }
                    else
                    {
                        selectedMemberName = EditorGUI.TextField(r1, selectedMemberName);
                        selectedMember     = new DynamicPropertyInfo(selectedMemberName, targTp, typeof(Variant));
                        return(selectedMemberName);
                    }
                }
            }
            else if (targObj != null)
            {
                var arr = string.IsNullOrEmpty(selectedMemberName) ? ArrayUtil.Empty <string>() : selectedMemberName.Split('.');
                return(ReflectedRecursingPropertyField(label, targObj.GetType(), arr, 0, access, out selectedMember, allowSetterMethods));
            }
            else
            {
                selectedMember = null;
                EditorGUILayout.Popup(label, -1, new GUIContent[0]);
                return(null);
            }
        }
示例#9
0
 public static string ReflectedPropertyAndCustomTweenAccessorField(Rect position, GUIContent label, object targObj, string selectedMemberName, DynamicMemberAccess access, out System.Type propType)
 {
     return(ReflectedPropertyAndCustomTweenAccessorField(position, label, targObj != null ? targObj.GetType() : null, targObj, selectedMemberName, access, out propType));
 }
        public static IEnumerable<System.Reflection.MemberInfo> GetEasilySerializedMembersFromType(System.Type tp, MemberTypes mask = MemberTypes.All, DynamicMemberAccess access = DynamicMemberAccess.ReadWrite)
        {
            if (tp == null) yield break;

            bool bRead = access.HasFlag(DynamicMemberAccess.Read);
            bool bWrite = access.HasFlag(DynamicMemberAccess.Write);
            var members = com.spacepuppy.Dynamic.DynamicUtil.GetMembersFromType(tp, false);
            foreach (var mi in members)
            {
                if ((mi.MemberType & mask) == 0) continue;

                if (mi.DeclaringType.IsAssignableFrom(typeof(UnityEngine.MonoBehaviour)) ||
                    mi.DeclaringType.IsAssignableFrom(typeof(SPComponent)) ||
                    mi.DeclaringType.IsAssignableFrom(typeof(SPNotifyingComponent))) continue;

                switch (mi.MemberType)
                {
                    case System.Reflection.MemberTypes.Method:
                        {
                            var m = mi as System.Reflection.MethodInfo;
                            if (m.IsSpecialName) continue;
                            if (m.IsGenericMethod) continue;

                            var parr = m.GetParameters();
                            if (parr.Length == 0)
                            {
                                yield return m;
                            }
                            else
                            {
                                bool pass = true;
                                foreach (var p in parr)
                                {
                                    if (!(VariantReference.AcceptableType(p.ParameterType) || p.ParameterType == typeof(object)))
                                    {
                                        pass = false;
                                        break;
                                    }
                                }
                                if (pass) yield return m;
                            }
                        }
                        break;
                    case System.Reflection.MemberTypes.Field:
                        {
                            var f = mi as System.Reflection.FieldInfo;
                            if (f.IsSpecialName) continue;

                            if (VariantReference.AcceptableType(f.FieldType)) yield return f;
                        }
                        break;
                    case System.Reflection.MemberTypes.Property:
                        {
                            var p = mi as System.Reflection.PropertyInfo;
                            if (p.IsSpecialName) continue;
                            if (!p.CanRead && bRead) continue;
                            if (!p.CanWrite && bWrite) continue;
                            if (p.GetIndexParameters().Length > 0) continue; //indexed properties are not allowed

                            if (VariantReference.AcceptableType(p.PropertyType)) yield return p;
                        }
                        break;
                }

            }
        }
 public ConfigAttribute(DynamicMemberAccess memberAccessLevel)
 {
     this.MemberAccessLevel = memberAccessLevel;
 }
示例#12
0
        public static string ReflectedPropertyAndCustomTweenAccessorFieldByType(Rect position, GUIContent label, System.Type targType, string selectedMemberName, DynamicMemberAccess access, out System.Type propType)
        {
            if (targType != null)
            {
                var members   = DynamicUtil.GetEasilySerializedMembersFromType(targType, System.Reflection.MemberTypes.Field | System.Reflection.MemberTypes.Property, access).ToArray();
                var accessors = CustomTweenMemberAccessorFactory.GetCustomAccessorIds(targType, (d) => VariantReference.AcceptableType(d.MemberType));
                System.Array.Sort(accessors);

                using (var entries = TempCollection.GetList <GUIContent>(members.Length))
                {
                    int index = -1;
                    for (int i = 0; i < members.Length; i++)
                    {
                        var m = members[i];
                        if ((DynamicUtil.GetMemberAccessLevel(m) & DynamicMemberAccess.Write) != 0)
                        {
                            entries.Add(EditorHelper.TempContent(string.Format("{0} ({1})", m.Name, DynamicUtil.GetReturnType(m).Name)));
                        }
                        else
                        {
                            entries.Add(EditorHelper.TempContent(string.Format("{0} (readonly - {1})", m.Name, DynamicUtil.GetReturnType(m).Name)));
                        }

                        if (index < 0 && m.Name == selectedMemberName)
                        {
                            //index = i;
                            index = entries.Count - 1;
                        }
                    }

                    for (int i = 0; i < accessors.Length; i++)
                    {
                        entries.Add(EditorHelper.TempContent(accessors[i]));
                        if (index < 0 && accessors[i] == selectedMemberName)
                        {
                            index = entries.Count - 1;
                        }
                    }


                    index = EditorGUI.Popup(position, label, index, entries.ToArray());

                    if (index < 0)
                    {
                        propType = null;
                        return(null);
                    }
                    else if (index < members.Length)
                    {
                        propType = DynamicUtil.GetReturnType(members[index]);
                        return(members[index].Name);
                    }
                    else
                    {
                        var nm = accessors[index - members.Length];
                        CustomTweenMemberAccessorFactory.CustomAccessorData info;
                        if (CustomTweenMemberAccessorFactory.TryGetMemberAccessorInfoByType(targType, nm, out info))
                        {
                            propType = info.MemberType;
                            if (VariantReference.AcceptableType(propType))
                            {
                                return(nm);
                            }
                        }
                    }

                    propType = null;
                    return(null);
                }
            }
            else
            {
                propType = null;
                EditorGUI.Popup(position, label, -1, new GUIContent[0]);
                return(null);
            }
        }