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