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(); } }
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(); } }