Esempio n. 1
0
 private void AssertType(PersistentArgumentType type)
 {
     if (_Type != type)
     {
         throw new InvalidOperationException(Names.PersistentArgument.Full.Type + " is " + _Type + " but should be " + type);
     }
 }
Esempio n. 2
0
        /************************************************************************************************************************/

        /// <summary>
        ///     Returns the <see cref="System.Type" /> associated with the specified <see cref="PersistentArgumentType" />.
        ///     <para></para>
        ///     If the 'type' can be inherited (such as an Enum or Object), the 'assemblyQualifiedName' will be used to get the
        ///     type.
        /// </summary>
        public static Type GetArgumentType(PersistentArgumentType type, float secondaryType,
                                           string assemblyQualifiedName)
        {
            switch (type)
            {
            case PersistentArgumentType.Bool: return(typeof(bool));

            case PersistentArgumentType.String: return(typeof(string));

            case PersistentArgumentType.Int: return(typeof(int));

            case PersistentArgumentType.Float: return(typeof(float));

            case PersistentArgumentType.Vector2: return(typeof(Vector2));

            case PersistentArgumentType.Vector3: return(typeof(Vector3));

            case PersistentArgumentType.Vector4: return(typeof(Vector4));

            case PersistentArgumentType.Quaternion: return(typeof(Quaternion));

            case PersistentArgumentType.Color: return(typeof(Color));

            case PersistentArgumentType.Color32: return(typeof(Color32));

            case PersistentArgumentType.Rect: return(typeof(Rect));

            case PersistentArgumentType.Enum:
            case PersistentArgumentType.Object:
            default:
                if (!string.IsNullOrEmpty(assemblyQualifiedName))
                {
                    return(System.Type.GetType(assemblyQualifiedName));
                }
                else
                {
                    return(null);
                }

            case PersistentArgumentType.Parameter:
            case PersistentArgumentType.ReturnValue:
                if (!string.IsNullOrEmpty(assemblyQualifiedName))
                {
                    return(System.Type.GetType(assemblyQualifiedName));
                }
                else
                {
                    return(GetArgumentType((PersistentArgumentType)secondaryType, -1, null));
                }

            case PersistentArgumentType.None:
                return(null);
            }
        }
Esempio n. 3
0
        /************************************************************************************************************************/

        /// <summary>Tries to get the details of the a parameter or return value of the current parameter type.</summary>
        public bool TryGetLinkable(out int linkIndex, out PersistentArgumentType linkType)
        {
            if (callParameters != null)
            {
                return(TryGetLinkable(CurrentParameter.ParameterType, out linkIndex, out linkType));
            }
            else
            {
                linkIndex = -1;
                linkType  = PersistentArgumentType.None;
                return(false);
            }
        }
Esempio n. 4
0
        /************************************************************************************************************************/
        #endregion
        /************************************************************************************************************************/
        #region Previous Call Cache
        /************************************************************************************************************************/

        /// <summary>Tries to get the details of the a parameter or return value of the specified 'type'.</summary>
        public bool TryGetLinkable(Type type, out int linkIndex, out PersistentArgumentType linkType)
        {
            if (Event != null)
            {
                // Parameters.
                var parameterTypes = Event.ParameterTypes;
                for (int i = 0; i < parameterTypes.Length; i++)
                {
                    if (type.IsAssignableFrom(parameterTypes[i]))
                    {
                        linkIndex = i;
                        linkType  = PersistentArgumentType.Parameter;
                        return(true);
                    }
                }

                // Return Values.
                for (int i = 0; i < PreviousCalls.Count; i++)
                {
                    var method = PreviousCalls[i].GetMethodSafe();
                    if (method == null)
                    {
                        continue;
                    }

                    if (type.IsAssignableFrom(method.GetReturnType()))
                    {
                        linkIndex = i;
                        linkType  = PersistentArgumentType.ReturnValue;
                        return(true);
                    }
                }
            }

            linkIndex = -1;
            linkType  = PersistentArgumentType.None;
            return(false);
        }
Esempio n. 5
0
 /// <summary>Constructs a new <see cref="PersistentArgument"/> with the specified 'type'.</summary>
 public PersistentArgument(Type type)
 {
     _Type          = GetArgumentType(type, out _String, out _Int);
     _SystemType    = type;
     _HasSystemType = true;
 }
        private static void DoLinkModeToggleGUI(Rect area, SerializedProperty argumentProperty, int linkIndex, PersistentArgumentType linkType)
        {
            if (linkIndex < 0)
            {
                return;
            }

            if (_LinkToggleStyle == null)
            {
                _LinkToggleStyle = new GUIStyle(EditorStyles.miniButton)
                {
#if UNITY_2019_3_OR_NEWER
                    padding = new RectOffset(0, -1, 0, 1),
#else
                    padding = new RectOffset(0, 0, 0, 1),
#endif
                    fontSize = 12,
                };
            }

            area.x    += area.width + 2;
            area.width = SpecialModeToggleWidth - 2;

            var currentArgument = DrawerState.Current.call._PersistentArguments[DrawerState.Current.parameterIndex];

            var wasLink =
                currentArgument.Type == PersistentArgumentType.Parameter ||
                currentArgument.Type == PersistentArgumentType.ReturnValue;

            if (wasLink != GUI.Toggle(area, wasLink, _LinkToggleContent, _LinkToggleStyle))
            {
                argumentProperty.ModifyValues <PersistentArgument>((argument) =>
                {
                    if (wasLink)
                    {
                        // Revert to normal mode.

                        argument.SystemType = argument.SystemType;

                        var parameter = DrawerState.Current.CurrentParameter;
                        if ((parameter.Attributes & ParameterAttributes.HasDefault) == ParameterAttributes.HasDefault)
                        {
                            argument.Value = parameter.DefaultValue;
                        }
                    }
                    else
                    {
                        // Link to the specified return value.

                        var argumentType = argument.Type;
                        argument.Type    = linkType;
                        argument._Int    = linkIndex;

                        switch (argumentType)
                        {
                        case PersistentArgumentType.Bool:
                        case PersistentArgumentType.String:
                        case PersistentArgumentType.Int:
                        case PersistentArgumentType.Float:
                        case PersistentArgumentType.Vector2:
                        case PersistentArgumentType.Vector3:
                        case PersistentArgumentType.Vector4:
                        case PersistentArgumentType.Quaternion:
                        case PersistentArgumentType.Color:
                        case PersistentArgumentType.Color32:
                        case PersistentArgumentType.Rect:
                            argument._X = (float)argumentType;
                            break;

                        case PersistentArgumentType.Enum:
                        case PersistentArgumentType.Object:
                            argument._String = DrawerState.Current.CurrentParameter.ParameterType.AssemblyQualifiedName;
                            break;

                        case PersistentArgumentType.Parameter:
                        case PersistentArgumentType.ReturnValue:
                            throw new InvalidOperationException(Names.PersistentArgument.Class + " was already linked.");

                        default:
                            throw new InvalidOperationException("Invalid " + Names.PersistentArgument.Full.Type + ": " + argumentType);
                        }
                    }
                }, wasLink ? "Unlink Argument" : "Link Argument");
            }
        }
        /************************************************************************************************************************/

        private static void ShowLinkMenu(Rect area, SerializedProperty argumentProperty, Type systemType, int linkIndex, PersistentArgumentType linkType)
        {
            var typeProperty = argumentProperty.FindPropertyRelative(Names.PersistentArgument.Type);
            var intProperty  = argumentProperty.FindPropertyRelative(Names.PersistentArgument.Int);

            var menu = new GenericMenu();

            menu.AddDisabledItem(new GUIContent("Link to " + systemType.GetNameCS()));

            // Parameters.
            var parameters = DrawerState.Current.Event.Parameters;

            for (int i = 0; i < DrawerState.Current.Event.ParameterTypes.Length; i++)
            {
                var parameterType = DrawerState.Current.Event.ParameterTypes[i];
                if (!systemType.IsAssignableFrom(parameterType))
                {
                    continue;
                }

                var content = parameters == null ?
                              new GUIContent(string.Concat("Parameter ", i.ToString(), " (", parameterType.GetNameCS(false), ")")) :
                              new GUIContent(string.Concat("Parameter ", i.ToString(), " (", parameterType.GetNameCS(false), " ", parameters[i].Name, ")"));

                var on = i == linkIndex && linkType == PersistentArgumentType.Parameter;

                var index = i;
                menu.AddItem(content, on, () =>
                {
                    typeProperty.enumValueIndex = (int)PersistentArgumentType.Parameter;
                    intProperty.intValue        = index;
                    argumentProperty.serializedObject.ApplyModifiedProperties();
                });
            }

            // Returned Values.
            for (int i = 0; i < DrawerState.Current.PreviousCallCount; i++)
            {
                var method = DrawerState.Current.GetPreviousCall(i).GetMethodSafe();
                if (method == null || !systemType.IsAssignableFrom(method.GetReturnType()))
                {
                    continue;
                }

                var content = new GUIContent(string.Concat("Returned Value ", i.ToString(), " (", MethodSelectionMenu.GetMethodSignature(method, true), ")"));

                var on = i == linkIndex && linkType == PersistentArgumentType.ReturnValue;

                var index = i;
                menu.AddItem(content, on, () =>
                {
                    typeProperty.enumValueIndex = (int)PersistentArgumentType.ReturnValue;
                    intProperty.intValue        = index;
                    argumentProperty.serializedObject.ApplyModifiedProperties();
                });
            }

            menu.DropDown(area);
        }