void SFindInBT::MatchTokens(const TArray<FString>& Tokens) { RootSearchResult.Reset(); TWeakPtr<SGraphEditor> FocusedGraphEditor = BehaviorTreeEditorPtr.Pin()->GetFocusedGraphPtr(); UEdGraph* Graph = NULL; if (FocusedGraphEditor.IsValid()) { Graph = FocusedGraphEditor.Pin()->GetCurrentGraph(); } if (Graph == NULL) { return; } RootSearchResult = FSearchResult(new FFindInBTResult(FString("BehaviorTreeRoot"))); for (auto It(Graph->Nodes.CreateConstIterator()); It; ++It) { UEdGraphNode* Node = *It; const FString NodeName = Node->GetNodeTitle(ENodeTitleType::ListView).ToString(); FSearchResult NodeResult(new FFindInBTResult(NodeName, RootSearchResult, Node)); FString NodeSearchString = NodeName + Node->GetClass()->GetName() + Node->NodeComment; NodeSearchString = NodeSearchString.Replace(TEXT(" "), TEXT("")); bool bNodeMatchesSearch = StringMatchesSearchTokens(Tokens, NodeSearchString); UBehaviorTreeGraphNode* BTNode = Cast<UBehaviorTreeGraphNode>(Node); if (BTNode) { // searching through nodes' decorators for (auto DecoratorIt(BTNode->Decorators.CreateConstIterator()); DecoratorIt; ++DecoratorIt) { UBehaviorTreeGraphNode* Decorator = *DecoratorIt; MatchTokensInChild(Tokens, Decorator, NodeResult); } // searching through nodes' services for (auto ServiceIt(BTNode->Services.CreateConstIterator()); ServiceIt; ++ServiceIt) { UBehaviorTreeGraphNode* Service = *ServiceIt; MatchTokensInChild(Tokens, Service, NodeResult); } } if ((NodeResult->Children.Num() > 0) || bNodeMatchesSearch) { NodeResult->SetNodeHighlight(true); ItemsFound.Add(NodeResult); } } }
void UEdGraphNode::AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector) { UEdGraphNode* This = CastChecked<UEdGraphNode>(InThis); // Only register the pool once per GC pass if (This->HasAnyFlags(RF_ClassDefaultObject)) { if (This->GetClass() == UEdGraphNode::StaticClass()) { for (int32 Index = 0; Index < PooledPins.Num(); ++Index) { Collector.AddReferencedObject(PooledPins[Index], This); } } } Super::AddReferencedObjects(This, Collector); }
// Called by the EditableText widget when the user types a new comment for the selected node static void OnNodeCommentTextCommitted(const FText& NewText, ETextCommit::Type /*CommitInfo*/, TWeakObjectPtr<UEdGraphNode> NodeWeakPtr) { // Apply the change to the selected actor UEdGraphNode* SelectedNode = NodeWeakPtr.Get(); FString NewString = NewText.ToString(); if (SelectedNode && !SelectedNode->NodeComment.Equals( NewString, ESearchCase::CaseSensitive )) { // send property changed events const FScopedTransaction Transaction( LOCTEXT("EditNodeComment", "Change Node Comment") ); SelectedNode->Modify(); UProperty* NodeCommentProperty = FindField<UProperty>(SelectedNode->GetClass(), "NodeComment"); if(NodeCommentProperty != NULL) { SelectedNode->PreEditChange(NodeCommentProperty); SelectedNode->NodeComment = NewString; FPropertyChangedEvent NodeCommentPropertyChangedEvent(NodeCommentProperty); SelectedNode->PostEditChangeProperty(NodeCommentPropertyChangedEvent); } } FSlateApplication::Get().DismissAllMenus(); }
void UK2Node_Composite::PostPasteNode() { Super::PostPasteNode(); //@TODO: Should verify that each node in the composite can be pasted into this new graph successfully (CanPasteHere) if (BoundGraph != NULL) { UEdGraph* ParentGraph = CastChecked<UEdGraph>(GetOuter()); ensure(BoundGraph != ParentGraph); // Update the InputSinkNode / OutputSourceNode pointers to point to the new graph TSet<UEdGraphNode*> BoundaryNodes; for (int32 NodeIndex = 0; NodeIndex < BoundGraph->Nodes.Num(); ++NodeIndex) { UEdGraphNode* Node = BoundGraph->Nodes[NodeIndex]; //Remove this node if it should not exist more then one in blueprint if(UK2Node_Event* Event = Cast<UK2Node_Event>(Node)) { UBlueprint* BP = FBlueprintEditorUtils::FindBlueprintForGraphChecked(BoundGraph); if(FBlueprintEditorUtils::FindOverrideForFunction(BP, Event->EventReference.GetMemberParentClass(Event->GetBlueprintClassFromNode()), Event->EventReference.GetMemberName())) { FBlueprintEditorUtils::RemoveNode(BP, Node, true); NodeIndex--; continue; } } BoundaryNodes.Add(Node); if (Node->GetClass() == UK2Node_Tunnel::StaticClass()) { // Exactly a tunnel node, should be the entrance or exit node UK2Node_Tunnel* Tunnel = CastChecked<UK2Node_Tunnel>(Node); if (Tunnel->bCanHaveInputs && !Tunnel->bCanHaveOutputs) { OutputSourceNode = Tunnel; Tunnel->InputSinkNode = this; } else if (Tunnel->bCanHaveOutputs && !Tunnel->bCanHaveInputs) { InputSinkNode = Tunnel; Tunnel->OutputSourceNode = this; } else { ensureMsgf(false, *LOCTEXT("UnexpectedTunnelNode", "Unexpected tunnel node '%s' in cloned graph '%s' (both I/O or neither)").ToString(), *Tunnel->GetName(), *GetName()); } } } RenameBoundGraphCloseToName(BoundGraph->GetName()); ensure(BoundGraph->SubGraphs.Find(ParentGraph) == INDEX_NONE); //Nested composites will already be in the SubGraph array if(ParentGraph->SubGraphs.Find(BoundGraph) == INDEX_NONE) { ParentGraph->SubGraphs.Add(BoundGraph); } FEdGraphUtilities::PostProcessPastedNodes(BoundaryNodes); } }