public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { CustomEnumPopup p = attribute as CustomEnumPopup; if (!string.IsNullOrEmpty(p.Name)) { label.text = p.Name; } string[] names = System.Enum.GetNames(fieldInfo.FieldType); List <string> namesList = new List <string>(); foreach (var m_name in names) { namesList.Add(m_name); } namesList.Sort((n1, n2) => { return(((int)System.Enum.Parse(fieldInfo.FieldType, n1)).CompareTo((int)System.Enum.Parse(fieldInfo.FieldType, n2))); }); names = namesList.ToArray(); EditorGUI.BeginProperty(position, label, property); Rect prefixPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); string name; if (property.enumValueIndex >= names.Length || property.enumValueIndex < 0) { name = "-"; } else { name = names[property.enumValueIndex]; } GUIStyle buttonStyle = new GUIStyle(EditorStyles.popup); buttonStyle.padding.top = 2; buttonStyle.padding.bottom = 2; float baseHeight = GUI.skin.textField.CalcSize(new GUIContent()).y; Rect popRect = new Rect(prefixPosition.x, position.y, position.x + position.width - prefixPosition.x, baseHeight); if (GUI.Button(popRect, name, buttonStyle)) { CustomEnumPopupWindow window = CustomEnumPopupWindow.CreateInstance <CustomEnumPopupWindow>(); var windowRect = prefixPosition; window.Init(property, fieldInfo.FieldType, p.Type); windowRect.position = GUIUtility.GUIToScreenPoint(windowRect.position); windowRect.height = popRect.height + 1; window.ShowAsDropDown(windowRect, new Vector2(windowRect.width, 400)); } EditorGUI.EndProperty(); }
void AddMenuItems(GenericMenu menu, Object originalTarget, object target, string[] validTypes, string baseMenuPath = null, int depth = 0) { var menuItemPath = new StringBuilder(); var members = Array.FindAll( target.GetType().GetMembers(), x => (x.GetType().Name == "MonoProperty" || x.GetType().Name == "MonoField") ); for (int i = 0; i < members.Length; i++) { var member = members[i]; var memberType = (member.GetType().Name == "MonoField") ? ((FieldInfo)member).FieldType : ((PropertyInfo)member).PropertyType; menuItemPath.Remove(0, menuItemPath.Length); if (!string.IsNullOrEmpty(baseMenuPath)) { menuItemPath.Append(baseMenuPath); menuItemPath.Append("/"); } menuItemPath.Append(member.Name); if (IsValidType(memberType)) { string typeStr = memberType.ToString(); if (memberType.IsEnum) { typeStr = "enum"; } if (isValidFromTypeArray(typeStr, validTypes)) { var memberPath = menuItemPath.ToString().Replace("/", "."); if (typeStr.Equals("enum")) { if (!string.IsNullOrEmpty(m_Prop.FindPropertyRelative("m_EnumType").stringValue)) { if (memberType.Equals(CustomEnumPopup.GetEnumType(m_Prop.FindPropertyRelative("m_EnumType").stringValue))) { menu.AddItem( new GUIContent(string.Concat(originalTarget.GetType().Name, "/", menuItemPath)), m_TargetProperty.objectReferenceValue == originalTarget && m_PathProperty.stringValue == memberPath, SetProperty, new PropertySetter(m_Prop, originalTarget, memberPath, typeStr) ); } } else { menu.AddItem( new GUIContent(string.Concat(originalTarget.GetType().Name, "/", menuItemPath)), m_TargetProperty.objectReferenceValue == originalTarget && m_PathProperty.stringValue == memberPath, SetPropertyWithEnum, new PropertySetterWithEnum(m_Prop, originalTarget, memberPath, typeStr, memberType.ToString()) ); } } else { menu.AddItem( new GUIContent(string.Concat(originalTarget.GetType().Name, "/", menuItemPath)), m_TargetProperty.objectReferenceValue == originalTarget && m_PathProperty.stringValue == memberPath, SetProperty, new PropertySetter(m_Prop, originalTarget, memberPath, typeStr) ); } } } else if (depth <= k_maxDepth && IsValidSubTarget(target, member)) { var memberValue = GetMemberValue(target, member); if (memberValue != null) { AddMenuItems(menu, originalTarget, memberValue, validTypes, menuItemPath.ToString(), depth + 1); } } } }