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();
コード例 #4
0
        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);
                    }
                }
            }
        }