diff --git a/Alchemy/Assets/Alchemy/Editor/Elements/MethodButton.cs b/Alchemy/Assets/Alchemy/Editor/Elements/MethodButton.cs index 642aaf7..6d9976b 100644 --- a/Alchemy/Assets/Alchemy/Editor/Elements/MethodButton.cs +++ b/Alchemy/Assets/Alchemy/Editor/Elements/MethodButton.cs @@ -8,22 +8,32 @@ public sealed class MethodButton : VisualElement { const string ButtonLabelText = "Invoke"; - public MethodButton(object target, MethodInfo methodInfo) + public MethodButton(object target, MethodInfo methodInfo, bool useParameters) { var parameters = methodInfo.GetParameters(); + var parameterObjects = new object[parameters.Length]; + for(int i = 0; i < parameters.Length; i++) + { + if(parameters[i].HasDefaultValue) + parameterObjects[i] = parameters[i].DefaultValue; + else + parameterObjects[i] = TypeHelper.CreateDefaultInstance(parameters[i].ParameterType); + } // Create parameterless button - if (parameters.Length == 0) + if (!useParameters || parameters.Length == 0) { - button = new Button(() => methodInfo.Invoke(target, null)) - { - text = methodInfo.Name - }; + if(parameters.Length > 0) + button = new Button(() => methodInfo.Invoke(target, parameterObjects)); + else + button = new Button(() => methodInfo.Invoke(target, null)); + + button.text = ObjectNames.NicifyVariableName(methodInfo.Name); + button.tooltip = methodInfo.ToString(); Add(button); return; } - var parameterObjects = new object[parameters.Length]; var box = new HelpBox(); Add(box); @@ -59,7 +69,6 @@ public MethodButton(object target, MethodInfo methodInfo) { var index = i; var parameter = parameters[index]; - parameterObjects[index] = TypeHelper.CreateDefaultInstance(parameter.ParameterType); var element = new GenericField(parameterObjects[index], parameter.ParameterType, ObjectNames.NicifyVariableName(parameter.Name)); element.OnValueChanged += x => parameterObjects[index] = x; element.style.paddingRight = 4f; diff --git a/Alchemy/Assets/Alchemy/Editor/Elements/ReflectionField.cs b/Alchemy/Assets/Alchemy/Editor/Elements/ReflectionField.cs index a1c3f41..04beb1b 100644 --- a/Alchemy/Assets/Alchemy/Editor/Elements/ReflectionField.cs +++ b/Alchemy/Assets/Alchemy/Editor/Elements/ReflectionField.cs @@ -20,9 +20,9 @@ public void Rebuild(object target, MemberInfo memberInfo) if (memberInfo is MethodInfo methodInfo) { - if (methodInfo.HasCustomAttribute()) + if (methodInfo.TryGetCustomAttribute(out var buttonAttribute)) { - var button = new MethodButton(target, methodInfo); + var button = new MethodButton(target, methodInfo, buttonAttribute.useParameters); Add(button); } return; diff --git a/Alchemy/Assets/Alchemy/Editor/Internal/InspectorHelper.cs b/Alchemy/Assets/Alchemy/Editor/Internal/InspectorHelper.cs index 407618f..3a87c22 100644 --- a/Alchemy/Assets/Alchemy/Editor/Internal/InspectorHelper.cs +++ b/Alchemy/Assets/Alchemy/Editor/Internal/InspectorHelper.cs @@ -200,9 +200,9 @@ public static VisualElement CreateMemberElement(SerializedObject serializedObjec switch (memberInfo) { case MethodInfo methodInfo: - if (methodInfo.HasCustomAttribute()) + if (methodInfo.TryGetCustomAttribute(out var buttonAttribute)) { - return new MethodButton(target, methodInfo); + return new MethodButton(target, methodInfo, buttonAttribute.useParameters); } break; case FieldInfo: diff --git a/Alchemy/Assets/Alchemy/Runtime/Inspector/InspectorAttributes.cs b/Alchemy/Assets/Alchemy/Runtime/Inspector/InspectorAttributes.cs index acbedb1..dd16208 100644 --- a/Alchemy/Assets/Alchemy/Runtime/Inspector/InspectorAttributes.cs +++ b/Alchemy/Assets/Alchemy/Runtime/Inspector/InspectorAttributes.cs @@ -18,7 +18,11 @@ public sealed class OrderAttribute : Attribute } [AttributeUsage(AttributeTargets.Method)] - public sealed class ButtonAttribute : Attribute { } + public sealed class ButtonAttribute : Attribute + { + public ButtonAttribute(bool useParameters = true) => this.useParameters = useParameters; + public readonly bool useParameters; + } [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class ShowInInspectorAttribute : Attribute { }