private void AssertType(PersistentArgumentType type) { if (_Type != type) { throw new InvalidOperationException(Names.PersistentArgument.Full.Type + " is " + _Type + " but should be " + type); } }
/************************************************************************************************************************/ /// <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); } }
/************************************************************************************************************************/ /// <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); } }
/************************************************************************************************************************/ #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); }
/// <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); }