diff --git a/Scripts/Editor/EditorStylesHacks.cs b/Scripts/Editor/EditorStylesHacks.cs new file mode 100644 index 0000000..9c99bf5 --- /dev/null +++ b/Scripts/Editor/EditorStylesHacks.cs @@ -0,0 +1,49 @@ +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace XNodeEditor { + public static class EditorStylesHacks { + private static FieldInfo EditorLabelField; + private static FieldInfo EditorFoldoutField; + private static FieldInfo EditorStylesInstanceField; + private static EditorStyles EditorStylesInstance; + + private static readonly BindingFlags EditorStylesBindingFlags = + BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance; + + public static GUIStyle Label { + get => EditorStyles.label; + set { + CacheEditorStylesInstance(); + if (EditorLabelField == null) { + EditorLabelField = typeof(EditorStyles).GetField("m_Label", EditorStylesBindingFlags); + } + + EditorLabelField.SetValue(EditorStylesInstance, value); + } + } + + public static GUIStyle Foldout { + get => EditorStyles.foldout; + set { + CacheEditorStylesInstance(); + if (EditorFoldoutField == null) { + EditorFoldoutField = typeof(EditorStyles).GetField("m_Foldout", EditorStylesBindingFlags); + } + + EditorFoldoutField.SetValue(EditorStylesInstance, value); + } + } + + private static void CacheEditorStylesInstance() { + if (EditorStylesInstanceField == null) { + EditorStylesInstanceField = typeof(EditorStyles).GetField("s_Current", EditorStylesBindingFlags); + } + + if (EditorStylesInstance == null) { + EditorStylesInstance = EditorStylesInstanceField.GetValue(null) as EditorStyles; + } + } + } +} \ No newline at end of file diff --git a/Scripts/Editor/EditorStylesHacks.cs.meta b/Scripts/Editor/EditorStylesHacks.cs.meta new file mode 100644 index 0000000..6e813ef --- /dev/null +++ b/Scripts/Editor/EditorStylesHacks.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9850cac2240045df9ade822de8020091 +timeCreated: 1555066067 \ No newline at end of file diff --git a/Scripts/Editor/NodeEditorGUILayout.cs b/Scripts/Editor/NodeEditorGUILayout.cs index a43a2e5..7e8c960 100644 --- a/Scripts/Editor/NodeEditorGUILayout.cs +++ b/Scripts/Editor/NodeEditorGUILayout.cs @@ -2,7 +2,6 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using System.Reflection; using UnityEditor; using UnityEditorInternal; using UnityEngine; @@ -300,13 +299,26 @@ namespace XNodeEditor { } private static void DrawStyledPropertyField(SerializedProperty property, GUIContent label, GUIStyle style, bool showBacking = true, bool includeChildren = false) { + label = label != null ? label : new GUIContent(property.displayName); + + GUIStyle oldFoldout = EditorStylesHacks.Foldout; + GUIStyle oldLabel = EditorStylesHacks.Label; + + EditorStylesHacks.Label = style; + EditorStylesHacks.Foldout = NodeEditorResources.styles.foldout; + EditorGUILayout.BeginHorizontal(); - // Display a label - EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName), style, GUILayout.MaxWidth(70)); - // Display an editable property field - if(showBacking) - EditorGUILayout.PropertyField(property, emptyLabel, includeChildren, GUILayout.MinWidth(30)); + + if (showBacking) { + EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30)); + } else { + EditorGUILayout.LabelField(label, style, GUILayout.MinWidth(30)); + } + EditorGUILayout.EndHorizontal(); + + EditorStylesHacks.Label = oldLabel; + EditorStylesHacks.Foldout = oldFoldout; } private static ReorderableList CreateReorderableList(string fieldName, List instancePorts, SerializedProperty arrayData, Type type, SerializedObject serializedObject, XNode.NodePort.IO io, XNode.Node.ConnectionType connectionType, XNode.Node.TypeConstraint typeConstraint, Action onCreation) { diff --git a/Scripts/Editor/NodeEditorResources.cs b/Scripts/Editor/NodeEditorResources.cs index 7c79c90..a0ef453 100644 --- a/Scripts/Editor/NodeEditorResources.cs +++ b/Scripts/Editor/NodeEditorResources.cs @@ -16,9 +16,9 @@ namespace XNodeEditor { // Styles public static Styles styles { get { return _styles != null ? _styles : _styles = new Styles(); } } public static Styles _styles = null; - public static GUIStyle OutputPort { get { return new GUIStyle(EditorStyles.label) { alignment = TextAnchor.UpperRight }; } } + public static GUIStyle OutputPort { get { return styles.outputPort;} } public class Styles { - public GUIStyle inputPort, nodeHeader, nodeBody, tooltip, nodeHighlight, nodeProperty; + public GUIStyle inputPort, nodeHeader, nodeBody, tooltip, nodeHighlight, nodeProperty, outputPort, foldout; public Styles() { GUIStyle baseStyle = new GUIStyle(EditorStyles.label); @@ -26,9 +26,15 @@ namespace XNodeEditor { baseStyle.normal.textColor = Color.white; baseStyle.onNormal.textColor = Color.white; - inputPort = new GUIStyle(baseStyle); + outputPort = new GUIStyle(baseStyle); + + inputPort = new GUIStyle(EditorStyles.label); inputPort.alignment = TextAnchor.UpperLeft; + foldout = new GUIStyle(EditorStyles.foldout); + foldout.normal.textColor = baseStyle.normal.textColor; + foldout.onNormal.textColor = baseStyle.onNormal.textColor; + nodeProperty = new GUIStyle(baseStyle); nodeHeader = new GUIStyle();