示例#1
0
        private void StartOnGUI(SerializedProperty property, GUIContent label)
        {
            _currentProp       = property;
            _label             = label;
            _currentKeysProp   = _currentProp.FindPropertyRelative("_keys");
            _currentValuesProp = _currentProp.FindPropertyRelative("_values");

            _currentValuesProp.arraySize = _currentKeysProp.arraySize;

            _lst = CachedReorderableList.GetListDrawer(_memberLookupTable, _currentProp, _lst_DrawHeader, _lst_DrawElement, _lst_OnAdd, _lst_OnRemove, null, null, _lst_OnReorder);
            //_lst.draggable = false;
            _memberLookupTable.Clear();
            for (int i = 0; i < _currentKeysProp.arraySize; i++)
            {
                _memberLookupTable.Add(i);
            }

            if (this.fieldInfo != null)
            {
                var asPropAttrib = this.fieldInfo.GetCustomAttributes(typeof(VariantCollection.AsPropertyListAttribute), false).FirstOrDefault() as VariantCollection.AsPropertyListAttribute;
                if (asPropAttrib != null && asPropAttrib.TargetType != null)
                {
                    this.ConfigurePropertyList(asPropAttrib.TargetType);
                }

                var asTypedList = this.fieldInfo.GetCustomAttributes(typeof(VariantCollection.AsTypedList), false).FirstOrDefault() as VariantCollection.AsTypedList;
                if (asTypedList != null && asTypedList.TargetType != null && VariantReference.AcceptableType(asTypedList.TargetType))
                {
                    _variantDrawer.RestrictVariantType = true;
                    _variantDrawer.TypeRestrictedTo    = asTypedList.TargetType;
                    _variantDrawer.ForcedObjectType    = asTypedList.TargetType;
                }
            }
        }
        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 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);
            }
        }
示例#4
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);
            }
        }