Example #1
0
    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();
    }
Example #2
0
        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);
                    }
                }
            }
        }