1
0
mirror of https://github.com/Siccity/xNode.git synced 2026-03-26 22:49:02 +08:00

Experimental: Swap editor styles by reflection

This commit is contained in:
Woland 2019-04-12 20:39:10 +02:00
parent b9b5bf8d9f
commit d481075e66
4 changed files with 79 additions and 9 deletions

View File

@ -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;
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9850cac2240045df9ade822de8020091
timeCreated: 1555066067

View File

@ -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<XNode.NodePort> instancePorts, SerializedProperty arrayData, Type type, SerializedObject serializedObject, XNode.NodePort.IO io, XNode.Node.ConnectionType connectionType, XNode.Node.TypeConstraint typeConstraint, Action<ReorderableList> onCreation) {

View File

@ -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();