static State MergeStack(State previousState, MergeStackAction action) { VSGraphModel graphModel = (VSGraphModel)previousState.CurrentGraphModel; var stackModelA = (StackBaseModel)action.StackModelA; var stackModelB = (StackBaseModel)action.StackModelB; Undo.RegisterCompleteObjectUndo((Object)graphModel.AssetModel, "Move stacked nodes"); // Move all nodes from stackB to stackA stackModelA.MoveStackedNodes(stackModelB.NodeModels.ToList(), -1, false); // Move output connections of stackB to stackA var previousEdgeConnections = graphModel.GetEdgesConnections(stackModelB.OutputPorts.First()).ToList(); foreach (var edge in previousEdgeConnections) { graphModel.CreateEdge(edge.InputPortModel, stackModelA.OutputPorts.First()); } // Delete stackB graphModel.DeleteNode(stackModelB, GraphModel.DeleteConnections.True); previousState.MarkForUpdate(UpdateFlags.GraphTopology); return(previousState); }
static State SplitStack(State previousState, SplitStackAction action) { VSGraphModel graphModel = (VSGraphModel)previousState.CurrentGraphModel; Undo.RegisterCompleteObjectUndo((Object)graphModel.AssetModel, "Move stacked nodes"); if (action.SplitIndex > 0 && action.SplitIndex < action.StackModel.NodeModels.Count()) { // Get the list of nodes to move to another stack. var nodeModels = action.StackModel.NodeModels.Skip(action.SplitIndex).ToList(); if (nodeModels.Any()) { // Get old stack (stack A) var stackA = action.StackModel; // Create new stack (stack B). var stackB = graphModel.CreateStack(((NodeModel)stackA).Title + "_split", stackA.Position + Vector2.up * 300); // Move the list of nodes to this new stack. stackB.MoveStackedNodes(nodeModels, 0); // if the stack had a condition node or anything providing the actual port models, we need to move // the nodes BEFORE fetching the port models, as stack.portModels will actually return the condition // port models var stackAOutputPortModel = stackA.OutputPorts.First(); var stackBInputPortModel = stackB.InputPorts.First(); var stackBOutputPortModel = stackB.OutputPorts.First(); // Connect the edges that were connected to the old stack to the new one. var previousEdgeConnections = graphModel.GetEdgesConnections(stackAOutputPortModel).ToList(); foreach (var edge in previousEdgeConnections) { graphModel.CreateEdge(edge.InputPortModel, stackBOutputPortModel); graphModel.DeleteEdge(edge); } // Connect the new stack with the old one. IEdgeModel newEdge = graphModel.CreateEdge(stackBInputPortModel, stackAOutputPortModel); graphModel.LastChanges.ChangedElements.Add(stackA); graphModel.LastChanges.ModelsToAutoAlign.Add(newEdge); } } return(previousState); }