public override void OnInspectorGUI()
        {
            VSGraphModel graph = (VSGraphModel)target;

            EditorGUILayout.LabelField("Stencil Properties");

            EditorGUI.indentLevel++;

            EditorGUI.BeginChangeCheck();

            var stencilObject = new SerializedObject(graph.Stencil);

            foreach (var propertyName in graph.Stencil.PropertiesVisibleInGraphInspector())
            {
                EditorGUILayout.PropertyField(stencilObject.FindProperty(propertyName));
            }
            stencilObject.ApplyModifiedProperties();

            EditorGUI.indentLevel--;

            if (EditorGUI.EndChangeCheck())
            {
                graph.Stencil.RecompilationRequested = true;
            }

            if (graph.Stencil is IHasOrderedStacks)
            {
                if (m_ReorderableList == null)
                {
                    m_ReorderableList = new ReorderableList(null, typeof(IOrderedStack))
                    {
                        displayAdd          = false,
                        displayRemove       = false,
                        drawHeaderCallback  = rect => GUI.Label(rect, "Execution Order"),
                        drawElementCallback = (rect, index, active, focused) =>
                        {
                            var orderedStack = (IOrderedStack)m_ReorderableList.list[index];
                            GUI.Label(rect, orderedStack.Title);
                        },
                        onReorderCallbackWithDetails = (list, oldIndex, newIndex) =>
                        {
                            for (int i = 0; i < m_ReorderableList.list.Count; i++)
                            {
                                var orderedStack = (IOrderedStack)m_ReorderableList.list[i];
                                orderedStack.Order = i;
                            }

                            graph.Stencil.RecompilationRequested = true;
                        }
                    }
                }
                ;
                m_ReorderableList.list = RoslynTranslator.GetEntryPointStacks(graph).OfType <IOrderedStack>().OrderBy(x => x.Order).ToList();
                m_ReorderableList.DoLayoutList();
            }

            base.OnInspectorGUI();
        }
    }
Beispiel #2
0
        public void VisitGraph(VSGraphModel vsGraphModel)
        {
            HashSet <IStackModel> visitedStacks = new HashSet <IStackModel>();
            HashSet <INodeModel>  visitedNodes  = new HashSet <INodeModel>();

            foreach (var rootStack in RoslynTranslator.GetEntryPointStacks(vsGraphModel))
            {
                VisitStack(rootStack, visitedStacks, visitedNodes);
            }

            // floating stacks
            foreach (var stack in vsGraphModel.StackModels)
            {
                if (visitedStacks.Contains(stack))
                {
                    continue;
                }

                VisitStack(stack, visitedStacks, visitedNodes);
            }

            // floating nodes
            foreach (var node in vsGraphModel.NodeModels)
            {
                if (node == null || node is IStackModel || visitedNodes.Contains(node))
                {
                    continue;
                }

                VisitNode(node, visitedNodes);
            }

            foreach (var variableDeclaration in vsGraphModel.GraphVariableModels)
            {
                VisitVariableDeclaration(variableDeclaration);
            }

            foreach (var edgeModel in vsGraphModel.EdgeModels)
            {
                VisitEdge(edgeModel);
            }
        }
        public void UpdateNodeState(Dictionary <IGraphElementModel, GraphElement> modelsToNodeMapping)
        {
            void ProcessDependency(INodeModel nodeModel, ModelState state)
            {
                if (nodeModel.State == ModelState.Disabled)
                {
                    state = ModelState.Disabled;
                }
                if (modelsToNodeMapping.TryGetValue(nodeModel, out var nodeUI) &&
                    nodeUI is INodeState nodeState &&
                    state == ModelState.Enabled)
                {
                    nodeState.UIState = NodeUIState.Enabled;
                }

                if (!m_DependenciesByNode.TryGetValue(nodeModel, out var dependencies))
                {
                    return;
                }
                foreach (var dependency in dependencies)
                {
                    ProcessDependency(dependency.Value.DependentNode, state);
                }
            }

            foreach (var node in modelsToNodeMapping.Values.OfType <INodeState>())
            {
                node.UIState = node.GraphElementModel is INodeModel nodeModel && nodeModel.State == ModelState.Disabled ? NodeUIState.Disabled : NodeUIState.Unused;
            }

            foreach (var root in RoslynTranslator.GetEntryPointStacks((VSGraphModel)this.m_VseGraphView.store.GetState().CurrentGraphModel))
            {
                ProcessDependency(root, ModelState.Enabled);
            }

            foreach (var node in modelsToNodeMapping.Values.OfType <INodeState>())
            {
                node.ApplyNodeState();
            }
        }