void DrawDefault(IInternalMemberInfo memberInfo, object memberValue, string label) { if (memberInfo.TargetType.IsValueType) { EditorGUILayout.LabelField(label, memberValue.ToString()); } else { EditorGUILayout.LabelField(label, memberValue == null ? "null (" + memberInfo.TargetType.Name + ")" : memberInfo.TargetType.Name); } }
void DrawMember(IInternalMemberInfo memberInfo, object owner, int memberId, IDictionary <int, bool> componentToggle) { if (memberInfo.TargetType.IsArray) { DrawArray(memberInfo, owner, memberId, componentToggle); } else if (memberInfo.TargetType.IsEnum) { DrawEnum(memberInfo, owner); } else { DrawType(memberInfo, owner, memberInfo.Name); } }
void DrawEnum(IInternalMemberInfo memberInfo, object owner) { var value = (Enum)memberInfo.GetValue(owner); if (memberInfo.IsReadOnly) { EditorGUILayout.LabelField(memberInfo.Name, value.ToString()); } else { var newValue = EditorGUILayout.EnumPopup(memberInfo.Name, value); if (value != newValue) { memberInfo.SetValue(owner, newValue); } } }
void DrawType(IInternalMemberInfo memberInfo, object owner, string label) { var value = memberInfo.GetValue(owner); ITypeDrawer typeDrawer; if (m_TypeDrawers.TryGetValue(memberInfo.TargetType, out typeDrawer)) { var newValue = typeDrawer.Draw(memberInfo, value, label); if (newValue != value) { memberInfo.SetValue(owner, newValue); } } else { DrawDefault(memberInfo, value, label); } }
void DrawArray(IInternalMemberInfo memberInfo, object owner, int memberId, IDictionary <int, bool> componentToggle) { componentToggle[memberId] = EditorGUILayout.Foldout(componentToggle[memberId], memberInfo.Name); var value = (Array)memberInfo.GetValue(owner); if (value != null && componentToggle[memberId]) { ITypeDrawer typeDrawer; EditorGUI.indentLevel++; if (m_TypeDrawers.TryGetValue(memberInfo.TargetType.GetElementType(), out typeDrawer)) { for (int i = 0; i < value.Length; i++) { var itemValue = value.GetValue(i); var newItemValue = typeDrawer.Draw(memberInfo, itemValue, "[" + i.ToString() + "]"); if (newItemValue != value) { value.SetValue(newItemValue, i); } } } else { var array = (Array)memberInfo.GetValue(owner); for (int i = 0; i < array.Length; i++) { DrawDefault(memberInfo, array.GetValue(i), "[" + i.ToString() + "]"); } } EditorGUI.indentLevel--; } }