Esempio n. 1
0
        public INodeModel CreateStackedNode(Type nodeTypeToCreate, string nodeName = "", int index = -1, SpawnFlags spawnFlags = SpawnFlags.Default, Action <NodeModel> preDefineSetup = null, GUID?guid = null)
        {
            SpawnFlags createNodeFlags = (spawnFlags & SpawnFlags.CreateNodeAsset) | SpawnFlags.Orphan; // we don't want to CreateNode to add the node to the graph nor to register undo
            var        graphModel      = (GraphModel)GraphModel;
            NodeModel  nodeModel       = (NodeModel)graphModel.CreateNodeInternal(nodeTypeToCreate, nodeName, Vector2.zero, createNodeFlags, preDefineSetup, guid);

            graphModel.RegisterNodeGuid(nodeModel);
            if (!spawnFlags.IsOrphan())
            {
                if (spawnFlags.IsUndoable())
                {
                    Undo.RegisterCreatedObjectUndo(nodeModel.NodeAssetReference, "Create Node");
                    Undo.RegisterCompleteObjectUndo(NodeAssetReference, "Add Node");
                    AddStackedNode(nodeModel, index);
                    EditorUtility.SetDirty(NodeAssetReference);
                }
                else
                {
                    AddStackedNode(nodeModel, index);
                }
            }
            nodeModel.DefineNode();

            return(nodeModel);
        }
Esempio n. 2
0
        public INodeModel CreateStackedNode(Type nodeTypeToCreate, string nodeName = "", int index = -1, SpawnFlags spawnFlags = SpawnFlags.Default, Action <NodeModel> preDefineSetup = null)
        {
            if (nodeTypeToCreate == null)
            {
                throw new InvalidOperationException("Cannot create node with a null type");
            }
            NodeModel nodeModel;

            if (spawnFlags.IsSerializable())
            {
                nodeModel = (NodeModel)SpawnNodeAsset(nodeTypeToCreate).Model;
            }
            else
            {
                nodeModel = (NodeModel)Activator.CreateInstance(nodeTypeToCreate);
            }

            nodeModel.Title            = nodeName ?? nodeTypeToCreate.Name;
            nodeModel.Position         = Vector2.zero;
            nodeModel.GraphModel       = GraphModel;
            nodeModel.ParentStackModel = this;
            preDefineSetup?.Invoke(nodeModel);
            nodeModel.DefineNode();
            if (!spawnFlags.IsOrphan())
            {
                if (spawnFlags.IsUndoable())
                {
                    Undo.RegisterCreatedObjectUndo(nodeModel.NodeAssetReference, "Create Node");
                    AddStackedNode(nodeModel, index);
                }
                else
                {
                    AddStackedNodeNoUndo(nodeModel, index);
                }
            }

            return(nodeModel);

            AbstractNodeAsset SpawnNodeAsset(Type typeToSpawn)
            {
                var genericNodeAssetType = typeof(NodeAsset <>).MakeGenericType(typeToSpawn);
                var derivedTypes         = TypeCache.GetTypesDerivedFrom(genericNodeAssetType);

                if (derivedTypes.Count == 0)
                {
                    throw new InvalidOperationException($"No NodeAssets of type NodeAsset<{typeToSpawn.Name}>");
                }
                Assert.AreEqual(derivedTypes.Count, 1,
                                $"Multiple NodeAssets of type NodeAsset<{typeToSpawn.Name}> have been found");

                return(ScriptableObject.CreateInstance(derivedTypes[0]) as AbstractNodeAsset);
            }
        }
Esempio n. 3
0
#pragma warning restore CS0649
#pragma warning restore CS0414

        void CreateNodesAndValidateGraphModel(GraphNodeModelSearcherItem item, SpawnFlags mode,
                                              Action <List <INodeModel> > assertNodesCreation)
        {
            var initialNodes = GraphModel.NodeModels.ToList();
            var initialEdges = GraphModel.EdgeModels.ToList();

            item.CreateElements.Invoke(new GraphNodeCreationData(GraphModel, Vector2.zero, mode));

            // If nodes are created as Orphan, graphModel should not be modified
            if (mode.IsOrphan())
            {
                CollectionAssert.AreEqual(initialNodes, GraphModel.NodeModels);
                CollectionAssert.AreEqual(initialEdges, GraphModel.EdgeModels);
                return;
            }

            assertNodesCreation.Invoke(initialNodes);
        }
Esempio n. 4
0
        void CreateNodesAndValidateStackModel(StackNodeModelSearcherItem item, SpawnFlags mode,
                                              Action <List <INodeModel>, IStackModel> assertNodesCreation)
        {
            var stack             = GraphModel.CreateStack("stack", Vector2.zero);
            var initialGraphNodes = GraphModel.NodeModels.ToList();

            item.CreateElements.Invoke(new StackNodeCreationData(stack, -1, spawnFlags: mode));

            // If nodes are created as Orphan, graphModel and stackModel should not be modified
            if (mode.IsOrphan())
            {
                Assert.AreEqual(stack.NodeModels.Count(), 0);
                CollectionAssert.AreEqual(initialGraphNodes, GraphModel.NodeModels);
                return;
            }

            assertNodesCreation.Invoke(initialGraphNodes, stack);
        }