diff --git a/Scripts/Attributes/OverrideTooltipAttribute.cs b/Scripts/Attributes/OverrideTooltipAttribute.cs new file mode 100644 index 0000000..707eb32 --- /dev/null +++ b/Scripts/Attributes/OverrideTooltipAttribute.cs @@ -0,0 +1,23 @@ +using System; + +namespace XNode { + + /// + /// When applied to a field marked as node input/output, allows for the tooltip shown beside the nodes to be overriden. + /// Optionally, whether an output node's value is shown in the tooltip can also be turned off. + /// Leaving the tooltip override blank or null will leave the normal tooltip (type name) in place. + /// + [AttributeUsage(AttributeTargets.Field)] + public sealed class OverrideTooltipAttribute : Attribute { + public readonly bool overrideTooltip; + public readonly string tooltip; + public readonly bool hideValue; + + public OverrideTooltipAttribute(string tooltip = "", bool hideValue = false) { + overrideTooltip = !string.IsNullOrEmpty(tooltip); + if (overrideTooltip) this.tooltip = tooltip; + this.hideValue = hideValue; + } + } + +} \ No newline at end of file diff --git a/Scripts/Attributes/OverrideTooltipAttribute.cs.meta b/Scripts/Attributes/OverrideTooltipAttribute.cs.meta new file mode 100644 index 0000000..36d84d2 --- /dev/null +++ b/Scripts/Attributes/OverrideTooltipAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b578945cab8b7c643ac937a49febb57e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Editor/NodeGraphEditor.cs b/Scripts/Editor/NodeGraphEditor.cs index b6198ca..ebc212d 100644 --- a/Scripts/Editor/NodeGraphEditor.cs +++ b/Scripts/Editor/NodeGraphEditor.cs @@ -1,7 +1,9 @@ using System; using System.Linq; +using System.Reflection; using UnityEditor; using UnityEngine; +using XNode; namespace XNodeEditor { /// Base class to derive custom Node Graph editors from. Use this to override how graphs are drawn in the editor. @@ -184,11 +186,29 @@ namespace XNodeEditor { /// Override to display custom tooltips public virtual string GetPortTooltip(XNode.NodePort port) { - Type portType = port.ValueType; - string tooltip = ""; - tooltip = portType.PrettyName(); - if (port.IsOutput) { - object obj = port.node.GetValue(port); + // Allow tooltips to be overridden or to have their values hidden based on attribute usage + // First, a port managed by a DynamicPortList will have a fieldName of "realName X", so we won't find it directly. + FieldInfo portFieldInfo = null; + string[] fieldNameParts = port.fieldName.Split(' '); + if (port.IsDynamic && fieldNameParts.Length == 2) { + portFieldInfo = port.node.GetType().GetField(fieldNameParts[0]); + } + // If a port isn't dynamic, doesn't match the format, or we didn't find its field, try getting it directly + if (portFieldInfo == null) { + portFieldInfo = port.node.GetType().GetField(port.fieldName); + } + + // If the fieldInfo is still null, abort mission; otherwise, look for our attribute. + OverrideTooltipAttribute attr = null; + if (portFieldInfo != null) { + attr = ((OverrideTooltipAttribute[])portFieldInfo + .GetCustomAttributes(typeof(OverrideTooltipAttribute), false)).SingleOrDefault(); + } + string tooltip = attr != null && attr.overrideTooltip ? attr.tooltip : port.ValueType.PrettyName(); + bool hideValue = attr != null && attr.hideValue; + // ReSharper disable once InvertIf + if (!hideValue && port.IsOutput) { + var obj = port.node.GetValue(port); tooltip += " = " + (obj != null ? obj.ToString() : "null"); } return tooltip;