void GetChangesFromChangelist(IGraphChangeList graphChanges, IReadOnlyCollection <IGraphElementModel> existingElementModels) { foreach (IGraphElementModel model in graphChanges.ChangedElements) { if (model is IEdgeModel edgeModel) { if (graphChanges.DeleteEdgeModels.Contains(edgeModel)) { m_EdgesToDelete.Add(edgeModel); } else { m_EdgesToRebuild.Add(edgeModel); } } else if (model is INodeModel nodeModel) { m_NodesToRebuild.Add(nodeModel); if (nodeModel is IVariableModel variableModel && variableModel.DeclarationModel == null) { // In particular, ThisNodeModel sometimes requires an update of the blackboard BlackboardChanged = true; } } else if (model is IVariableDeclarationModel decl) { if (decl.Owner is IFunctionModel functionModel) { m_NodesToRebuild.Add(functionModel); var refFuncCalls = existingElementModels.OfType <FunctionRefCallNodeModel>().Where(f => functionModel == (IFunctionModel)f.Function); m_NodesToRebuild.AddRange(refFuncCalls); } else if (decl.Owner is IGraphModel) { BlackboardChanged = true; } } else if (model is IStickyNoteModel) { m_OtherElementsToRebuild.Add(model); } else if (model is IPlacematModel) { m_OtherElementsToRebuild.Add(model); } else { Debug.LogWarning($"Unexpected model to rebuild: {model.GetType().Name}, make sure it is correctly supported by UI Partial Rebuild."); m_OtherElementsToRebuild.Add(model); } } }
static State RenameComponentQuery(State previousState, RenameComponentQueryAction action) { var vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel; string uniqueName = vsGraphModel.GetUniqueName(action.Name); action.ComponentQueryDeclarationModel.SetName(uniqueName); IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges; graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(action.ComponentQueryDeclarationModel)); previousState.MarkForUpdate(UpdateFlags.RequestRebuild); return(previousState); }
static State RenameElement(State previousState, RenameElementAction action) { var graphModel = (VSGraphModel)previousState.CurrentGraphModel; if (string.IsNullOrWhiteSpace(action.Name)) { return(previousState); } Undo.RegisterCompleteObjectUndo((Object)graphModel.AssetModel, "Rename"); action.RenamableModel.Rename(action.Name); EditorUtility.SetDirty((Object)graphModel.AssetModel); IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges; VSGraphModel vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel; if (action.RenamableModel is VariableDeclarationModel variableDeclarationModel) { graphChangeList.BlackBoardChanged = true; // update usage names graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <VariableNodeModel>(variableDeclarationModel)); } else if (action.RenamableModel is IVariableModel variableModel) { graphChangeList.BlackBoardChanged = true; variableDeclarationModel = variableModel.DeclarationModel as VariableDeclarationModel; graphChangeList.ChangedElements.Add(variableDeclarationModel); graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <VariableNodeModel>(variableDeclarationModel)); } else if (action.RenamableModel is IEdgePortalModel edgePortalModel) { variableDeclarationModel = edgePortalModel.DeclarationModel as VariableDeclarationModel; graphChangeList.ChangedElements.Add(variableDeclarationModel); graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages <EdgePortalModel>(variableDeclarationModel)); } else { graphChangeList.ChangedElements.Add(action.RenamableModel as IGraphElementModel); } previousState.MarkForUpdate(UpdateFlags.RequestCompilation | UpdateFlags.RequestRebuild); return(previousState); }
public void ComputeChanges(IGraphChangeList graphChangeList, Dictionary <IGraphElementModel, GraphElement> existingElements) { BlackboardChanged = graphChangeList.BlackBoardChanged; GetChangesFromChangelist(graphChangeList, existingElements.Keys); GatherDeletedElements(existingElements, graphChangeList); UpdateEdgesAndNodesForStacks(existingElements); UpdateEdgesToRebuildFromNodesToRebuild(); RemoveDeletedModelsFromRebuildLists(existingElements); MarkEdgesToBeRebuiltToDelete(existingElements); }
static State UpdateFunctionReturnType(State previousState, UpdateFunctionReturnTypeAction action) { Undo.RegisterCompleteObjectUndo((Object)previousState.AssetModel, "Update Function Return Type"); ((FunctionModel)action.FunctionModel).ReturnType = action.NewType; IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges; graphChangeList.ChangedElements.Add(action.FunctionModel); graphChangeList.ChangedElements.AddRange(((FunctionModel)action.FunctionModel).FindFunctionUsages(previousState.CurrentGraphModel)); // Not pretty but efficient. Needed to add/remove/update the return value port of the node according to the function type foreach (var returnNodeModel in ((VSGraphModel)action.FunctionModel.GraphModel).GetAllNodes().OfType <ReturnNodeModel>()) { returnNodeModel.DefineNode(); } return(previousState); }
static State RenameElement(State previousState, RenameElementAction action) { if (string.IsNullOrWhiteSpace(action.Name)) { return(previousState); } Undo.RegisterCompleteObjectUndo((Object)action.RenamableModel.AssetModel, "Renaming graph element"); action.RenamableModel.Rename(action.Name); IGraphChangeList graphChangeList = previousState.CurrentGraphModel.LastChanges; VSGraphModel vsGraphModel = (VSGraphModel)previousState.CurrentGraphModel; if (action.RenamableModel is IFunctionModel functionDefinitionModel) { RenameFunctionUsages((FunctionModel)functionDefinitionModel); } else if (action.RenamableModel is VariableDeclarationModel variableDeclarationModel) { graphChangeList.BlackBoardChanged = true; if (variableDeclarationModel.Owner is IFunctionModel functionModel) { RenameFunctionUsages((FunctionModel)functionModel); } // update usage names graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(variableDeclarationModel)); } else if (action.RenamableModel is IVariableModel variableModel) { graphChangeList.BlackBoardChanged = true; variableDeclarationModel = variableModel.DeclarationModel as VariableDeclarationModel; graphChangeList.ChangedElements.Add(variableDeclarationModel); graphChangeList.ChangedElements.AddRange(vsGraphModel.FindUsages(variableDeclarationModel)); if (variableDeclarationModel.FunctionModel != null) { graphChangeList.ChangedElements.Add(variableDeclarationModel.FunctionModel); } } else { graphChangeList.ChangedElements.Add(action.RenamableModel); } previousState.MarkForUpdate(UpdateFlags.RequestCompilation | UpdateFlags.RequestRebuild); return(previousState); void RenameFunctionUsages(FunctionModel functionModel) { var toUpdate = functionModel.FindFunctionUsages(previousState.CurrentGraphModel); graphChangeList.ChangedElements.AddRange(toUpdate); graphChangeList.ChangedElements.Add(functionModel); } }
void GatherDeletedElements(Dictionary <IGraphElementModel, GraphElement> existingElements, IGraphChangeList graphChangeList) { foreach (IGraphElementModel elementModel in existingElements.Keys) { if (elementModel is INodeModel node) { if (node.NodeAssetReference == null) { var graphElement = existingElements[node]; if (graphElement is Experimental.GraphView.Node) { m_EdgesToDelete.AddRange(node.GetConnectedEdges()); } m_GraphElementsToDelete.Add(graphElement); } } else if (elementModel is VariableDeclarationModel decl) { if (decl == null) { var graphElement = existingElements[elementModel]; if (decl.Owner is IFunctionModel functionModel) { var refFuncCalls = existingElements.Keys.OfType <FunctionRefCallNodeModel>().Where(f => functionModel == (IFunctionModel)f.Function); m_NodesToRebuild.AddRange(refFuncCalls); } m_GraphElementsToDelete.Add(graphElement); } } else if (elementModel is IStickyNoteModel) { var graphElement = existingElements[elementModel]; m_GraphElementsToDelete.Add(graphElement); } } foreach (IEdgeModel edge in graphChangeList.DeleteEdgeModels) { if (existingElements.TryGetValue(edge, out GraphElement edgeGraphElement)) { m_GraphElementsToDelete.Add(edgeGraphElement); } } }
internal void UpdateTopology() { Profiler.BeginSample("UpdateTopology"); Stopwatch topologyStopwatch = new Stopwatch(); topologyStopwatch.Start(); State state = m_Store.GetState(); IGraphModel currentGraphModel = state.CurrentGraphModel; if (currentGraphModel == null) { return; } IGraphChangeList graphChangeList = currentGraphModel.LastChanges; string dispatchedActionName = state.LastDispatchedActionName; // save this now, because some actions trigger a UIRefresh, hiding the original action (TODO) m_GraphView.DisablePersistedSelectionRestore(); bool fullUIRebuildOnChange = state.Preferences.GetBool(VSPreferences.BoolPref.FullUIRebuildOnChange); bool forceRebuildUI = fullUIRebuildOnChange || currentGraphModel != m_LastGraphModel || graphChangeList == null || !graphChangeList.HasAnyTopologyChange() || ModelsToNodeMapping == null; if (forceRebuildUI) // no specific graph changes passed, assume rebuild everything { RebuildAll(state); } else { PartialRebuild(state); } state.EditorDataModel.ClearElementsToSelectUponCreation(); MapModelsToNodes(); if (state.Preferences.GetBool(VSPreferences.BoolPref.ShowUnusedNodes)) { m_GraphView.PositionDependenciesManagers.UpdateNodeState(ModelsToNodeMapping); } m_GraphView.HighlightGraphElements(); m_LastGraphModel = currentGraphModel; m_GraphView.EnablePersistedSelectionRestore(); if (ElementToRename != null) { m_GraphView.ClearSelection(); m_GraphView.AddToSelection((GraphElement)ElementToRename); ElementToRename.Rename(forceRename: true); ElementToRename = null; state.EditorDataModel.ElementModelToRename = null; } m_GraphView.MarkDirtyRepaint(); topologyStopwatch.Stop(); Profiler.EndSample(); if (state.Preferences.GetBool(VSPreferences.BoolPref.WarnOnUIFullRebuild) && state.lastActionUIRebuildType == State.UIRebuildType.Full) { Debug.LogWarning($"Rebuilding the whole UI ({dispatchedActionName})"); } if (state.Preferences.GetBool(VSPreferences.BoolPref.LogUIBuildTime)) { Debug.Log($"UI Update ({dispatchedActionName}) took {topologyStopwatch.ElapsedMilliseconds} ms"); } }
void GatherDeletedElements(Dictionary <IGraphElementModel, GraphElement> existingElements, IGraphChangeList graphChangeList) { foreach (IGraphElementModel elementModel in existingElements.Keys) { if (elementModel is INodeModel node) { if (node.Destroyed) { var graphElement = existingElements[node]; if (graphElement is Unity.Modifier.GraphElements.CollapsiblePortNode) { m_EdgesToDelete.AddRange(node.GetConnectedEdges()); } m_GraphElementsToDelete.Add(graphElement); } } else if (elementModel is IStickyNoteModel stickyNote) { if (stickyNote.Destroyed) { var graphElement = existingElements[elementModel]; m_GraphElementsToDelete.Add(graphElement); } } else if (elementModel is IPlacematModel placemat) { if (placemat.Destroyed) { var graphElement = existingElements[elementModel]; m_GraphElementsToDelete.Add(graphElement); } } } foreach (IEdgeModel edge in graphChangeList.DeleteEdgeModels) { if (existingElements.TryGetValue(edge, out GraphElement edgeGraphElement)) { m_GraphElementsToDelete.Add(edgeGraphElement); } } }