public void SetUp()
        {
            m_Window  = EditorWindow.GetWindowWithRect <VseWindow>(new Rect(Vector2.zero, new Vector2(800, 600)));
            m_Stencil = new ClassStencil();

            var AssetModel = ScriptableObject.CreateInstance <VSGraphAssetModel>();
            var graphModel = AssetModel.CreateGraph <VSGraphModel>("test", typeof(ClassStencil), false);

            var portModelMock = new Mock <IPortModel>();

            portModelMock.Setup(x => x.GraphModel).Returns(graphModel);
            portModelMock.Setup(x => x.PortType).Returns(PortType.Event);
            portModelMock.Setup(x => x.Direction).Returns(Direction.Input);
            portModelMock.Setup(x => x.Name).Returns("port");
            portModelMock.Setup(x => x.DataType).Returns(typeof(float).GenerateTypeHandle(m_Stencil));
            m_Port = Port.Create(portModelMock.Object, m_Window.Store, Orientation.Horizontal);

            VariableDeclarationModel intVariableModel = graphModel.CreateGraphVariableDeclaration(
                "int", typeof(int).GenerateTypeHandle(m_Stencil), false
                );
            VariableDeclarationModel stringVariableModel = graphModel.CreateGraphVariableDeclaration(
                "string", typeof(string).GenerateTypeHandle(m_Stencil), false
                );

            m_IntField    = new BlackboardVariableField(m_Window.Store, intVariableModel, m_Window.GraphView);
            m_StringField = new BlackboardVariableField(m_Window.Store, stringVariableModel, m_Window.GraphView);

            m_IntTokenModel = Activator.CreateInstance <VariableNodeModel>();
            m_IntTokenModel.DeclarationModel = intVariableModel;
            m_IntTokenModel.GraphModel       = graphModel;

            m_StringTokenModel = Activator.CreateInstance <VariableNodeModel>();
            m_StringTokenModel.DeclarationModel = stringVariableModel;
            m_StringTokenModel.GraphModel       = graphModel;
        }
Esempio n. 2
0
        public void RebuildSections(Blackboard blackboard)
        {
            m_Blackboard = blackboard;
            m_Store      = blackboard.Store;
            var currentGraphModel = (VSGraphModel)blackboard.Store.GetState().CurrentGraphModel;

            blackboard.ClearContents();

            if (blackboard.Sections != null && blackboard.Sections.Count > 1)
            {
                blackboard.Sections[k_GraphDeclarationsSection].title     = k_GraphDeclarationsSectionTitle;
                blackboard.Sections[k_InputPortDeclarationsSection].title = k_InputPortDeclarationsSectionTitle;
            }

            foreach (VariableDeclarationModel declaration in currentGraphModel.VariableDeclarations)
            {
                var blackboardField = new BlackboardVariableField(blackboard.Store, declaration, blackboard.GraphView);
                var blackboardVariablePropertyView = new DotsVariablePropertyView(blackboard.Store, declaration, blackboard.Rebuild, m_Stencil);
                if (declaration.DataType != TypeHandle.ExecutionFlow)
                {
                    blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithLocalInputOutputToggle().WithTypeSelector();
                    if (declaration.IsGraphVariable())
                    {
                        blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithInitializationField();
                    }
                }
                blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithTooltipField();
                var blackboardRow = new BlackboardRow(
                    blackboardField,
                    blackboardVariablePropertyView)
                {
                    userData = declaration,
                    expanded = true, // TODO not pretty
                };
                if (blackboard.Sections != null)
                {
                    if (declaration.IsInputOrOutputTrigger())
                    {
                        blackboard.Sections[k_InputPortDeclarationsSection].Add(blackboardRow);
                    }
                    else
                    {
                        blackboard.Sections[k_GraphDeclarationsSection].Add(blackboardRow);
                    }
                }
                blackboard.GraphVariables.Add(blackboardField);
            }
        }
        public void RebuildSections(Blackboard blackboard)
        {
            m_Blackboard = blackboard;

            blackboard.styleSheets.Add(k_BlackboardStyleSheet);
            // @TODO: This might need to be reviewed in favor of a better / more scalable approach (non preprocessor based)
            // that would ideally bring the same level of backward/forward compatibility and/or removed when a 2013 beta version lands.
#if UNITY_2019_3_OR_NEWER
            blackboard.styleSheets.Add(AssetDatabase.LoadAssetAtPath <StyleSheet>(UICreationHelper.TemplatePath + "BlackboardECS.2019.3.uss"));
#endif

            // Fetch expanded states as well as active component query toggles (note that this doesn't not apply to
            // elements that do not survive a domain reload)
            var expandedRows = new Dictionary <object, bool>();

            foreach (BlackboardSection blackBoardSection in blackboard.Sections)
            {
                blackBoardSection.Query <ExpandableRow>().ForEach(row =>
                {
                    switch (row.userData)
                    {
                    case IVariableDeclarationModel model:
                        {
                            var queryDeclarationModel = model as ComponentQueryDeclarationModel;
                            bool expanded             = row.Expanded;
                            if (!expanded && queryDeclarationModel != null)
                            {
                                expanded = queryDeclarationModel.ExpandOnCreateUI;
                            }
                            expandedRows[model] = expanded;
                            break;
                        }

                    case string str:
                        expandedRows[str] = row.Expanded;
                        break;
                    }
                });

                blackBoardSection.Query <BlackboardRow>().ForEach(row =>
                {
                    switch (row.userData)
                    {
                    case IVariableDeclarationModel model:
                        expandedRows[model] = row.expanded;
                        break;

                    case Tuple <IVariableDeclarationModel, bool> modelTuple:
                        expandedRows[modelTuple.Item1] = row.expanded;
                        break;
                    }
                });
            }

            List <ISelectable> selectionCopy = blackboard.selection.ToList();

            // TODO: This is too hardcore.  We need to let all unrolling happen smoothly.
            blackboard.ClearContents();

            var state          = blackboard.Store.GetState();
            var graphVariables = ((IVSGraphModel)state.CurrentGraphModel).GraphVariableModels.ToList();

            // Fill component queries section
            var componentQueryDeclarationModels = graphVariables.OfType <ComponentQueryDeclarationModel>().ToList();
            var nbModels = componentQueryDeclarationModels.Count;
            if (nbModels > 0)
            {
                blackboard.Sections[k_ComponentQueriesSection]
                .Add(new ComponentQueriesRow(componentQueryDeclarationModels,
                                             blackboard,
                                             m_Stencil,
                                             blackboard.Rebuild));
                blackboard.Sections[k_ComponentQueriesSection].title = $"{k_ComponentQueriesSectionTitle} ({nbModels})";
            }

            // Fill variables section
            var variables = graphVariables.Where(v => !(v is ComponentQueryDeclarationModel)).ToList();
            blackboard.Sections[k_VariablesSection].title = $"{k_VariableSectionTitle} ({variables.Count})";

            foreach (var variable in variables)
            {
                var blackboardField = new BlackboardVariableField(blackboard.Store, variable, blackboard.GraphView);
                var blackboardRow   = new BlackboardRow(
                    blackboardField,
                    CreateExtendedFieldView(blackboard.Store, variable, m_Stencil, blackboard.Rebuild))
                {
                    userData = variable,
                    expanded = expandedRows.TryGetValue(variable, out var isExpended) && isExpended
                };

                blackboard.Sections[k_VariablesSection].Add(blackboardRow);
                blackboard.GraphVariables.Add(blackboardField);
                blackboard.RestoreSelectionForElement(blackboardField);
            }

            // Fill local scope section
            foreach (Tuple <IVariableDeclarationModel, bool> variableDeclarationModelTuple in blackboard.GraphView.UIController
                     .GetAllVariableDeclarationsFromSelection(selectionCopy))
            {
                var blackboardField = new BlackboardVariableField(blackboard.Store, variableDeclarationModelTuple.Item1, blackboard.GraphView);

                if (variableDeclarationModelTuple.Item1.VariableType == VariableType.FunctionParameter)
                {
                    blackboardField.AddToClassList("parameter");
                }

                if (variableDeclarationModelTuple.Item2)
                {
                    var blackboardRow = new BlackboardRow(blackboardField,
                                                          CreateExtendedFieldView(blackboard.Store,
                                                                                  variableDeclarationModelTuple.Item1,
                                                                                  m_Stencil,
                                                                                  blackboard.Rebuild))
                    {
                        userData = variableDeclarationModelTuple
                    };
                    blackboard.Sections[k_CurrentScopeSection].Add(blackboardRow);
                }
                else
                {
                    blackboardField.AddToClassList("readonly");
                    blackboard.Sections[k_CurrentScopeSection].Add(blackboardField);
                }

                blackboard.GraphVariables.Add(blackboardField);
                blackboard.RestoreSelectionForElement(blackboardField);
            }

            // Apply expanded states for (weak) elements that could not survive a domain reload
            bool expandedValue;
            foreach (BlackboardSection blackBoardSection in blackboard.Sections)
            {
                blackBoardSection.Query <ExpandableRow>().ForEach(row =>
                {
                    var model = row.userData is IVariableDeclarationModel data ? data : null;
                    if (model != null && expandedRows.TryGetValue(model, out expandedValue))
                    {
                        row.Expanded = expandedValue;
                    }
                    else if (row.userData is string str && expandedRows.TryGetValue(str, out expandedValue))
                    {
                        row.Expanded = expandedValue;
                    }
                });

                blackBoardSection.Query <BlackboardRow>().ForEach(row =>
                {
                    if (row.userData is IVariableDeclarationModel model && expandedRows.TryGetValue(model, out expandedValue))
                    {
                        row.expanded = expandedValue;
                    }
        public void RebuildSections(Blackboard blackboard)
        {
            Dictionary <IVariableDeclarationModel, bool> expandedState = new Dictionary <IVariableDeclarationModel, bool>();

            foreach (var blackboardSection in blackboard.Sections)
            {
                var rows = blackboardSection.Query <BlackboardRow>().ToList();
                foreach (var row in rows)
                {
                    var field = row.Q <BlackboardVariableField>();
                    expandedState[field.VariableDeclarationModel] = row.expanded;
                }
            }

            m_Blackboard = blackboard;
            m_Store      = blackboard.Store;
            var currentGraphModel = (VSGraphModel)blackboard.Store.GetState().CurrentGraphModel;

            blackboard.ClearContents();

            if (blackboard.Sections != null && blackboard.Sections.Count > 1)
            {
                blackboard.Sections[k_GraphDeclarationsSection].title     = k_GraphDeclarationsSectionTitle;
                blackboard.Sections[k_InputPortDeclarationsSection].title = k_InputPortDeclarationsSectionTitle;
            }

            foreach (VariableDeclarationModel declaration in currentGraphModel.VariableDeclarations)
            {
                var blackboardField = new BlackboardVariableField(blackboard.Store, declaration, blackboard.GraphView);
                var blackboardVariablePropertyView = new DotsVariablePropertyView(blackboard.Store, declaration, blackboard.Rebuild, m_Stencil);
                if (declaration.DataType != TypeHandle.ExecutionFlow)
                {
                    blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithLocalInputOutputToggle().WithTypeSelector(new SearcherFilter(SearcherContext.Type).WithValueTypes());
                    blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithInitializationField();
                }
                blackboardVariablePropertyView = (DotsVariablePropertyView)blackboardVariablePropertyView.WithTooltipField();

                bool expanded;
                if (!expandedState.TryGetValue(declaration, out expanded))
                {
                    expanded = true;
                }

                var blackboardRow = new BlackboardRow(
                    blackboardField,
                    blackboardVariablePropertyView)
                {
                    Model    = declaration,
                    expanded = expanded
                };
                if (blackboard.Sections != null)
                {
                    if (declaration.IsInputOrOutputTrigger())
                    {
                        blackboard.Sections[k_InputPortDeclarationsSection].Add(blackboardRow);
                    }
                    else
                    {
                        blackboard.Sections[k_GraphDeclarationsSection].Add(blackboardRow);
                    }
                }
                blackboard.GraphVariables.Add(blackboardField);
            }
        }