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