From 91151b327a86a55b2529e3b495c81da60533d6f4 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Thu, 9 May 2019 00:02:58 +0200 Subject: [PATCH 1/8] Bugfix: Calling base.OnBodyGUI after drawing ports would make noodles disappear --- Scripts/Editor/NodeEditor.cs | 3 +-- Scripts/Editor/NodeEditorGUI.cs | 5 ++--- Scripts/Editor/NodeEditorGUILayout.cs | 9 +++------ 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Scripts/Editor/NodeEditor.cs b/Scripts/Editor/NodeEditor.cs index 91d92d0..7652658 100644 --- a/Scripts/Editor/NodeEditor.cs +++ b/Scripts/Editor/NodeEditor.cs @@ -12,7 +12,7 @@ namespace XNodeEditor { /// Fires every whenever a node was modified through the editor public static Action onUpdateNode; - public static Dictionary portPositions; + public readonly static Dictionary portPositions = new Dictionary(); public virtual void OnHeaderGUI() { GUILayout.Label(target.name, NodeEditorResources.styles.nodeHeader, GUILayout.Height(30)); @@ -25,7 +25,6 @@ namespace XNodeEditor { // serializedObject.ApplyModifiedProperties(); goes at the end. serializedObject.Update(); string[] excludes = { "m_Script", "graph", "position", "ports" }; - portPositions = new Dictionary(); // Iterate through serialized properties and draw them like the Inspector (But with ports) SerializedProperty iterator = serializedObject.GetIterator(); diff --git a/Scripts/Editor/NodeEditorGUI.cs b/Scripts/Editor/NodeEditorGUI.cs index c773571..c9c460f 100644 --- a/Scripts/Editor/NodeEditorGUI.cs +++ b/Scripts/Editor/NodeEditorGUI.cs @@ -301,7 +301,7 @@ namespace XNodeEditor { NodeEditor nodeEditor = NodeEditor.GetEditor(node, this); - NodeEditor.portPositions = new Dictionary(); + NodeEditor.portPositions.Clear(); //Get node position Vector2 nodePos = GridToWindowPositionNoClipped(node.position); @@ -351,8 +351,7 @@ namespace XNodeEditor { Vector2 portHandlePos = kvp.Value; portHandlePos += node.position; Rect rect = new Rect(portHandlePos.x - 8, portHandlePos.y - 8, 16, 16); - if (portConnectionPoints.ContainsKey(kvp.Key)) portConnectionPoints[kvp.Key] = rect; - else portConnectionPoints.Add(kvp.Key, rect); + portConnectionPoints[kvp.Key] = rect; } } diff --git a/Scripts/Editor/NodeEditorGUILayout.cs b/Scripts/Editor/NodeEditorGUILayout.cs index 1826107..344b3fb 100644 --- a/Scripts/Editor/NodeEditorGUILayout.cs +++ b/Scripts/Editor/NodeEditorGUILayout.cs @@ -147,8 +147,7 @@ namespace XNodeEditor { // Register the handle position Vector2 portPos = rect.center; - if (NodeEditor.portPositions.ContainsKey(port)) NodeEditor.portPositions[port] = portPos; - else NodeEditor.portPositions.Add(port, portPos); + NodeEditor.portPositions[port] = portPos; } } @@ -204,8 +203,7 @@ namespace XNodeEditor { // Register the handle position Vector2 portPos = rect.center; - if (NodeEditor.portPositions.ContainsKey(port)) NodeEditor.portPositions[port] = portPos; - else NodeEditor.portPositions.Add(port, portPos); + NodeEditor.portPositions[port] = portPos; } /// Add a port field to previous layout element. @@ -233,8 +231,7 @@ namespace XNodeEditor { // Register the handle position Vector2 portPos = rect.center; - if (NodeEditor.portPositions.ContainsKey(port)) NodeEditor.portPositions[port] = portPos; - else NodeEditor.portPositions.Add(port, portPos); + NodeEditor.portPositions[port] = portPos; } /// Draws an input and an output port on the same line From 29a05cba28abe90f99957babc824a6471e8f691d Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Fri, 10 May 2019 09:05:48 +0200 Subject: [PATCH 2/8] Fixed #143 - Added minZoom to preferences Also renamed zoomOutLimit to maxZoom --- Scripts/Editor/NodeEditorPreferences.cs | 13 +++++++++++-- Scripts/Editor/NodeEditorWindow.cs | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Scripts/Editor/NodeEditorPreferences.cs b/Scripts/Editor/NodeEditorPreferences.cs index bd2cb55..4fc6b7b 100644 --- a/Scripts/Editor/NodeEditorPreferences.cs +++ b/Scripts/Editor/NodeEditorPreferences.cs @@ -23,7 +23,12 @@ namespace XNodeEditor { [SerializeField] private Color32 _gridBgColor = new Color(0.18f, 0.18f, 0.18f); public Color32 gridBgColor { get { return _gridBgColor; } set { _gridBgColor = value; _gridTexture = null; } } - public float zoomOutLimit = 5f; + [Obsolete("Use maxZoom instead")] + public float zoomOutLimit { get { return maxZoom; } set { maxZoom = value; } } + + [UnityEngine.Serialization.FormerlySerializedAs("zoomOutLimit")] + public float maxZoom = 5f; + public float minZoom = 1f; public Color32 highlightColor = new Color32(255, 255, 255, 255); public bool gridSnap = true; public bool autoSave = true; @@ -114,7 +119,11 @@ namespace XNodeEditor { EditorGUILayout.LabelField("Grid", EditorStyles.boldLabel); settings.gridSnap = EditorGUILayout.Toggle(new GUIContent("Snap", "Hold CTRL in editor to invert"), settings.gridSnap); settings.zoomToMouse = EditorGUILayout.Toggle(new GUIContent("Zoom to Mouse", "Zooms towards mouse position"), settings.zoomToMouse); - settings.zoomOutLimit = EditorGUILayout.FloatField(new GUIContent("Zoom out Limit", "Upper limit to zoom"), settings.zoomOutLimit); + EditorGUILayout.LabelField("Zoom"); + EditorGUI.indentLevel++; + settings.maxZoom = EditorGUILayout.FloatField(new GUIContent("Max", "Upper limit to zoom"), settings.maxZoom); + settings.minZoom = EditorGUILayout.FloatField(new GUIContent("Min", "Lower limit to zoom"), settings.minZoom); + EditorGUI.indentLevel--; settings.gridLineColor = EditorGUILayout.ColorField("Color", settings.gridLineColor); settings.gridBgColor = EditorGUILayout.ColorField(" ", settings.gridBgColor); if (GUI.changed) { diff --git a/Scripts/Editor/NodeEditorWindow.cs b/Scripts/Editor/NodeEditorWindow.cs index a575c8d..fc04439 100644 --- a/Scripts/Editor/NodeEditorWindow.cs +++ b/Scripts/Editor/NodeEditorWindow.cs @@ -61,7 +61,7 @@ namespace XNodeEditor { public XNode.NodeGraph graph; public Vector2 panOffset { get { return _panOffset; } set { _panOffset = value; Repaint(); } } private Vector2 _panOffset; - public float zoom { get { return _zoom; } set { _zoom = Mathf.Clamp(value, 1f, NodeEditorPreferences.GetSettings().zoomOutLimit); Repaint(); } } + public float zoom { get { return _zoom; } set { _zoom = Mathf.Clamp(value, NodeEditorPreferences.GetSettings().minZoom, NodeEditorPreferences.GetSettings().maxZoom); Repaint(); } } private float _zoom = 1; void OnFocus() { From d68aea2a8a59c023eff467f36676e72712cc6222 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Fri, 10 May 2019 09:55:10 +0200 Subject: [PATCH 3/8] Fixed #142 - New feature: Automatically remove "Node" postfix in names --- Scripts/Editor/NodeGraphEditor.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Scripts/Editor/NodeGraphEditor.cs b/Scripts/Editor/NodeGraphEditor.cs index 8a9d2f0..6fd00ea 100644 --- a/Scripts/Editor/NodeGraphEditor.cs +++ b/Scripts/Editor/NodeGraphEditor.cs @@ -72,7 +72,12 @@ namespace XNodeEditor { public virtual void CreateNode(Type type, Vector2 position) { XNode.Node node = target.AddNode(type); node.position = position; - if (string.IsNullOrEmpty(node.name)) node.name = UnityEditor.ObjectNames.NicifyVariableName(type.Name); + if (string.IsNullOrEmpty(node.name)) { + // Automatically remove redundant 'Node' postfix + string typeName = type.Name; + if (typeName.EndsWith("Node")) typeName = typeName.Substring(0, typeName.LastIndexOf("Node")); + node.name = UnityEditor.ObjectNames.NicifyVariableName(typeName); + } AssetDatabase.AddObjectToAsset(node, target); if (NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets(); NodeEditorWindow.RepaintAll(); From c868c037ea718853446e5cc55ff24d75b7dc69e7 Mon Sep 17 00:00:00 2001 From: Simon Rodriguez Date: Mon, 13 May 2019 10:23:54 +0200 Subject: [PATCH 4/8] Fixed #99 - Color for types in preferences will reseted after playing * SavePrefs was saving to the wrong key. * A dictionary cant be changed while being enumerated. Now clones the keys and gets/sets values. --- Scripts/Editor/NodeEditorPreferences.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Scripts/Editor/NodeEditorPreferences.cs b/Scripts/Editor/NodeEditorPreferences.cs index 4fc6b7b..2f84a4a 100644 --- a/Scripts/Editor/NodeEditorPreferences.cs +++ b/Scripts/Editor/NodeEditorPreferences.cs @@ -158,11 +158,13 @@ namespace XNodeEditor { //Label EditorGUILayout.LabelField("Types", EditorStyles.boldLabel); + //Clone keys so we can enumerate the dictionary and make changes. + var typeColorKeys = new List(typeColors.Keys); + //Display type colors. Save them if they are edited by the user - foreach (var typeColor in typeColors) { - Type type = typeColor.Key; + foreach (var type in typeColorKeys) { string typeColorKey = NodeEditorUtilities.PrettyName(type); - Color col = typeColor.Value; + Color col = typeColors[type]; EditorGUI.BeginChangeCheck(); EditorGUILayout.BeginHorizontal(); col = EditorGUILayout.ColorField(typeColorKey, col); @@ -171,7 +173,7 @@ namespace XNodeEditor { typeColors[type] = col; if (settings.typeColors.ContainsKey(typeColorKey)) settings.typeColors[typeColorKey] = col; else settings.typeColors.Add(typeColorKey, col); - SavePrefs(typeColorKey, settings); + SavePrefs(key, settings); NodeEditorWindow.RepaintAll(); } } From 8a03811ee35a4ceb034c9317c0b5543e16db9172 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Mon, 13 May 2019 14:26:29 +0200 Subject: [PATCH 5/8] More DynamicPortList debug messages --- Scripts/Editor/NodeEditorGUILayout.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Scripts/Editor/NodeEditorGUILayout.cs b/Scripts/Editor/NodeEditorGUILayout.cs index 344b3fb..581339a 100644 --- a/Scripts/Editor/NodeEditorGUILayout.cs +++ b/Scripts/Editor/NodeEditorGUILayout.cs @@ -323,7 +323,8 @@ namespace XNodeEditor { XNode.NodePort port = node.GetPort(fieldName + " " + index); if (hasArrayData) { if (arrayData.arraySize <= index) { - EditorGUI.LabelField(rect, "Invalid element " + index); + string portInfo = port != null ? port.fieldName : ""; + EditorGUI.LabelField(rect, "Array[" + index + "] data out of range"); return; } SerializedProperty itemData = arrayData.GetArrayElementAtIndex(index); @@ -427,7 +428,12 @@ namespace XNodeEditor { int index = rl.index; - if (dynamicPorts.Count > index) { + if (dynamicPorts[index] == null) { + Debug.LogWarning("No port found at index " + index + " - Skipped"); + } else if (dynamicPorts.Count <= index) { + Debug.LogWarning("DynamicPorts[" + index + "] out of range. Length was " + dynamicPorts.Count + " - Skipped"); + } else { + // Clear the removed ports connections dynamicPorts[index].ClearConnections(); // Move following connections one step up to replace the missing connection @@ -442,11 +448,14 @@ namespace XNodeEditor { node.RemoveDynamicPort(dynamicPorts[dynamicPorts.Count() - 1].fieldName); serializedObject.Update(); EditorUtility.SetDirty(node); - } else { - Debug.LogWarning("DynamicPorts[" + index + "] out of range. Length was " + dynamicPorts.Count + ". Skipping."); } if (hasArrayData) { + if (arrayData.arraySize <= index) { + Debug.LogWarning("Attempted to remove array index " + index + " where only " + arrayData.arraySize + " exist - Skipped"); + Debug.Log(rl.list[0]); + return; + } arrayData.DeleteArrayElementAtIndex(index); // Error handling. If the following happens too often, file a bug report at https://github.com/Siccity/xNode/issues if (dynamicPorts.Count <= arrayData.arraySize) { From 833e26ccc3247526d2c498a37c5659d53ebac386 Mon Sep 17 00:00:00 2001 From: Simon Rodriguez Date: Mon, 13 May 2019 20:53:34 +0200 Subject: [PATCH 6/8] Make RemoveNode + switch order * made RemoveNode function virtual used for example when a graph wants to block a delete * switched order of remove function and destroy function. target.RemoveNode was always getting a null value --- Scripts/Editor/NodeGraphEditor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/Editor/NodeGraphEditor.cs b/Scripts/Editor/NodeGraphEditor.cs index 6fd00ea..c509d28 100644 --- a/Scripts/Editor/NodeGraphEditor.cs +++ b/Scripts/Editor/NodeGraphEditor.cs @@ -93,9 +93,9 @@ namespace XNodeEditor { } /// Safely remove a node and all its connections. - public void RemoveNode(XNode.Node node) { - UnityEngine.Object.DestroyImmediate(node, true); + public virtual void RemoveNode(XNode.Node node) { target.RemoveNode(node); + UnityEngine.Object.DestroyImmediate(node, true); if (NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets(); } From 4721edc7ec04efa7d0b95a98aec2e629e9b00a0c Mon Sep 17 00:00:00 2001 From: Adsitoz Date: Sat, 8 Jun 2019 04:04:19 +1000 Subject: [PATCH 7/8] Fixed rename not saving the filename change. (#149) - AssetDataBase.ImportAsset was not correctly renaming the asset. Changed it over to use the standard rename method. --- Scripts/Editor/RenamePopup.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/Editor/RenamePopup.cs b/Scripts/Editor/RenamePopup.cs index a49a948..9a1ed7b 100644 --- a/Scripts/Editor/RenamePopup.cs +++ b/Scripts/Editor/RenamePopup.cs @@ -57,10 +57,10 @@ namespace XNodeEditor { else { if (GUILayout.Button("Apply") || (e.isKey && e.keyCode == KeyCode.Return)) { target.name = input; - AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(target)); + AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(target), input); Close(); } } } } -} \ No newline at end of file +} From 0c1ae4881dcd49f4c1783bac21221e6a605bac80 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Sat, 8 Jun 2019 01:41:58 +0200 Subject: [PATCH 8/8] Fixed #147 - Adding dynamic port using "+" causes exception --- Scripts/Editor/NodeEditorGUILayout.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/Editor/NodeEditorGUILayout.cs b/Scripts/Editor/NodeEditorGUILayout.cs index 581339a..cd4d320 100644 --- a/Scripts/Editor/NodeEditorGUILayout.cs +++ b/Scripts/Editor/NodeEditorGUILayout.cs @@ -329,7 +329,7 @@ namespace XNodeEditor { } SerializedProperty itemData = arrayData.GetArrayElementAtIndex(index); EditorGUI.PropertyField(rect, itemData, true); - } else EditorGUI.LabelField(rect, port.fieldName); + } else EditorGUI.LabelField(rect, port != null ? port.fieldName : ""); if (port != null) { Vector2 pos = rect.position + (port.IsOutput?new Vector2(rect.width + 6, 0) : new Vector2(-36, 0)); NodeEditorGUILayout.PortField(pos, port);