Пример #1
0
        private string DrawListOfMethods(GameObject go, ActionBase comparer, string propertPath, Type[] accepatbleTypes, DropDownControl <string> dropDown)
        {
            string result = propertPath;

            if (accepatbleTypes == null)
            {
                result = DrawManualPropertyEditField(go,
                                                     propertPath,
                                                     accepatbleTypes,
                                                     dropDown);
            }
            else
            {
                bool isPropertyOrFieldFound = true;
                if (string.IsNullOrEmpty(result))
                {
                    var options = GetFieldsAndProperties(go,
                                                         comparer,
                                                         result,
                                                         accepatbleTypes);
                    isPropertyOrFieldFound = options.Any();
                    if (isPropertyOrFieldFound)
                    {
                        result = options.First();
                    }
                }

                if (isPropertyOrFieldFound)
                {
                    dropDown.Draw(go.name + '.',
                                  result,
                                  () =>
                    {
                        try
                        {
                            var options = GetFieldsAndProperties(go,
                                                                 comparer,
                                                                 result,
                                                                 accepatbleTypes);

                            return(options.ToArray());
                        }
                        catch (ArgumentException)
                        {
                            Debug.LogWarning("An exception was thrown while resolving property list. Reseting property path.");
                            result = "";
                            return(new string[0]);
                        }
                    },
                                  s => result = s);
                }
                else
                {
                    result = DrawManualPropertyEditField(go,
                                                         propertPath,
                                                         accepatbleTypes,
                                                         dropDown);
                }
            }
            return(result);
        }
Пример #2
0
        private string DrawManualPropertyEditField(GameObject go, string propertPath, Type[] acceptableTypes, DropDownControl <string> dropDown)
        {
            var propertyResolver = new PropertyResolver {
                AllowedTypes = acceptableTypes
            };
            IList <string> list;

            var loadProps = new Func <string[]> (() =>
            {
                try
                {
                    list = propertyResolver.GetFieldsAndPropertiesUnderPath(go,
                                                                            propertPath);
                }
                catch (ArgumentException)
                {
                    list = propertyResolver.GetFieldsAndPropertiesUnderPath(go,
                                                                            "");
                }
                return(list.ToArray());
            });

            EditorGUILayout.BeginHorizontal();

            var labelSize = EditorStyles.label.CalcSize(new GUIContent(go.name + '.'));

            GUILayout.Label(go.name + (propertPath.Length > 0 ? "." : ""), EditorStyles.label, GUILayout.Width(labelSize.x));

            string btnName = "hintBtn";

            if (GUI.GetNameOfFocusedControl() == btnName &&
                Event.current.type == EventType.KeyDown &&
                Event.current.keyCode == KeyCode.DownArrow)
            {
                Event.current.Use();
                dropDown.PrintMenu(loadProps());
                GUI.FocusControl("");
                focusBackToEdit = true;
            }

            EditorGUI.BeginChangeCheck();
            GUI.SetNextControlName(btnName);
            var result = GUILayout.TextField(propertPath, EditorStyles.textField);

            if (EditorGUI.EndChangeCheck())
            {
                errorType = DoesPropertyExist(go, result);
            }

            if (focusBackToEdit)
            {
                focusBackToEdit = false;
                GUI.FocusControl(btnName);
            }

            if (GUILayout.Button("clear",
                                 EditorStyles.miniButton,
                                 GUILayout.Width(38)))
            {
                result = "";
                GUI.FocusControl(null);
                focusBackToEdit = true;
                errorType       = DoesPropertyExist(go, result);
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            GUILayout.Label("", GUILayout.Width(labelSize.x));

            dropDown.Draw("", result ?? "", loadProps, s =>
            {
                result = s;
                GUI.FocusControl(null);
                focusBackToEdit = true;
                errorType       = DoesPropertyExist(go, result);
            });
            EditorGUILayout.EndHorizontal();

            if (errorType != ErrorType.None)
            {
                if (errorType == ErrorType.MissingComponent)
                {
                    EditorGUILayout.HelpBox("This property or field is not attached or set. It will fail unless it will be attached before check is perfomed.", MessageType.Warning);
                }
                else if (errorType == ErrorType.DoesNotExist)
                {
                    EditorGUILayout.HelpBox("This property does not exist", MessageType.Error);
                }
            }
            return(result);
        }