UnityGetterDrawer.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Chronos.Controls.Editor;
  6. using Chronos.Reflection.Internal;
  7. using UnityEditor;
  8. namespace Chronos.Reflection.Editor
  9. {
  10. [CustomPropertyDrawer(typeof(UnityGetter))]
  11. public class UnityGetterDrawer : UnityMemberDrawer<UnityGetter>
  12. {
  13. #region Filtering
  14. /// <inheritdoc />
  15. protected override FilterAttribute DefaultFilter()
  16. {
  17. FilterAttribute filter = base.DefaultFilter();
  18. // Override defaults here
  19. return filter;
  20. }
  21. // Do not edit below
  22. /// <inheritdoc />
  23. protected override MemberTypes validMemberTypes
  24. {
  25. get
  26. {
  27. return MemberTypes.Field | MemberTypes.Property | MemberTypes.Method;
  28. }
  29. }
  30. /// <inheritdoc />
  31. protected override bool ValidateMember(MemberInfo member)
  32. {
  33. bool valid = base.ValidateMember(member);
  34. FieldInfo field = member as FieldInfo;
  35. PropertyInfo property = member as PropertyInfo;
  36. MethodInfo method = member as MethodInfo;
  37. if (field != null) // Member is a field
  38. {
  39. valid &= UnityMemberDrawerHelper.ValidateField(filter, field);
  40. }
  41. else if (property != null) // Member is a property
  42. {
  43. valid &= UnityMemberDrawerHelper.ValidateProperty(filter, property);
  44. }
  45. else if (method != null) // Member is a method
  46. {
  47. valid &= UnityMemberDrawerHelper.ValidateMethod(filter, method);
  48. }
  49. return valid;
  50. }
  51. #endregion
  52. #region Fields
  53. /// <summary>
  54. /// The UnityGetter.parameterTypes of the inspected property, of type Type[].
  55. /// </summary>
  56. protected SerializedProperty parameterTypesProperty;
  57. protected override void Update(SerializedProperty property)
  58. {
  59. base.Update(property);
  60. parameterTypesProperty = property.FindPropertyRelative("_parameterTypes");
  61. }
  62. #endregion
  63. #region Value
  64. /// <inheritdoc />
  65. protected override void SetValue(UnityGetter value)
  66. {
  67. base.SetValue(value);
  68. UnityMemberDrawerHelper.SerializeParameterTypes(parameterTypesProperty, value != null ? value.parameterTypes : null);
  69. }
  70. /// <inheritdoc />
  71. protected override UnityGetter BuildValue(string component, string name)
  72. {
  73. return new UnityGetter(component, name, UnityMemberDrawerHelper.DeserializeParameterTypes(parameterTypesProperty));
  74. }
  75. /// <inheritdoc />
  76. protected override bool hasMultipleDifferentValues
  77. {
  78. get
  79. {
  80. if (base.hasMultipleDifferentValues)
  81. {
  82. return true;
  83. }
  84. return UnityMemberDrawerHelper.ParameterTypesHasMultipleValues(parameterTypesProperty);
  85. }
  86. }
  87. #endregion
  88. #region Reflection
  89. protected override List<DropdownOption<UnityGetter>> GetMemberOptions(Type type, string component = null)
  90. {
  91. var getters = base.GetMemberOptions(type, component);
  92. if (filter.Extension)
  93. {
  94. var extensionMethods = type.GetExtensionMethods()
  95. .Where(ValidateMember)
  96. .Select(method => GetMemberOption(method, component, method.GetParameters()[0].ParameterType != type));
  97. getters.AddRange(extensionMethods);
  98. }
  99. return getters;
  100. }
  101. protected override DropdownOption<UnityGetter> GetMemberOption(MemberInfo member, string component, bool inherited)
  102. {
  103. UnityGetter value;
  104. string label;
  105. if (member is FieldInfo)
  106. {
  107. FieldInfo field = (FieldInfo)member;
  108. value = new UnityGetter(component, field.Name);
  109. label = string.Format("{0} {1}", field.FieldType.PrettyName(), field.Name);
  110. }
  111. else if (member is PropertyInfo)
  112. {
  113. PropertyInfo property = (PropertyInfo)member;
  114. value = new UnityGetter(component, property.Name);
  115. label = string.Format("{0} {1}", property.PropertyType.PrettyName(), property.Name);
  116. }
  117. else if (member is MethodInfo)
  118. {
  119. MethodInfo method = (MethodInfo)member;
  120. ParameterInfo[] parameters = method.GetParameters();
  121. value = new UnityGetter(component, member.Name, parameters.Select(p => p.ParameterType).ToArray());
  122. string parameterString = string.Join(", ", parameters.Select(p => p.ParameterType.PrettyName()).ToArray());
  123. label = string.Format("{0} {1} ({2})", method.ReturnType.PrettyName(), member.Name, parameterString);
  124. }
  125. else
  126. {
  127. throw new ArgumentException("Invalid member information type.");
  128. }
  129. if (inherited)
  130. {
  131. label = "Inherited/" + label;
  132. }
  133. return new DropdownOption<UnityGetter>(value, label);
  134. }
  135. #endregion
  136. /// <inheritdoc />
  137. protected override string memberLabel
  138. {
  139. get
  140. {
  141. return "Getter";
  142. }
  143. }
  144. }
  145. }