From 5283ee3ec7588b99dfd1c840b2034f444736bda8 Mon Sep 17 00:00:00 2001 From: Thor Brigsted Date: Fri, 6 Sep 2019 18:51:10 +0200 Subject: [PATCH] Removed the need for static bool, moved code to their right places --- Scripts/Editor/NodeEditorAction.cs | 45 +++++++++++++++--------------- Scripts/Editor/NodeGraphEditor.cs | 7 +++-- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs index f038986..0bca2b7 100644 --- a/Scripts/Editor/NodeEditorAction.cs +++ b/Scripts/Editor/NodeEditorAction.cs @@ -22,6 +22,7 @@ namespace XNodeEditor { [NonSerialized] private XNode.NodePort hoveredPort = null; [NonSerialized] private XNode.NodePort draggedOutput = null; [NonSerialized] private XNode.NodePort draggedOutputTarget = null; + [NonSerialized] private XNode.NodePort autoConnectOutput = null; [NonSerialized] private List draggedOutputReroutes = new List(); private RerouteReference hoveredReroute = new RerouteReference(); private List selectedReroutes = new List(); @@ -31,9 +32,6 @@ namespace XNodeEditor { private Rect selectionBox; private bool isDoubleClick = false; - public static bool stoppedDraggingPort = true; - private XNode.NodePort draggedPort; - private struct RerouteReference { public XNode.NodePort port; public int connectionIndex; @@ -166,8 +164,10 @@ namespace XNodeEditor { if (IsHoveringPort) { if (hoveredPort.IsOutput) { draggedOutput = hoveredPort; + autoConnectOutput = hoveredPort; } else { hoveredPort.VerifyConnections(); + autoConnectOutput = null; if (hoveredPort.IsConnected) { XNode.Node node = hoveredPort.node; XNode.NodePort output = hoveredPort.Connection; @@ -235,6 +235,12 @@ namespace XNodeEditor { EditorUtility.SetDirty(graph); } } + // Open context menu for auto-connection + else if (autoConnectOutput != null) { + GenericMenu menu = new GenericMenu(); + graphEditor.AddContextMenuItems(menu); + menu.DropDown(new Rect(Event.current.mousePosition, Vector2.zero)); + } //Release dragged connection draggedOutput = null; draggedOutputTarget = null; @@ -498,21 +504,7 @@ namespace XNodeEditor { NodeEditorGUILayout.DrawPortHandle(rect, bgcol, frcol); } - stoppedDraggingPort = true; - } else { - if (stoppedDraggingPort) { - if (draggedPort != null && draggedPort.IsOutput) { - GenericMenu menu = new GenericMenu(); - graphEditor.AddContextMenuItems(menu); - menu.DropDown(new Rect(Event.current.mousePosition, Vector2.zero)); - } - stoppedDraggingPort = false; - } } - if (hoveredPort != null) - draggedPort = hoveredPort; - else if (draggedOutputTarget != null) - draggedPort = draggedOutputTarget; Repaint(); } @@ -529,11 +521,20 @@ namespace XNodeEditor { return windowRect.Contains(mousePos); } - public void ConnectOnCreate() { - if (graph.nodes.Last().Ports.Where(r => r.IsInput == true).Any(r => r.ValueType == draggedPort.ValueType)) - draggedPort.Connect(graph.nodes.Last().Ports.Where(r => r.IsInput == true).Where(r => r.ValueType == draggedPort.ValueType).ToArray() [0]); - else - draggedPort.Connect(graph.nodes.Last().Ports.Where(r => r.IsInput == true).ToArray() [0]); + /// Attempt to connect dragged output to target node + public void AutoConnect(XNode.Node node) { + if (autoConnectOutput == null) return; + + // Find input port of same type + XNode.NodePort inputPort = node.Ports.FirstOrDefault(x => x.IsInput && x.ValueType == autoConnectOutput.ValueType); + // Fallback to input port + if (inputPort == null) inputPort = node.Ports.FirstOrDefault(x => x.IsInput); + // Autoconnect + if (inputPort != null) autoConnectOutput.Connect(inputPort); + + // Save changes + EditorUtility.SetDirty(graph); + if (NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets(); } } } \ No newline at end of file diff --git a/Scripts/Editor/NodeGraphEditor.cs b/Scripts/Editor/NodeGraphEditor.cs index f98935e..bdd4fa0 100644 --- a/Scripts/Editor/NodeGraphEditor.cs +++ b/Scripts/Editor/NodeGraphEditor.cs @@ -52,8 +52,8 @@ namespace XNodeEditor { if (string.IsNullOrEmpty(path)) continue; menu.AddItem(new GUIContent(path), false, () => { - CreateNode(type, pos); - if (!NodeEditorWindow.stoppedDraggingPort) NodeEditorWindow.current.ConnectOnCreate(); + XNode.Node node = CreateNode(type, pos); + NodeEditorWindow.current.AutoConnect(node); }); } menu.AddSeparator(""); @@ -88,13 +88,14 @@ namespace XNodeEditor { } /// Create a node and save it in the graph asset - public virtual void CreateNode(Type type, Vector2 position) { + public virtual XNode.Node CreateNode(Type type, Vector2 position) { XNode.Node node = target.AddNode(type); node.position = position; if (node.name == null || node.name.Trim() == "") node.name = NodeEditorUtilities.NodeDefaultName(type); AssetDatabase.AddObjectToAsset(node, target); if (NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets(); NodeEditorWindow.RepaintAll(); + return node; } /// Creates a copy of the original node in the graph