public IEnumerator EdgeConnectDragMultipleEdgesFromExecutionPortInputToOutputWorks() { IONodeModel exeStartNode = CreateNode("First Out Exe node", new Vector2(100, 100), 0, 0, 0, 1); IONodeModel exeStartNode2 = CreateNode("Second Out Exe node", new Vector2(100, 400), 0, 0, 0, 1); IONodeModel exeEndNode = CreateNode("First In Exe node", new Vector2(400, 100), 0, 0, 1, 0); IONodeModel exeEndNode2 = CreateNode("Second In Exe node", new Vector2(400, 400), 0, 0, 1, 0); IPortModel startPort = exeStartNode.GetPorts(PortDirection.Output, PortType.Execution).First(); IPortModel startPort2 = exeStartNode2.GetPorts(PortDirection.Output, PortType.Execution).First(); IPortModel endPort = exeEndNode.GetPorts(PortDirection.Input, PortType.Execution).First(); IPortModel endPort2 = exeEndNode2.GetPorts(PortDirection.Input, PortType.Execution).First(); // We start without any connection Assert.AreEqual(0, startPort.GetConnectedEdges().Count()); Assert.AreEqual(0, endPort.GetConnectedEdges().Count()); Assert.AreEqual(0, endPort2.GetConnectedEdges().Count()); MarkGraphViewStateDirty(); yield return(null); Port startPortUI = startPort.GetUI <Port>(graphView); Port startPort2UI = startPort2.GetUI <Port>(graphView); Port endPortUI = endPort.GetUI <Port>(graphView); Port endPort2UI = endPort2.GetUI <Port>(graphView); // Drag an edge between the two ports helpers.DragTo(startPortUI.GetGlobalCenter(), endPortUI.GetGlobalCenter()); helpers.DragTo(startPort2UI.GetGlobalCenter(), endPortUI.GetGlobalCenter()); // Allow one frame for the edge to be placed onto a layer yield return(null); // Allow one frame for the edge to be rendered and process its layout a first time yield return(null); // Check that the edge exists and that it connects the two ports. Assert.AreEqual(1, startPort.GetConnectedEdges().Count()); Assert.AreEqual(1, startPort2.GetConnectedEdges().Count()); Assert.AreEqual(2, endPort.GetConnectedEdges().Count()); graphView.CommandDispatcher.Dispatch(new SelectElementsCommand(SelectElementsCommand.SelectionMode.Replace, endPort.GetConnectedEdges().First(), endPort.GetConnectedEdges().Skip(1).First())); helpers.DragTo(endPortUI.GetGlobalCenter() - new Vector3(k_EdgeSelectionOffset, 0, 0), endPort2UI.GetGlobalCenter()); // Allow one frame for the edge to be placed onto a layer yield return(null); // Allow one frame for the edge to be rendered and process its layout a first time yield return(null); Assert.AreEqual(1, startPort.GetConnectedEdges().Count()); Assert.AreEqual(1, startPort2.GetConnectedEdges().Count()); Assert.AreEqual(2, endPort2.GetConnectedEdges().Count()); }
public static float GetValue(this IPortModel self) { if (self == null) { return(0); } var node = self.GetConnectedEdges().FirstOrDefault()?.FromPort.NodeModel; switch (node) { case MathNode mathNode: return(mathNode.Evaluate()); case IVariableNodeModel varNode: return((float)varNode.VariableDeclarationModel.InitializationModel.ObjectValue); case IConstantNodeModel constNode: return((float)constNode.ObjectValue); case IEdgePortalExitModel portalModel: var oppositePortal = portalModel.GraphModel.FindReferencesInGraph <IEdgePortalEntryModel>(portalModel.DeclarationModel).FirstOrDefault(); if (oppositePortal != null) { return(oppositePortal.InputPort.GetValue()); } return(0); default: return((float)self.EmbeddedValue.ObjectValue); } }
/// <summary> /// Checks whether this port has any connection. /// </summary> /// <param name="self">The port.</param> /// <returns>True if there is at least one edge connected on this port.</returns> public static bool IsConnected(this IPortModel self) => self.GetConnectedEdges().Any();
protected void OnMouseMove(MouseMoveEvent evt) { // If the left mouse button is not down then return if (m_Edge == null) { return; } evt.StopPropagation(); bool alreadyDetached = (m_DetachedPort != null); // If one end of the edge is not already detached then if (!alreadyDetached) { float delta = (evt.mousePosition - m_PressPos).sqrMagnitude; if (delta < (s_StartDragDistance * s_StartDragDistance)) { return; } var view = m_Edge.View; var outputPortUI = m_Edge.Output.GetUI <Port>(view); var inputPortUI = m_Edge.Input.GetUI <Port>(view); if (outputPortUI == null || inputPortUI == null) { return; } // Determine which end is the nearest to the mouse position then detach it. Vector2 outputPos = new Vector2(outputPortUI.GetGlobalCenter().x, outputPortUI.GetGlobalCenter().y); Vector2 inputPos = new Vector2(inputPortUI.GetGlobalCenter().x, inputPortUI.GetGlobalCenter().y); float distanceFromOutput = (m_PressPos - outputPos).sqrMagnitude; float distanceFromInput = (m_PressPos - inputPos).sqrMagnitude; if (distanceFromInput > 50 * 50 && distanceFromOutput > 50 * 50) { return; } m_DetachedFromInputPort = distanceFromInput < distanceFromOutput; IPortModel connectedPort; Port connectedPortUI; if (m_DetachedFromInputPort) { connectedPort = m_Edge.Output; connectedPortUI = outputPortUI; m_DetachedPort = m_Edge.Input; } else { connectedPort = m_Edge.Input; connectedPortUI = inputPortUI; m_DetachedPort = m_Edge.Output; } // Use the edge drag helper of the still connected port m_ConnectedEdgeDragHelper = connectedPortUI.EdgeConnector.edgeDragHelper; m_ConnectedEdgeDragHelper.originalEdge = m_Edge; m_ConnectedEdgeDragHelper.draggedPort = connectedPort; m_ConnectedEdgeDragHelper.CreateEdgeCandidate(connectedPort.GraphModel); m_ConnectedEdgeDragHelper.edgeCandidateModel.EndPoint = evt.mousePosition; // Redirect the last mouse down event to active the drag helper if (m_ConnectedEdgeDragHelper.HandleMouseDown(m_LastMouseDownEvent)) { m_Active = true; if (m_DetachedPort.GetConnectedEdges().Count() > 1) { m_AdditionalEdgeDragHelpers = new List <EdgeDragHelper>(); foreach (var edge in m_DetachedPort.GetConnectedEdges()) { var edgeUI = edge.GetUI <Edge>(view); if (edgeUI != null && edgeUI != m_Edge && edgeUI.IsSelected()) { var otherPort = m_DetachedPort == edge.ToPort ? edge.FromPort : edge.ToPort; var edgeDragHelper = otherPort.GetUI <Port>(view)?.EdgeConnector.edgeDragHelper; if (edgeDragHelper != null) { edgeDragHelper.originalEdge = edgeUI; edgeDragHelper.draggedPort = otherPort; edgeDragHelper.CreateEdgeCandidate(connectedPort.GraphModel); edgeDragHelper.edgeCandidateModel.EndPoint = evt.mousePosition; m_AdditionalEdgeDragHelpers.Add(edgeDragHelper); } } } foreach (var edgeDrag in m_AdditionalEdgeDragHelpers) { edgeDrag.HandleMouseDown(m_LastMouseDownEvent); } } } else { Reset(); } m_LastMouseDownEvent = null; } if (m_Active) { m_ConnectedEdgeDragHelper.HandleMouseMove(evt); if (m_AdditionalEdgeDragHelpers != null) { foreach (var dragHelper in m_AdditionalEdgeDragHelpers) { dragHelper.HandleMouseMove(evt); } } } }