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;