void FNiagaraEditor::DeleteSelectedDuplicatableNodes() { TSharedPtr<SGraphEditor> CurrentGraphEditor = NodeGraphEditorPtr.Pin(); if (!CurrentGraphEditor.IsValid()) { return; } const FGraphPanelSelectionSet OldSelectedNodes = CurrentGraphEditor->GetSelectedNodes(); CurrentGraphEditor->ClearSelectionSet(); for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter) { UEdGraphNode* Node = Cast<UEdGraphNode>(*SelectedIter); if (Node && Node->CanDuplicateNode()) { CurrentGraphEditor->SetNodeSelection(Node, true); } } // Delete the duplicatable nodes DeleteSelectedNodes(); CurrentGraphEditor->ClearSelectionSet(); for (FGraphPanelSelectionSet::TConstIterator SelectedIter(OldSelectedNodes); SelectedIter; ++SelectedIter) { if (UEdGraphNode* Node = Cast<UEdGraphNode>(*SelectedIter)) { CurrentGraphEditor->SetNodeSelection(Node, true); } } }
void FNiagaraEditor::DeleteSelectedNodes() { TSharedPtr<SGraphEditor> CurrentGraphEditor = NodeGraphEditorPtr.Pin(); if (!CurrentGraphEditor.IsValid()) { return; } const FScopedTransaction Transaction(FGenericCommands::Get().Delete->GetDescription()); CurrentGraphEditor->GetCurrentGraph()->Modify(); const FGraphPanelSelectionSet SelectedNodes = CurrentGraphEditor->GetSelectedNodes(); CurrentGraphEditor->ClearSelectionSet(); for (FGraphPanelSelectionSet::TConstIterator NodeIt(SelectedNodes); NodeIt; ++NodeIt) { if (UEdGraphNode* Node = Cast<UEdGraphNode>(*NodeIt)) { if (Node->CanUserDeleteNode()) { Node->Modify(); Node->DestroyNode(); } } } }
void FNiagaraEditor::PostRedo(bool bSuccess) { if (bSuccess) { // Clear selection, to avoid holding refs to nodes that go away TSharedPtr<SGraphEditor> CurrentGraphEditor = NodeGraphEditorPtr.Pin(); if (CurrentGraphEditor.IsValid()) { CurrentGraphEditor->ClearSelectionSet(); CurrentGraphEditor->NotifyGraphChanged(); } FSlateApplication::Get().DismissAllMenus(); } }
TSharedRef<SDockTab> FNiagaraEditor::SpawnTab_NodeProperties(const FSpawnTabArgs& Args) { TSharedRef<SDockTab> SpawnedTab = SNew(SDockTab) .Icon(FEditorStyle::GetBrush("LevelEditor.Tabs.Details")) .Label(LOCTEXT("NiagaraDetailsTitle", "Details")) [ NiagaraDetailsView.ToSharedRef() ]; TSharedPtr<SGraphEditor> NodeGraphEditor = NodeGraphEditorPtr.Pin(); if (NodeGraphEditor.IsValid()) { // Since we're initialising, make sure nothing is selected NodeGraphEditor->ClearSelectionSet(); } return SpawnedTab; }
void FNiagaraEditor::DeleteSelectedNodes() { TSharedPtr<SGraphEditor> NodeGraphEditor = NodeGraphEditorPtr.Pin(); if (!NodeGraphEditor.IsValid()) { return; } const FGraphPanelSelectionSet SelectedNodes = NodeGraphEditor->GetSelectedNodes(); NodeGraphEditor->ClearSelectionSet(); for (FGraphPanelSelectionSet::TConstIterator NodeIt( SelectedNodes ); NodeIt; ++NodeIt) { if (UEdGraphNode* Node = Cast<UEdGraphNode>(*NodeIt)) { if (Node->CanUserDeleteNode()) { Node->DestroyNode(); } } } }
void FNiagaraEditor::PasteNodesHere(const FVector2D& Location) { TSharedPtr<SGraphEditor> CurrentGraphEditor = NodeGraphEditorPtr.Pin(); if (!CurrentGraphEditor.IsValid()) { return; } // Undo/Redo support const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription()); UEdGraph* EdGraph = Cast<UEdGraph>(CurrentGraphEditor->GetCurrentGraph()); EdGraph->Modify(); const FGraphPanelSelectionSet SelectedNodes = CurrentGraphEditor->GetSelectedNodes(); // Clear the selection set (newly pasted stuff will be selected) CurrentGraphEditor->ClearSelectionSet(); // Grab the text to paste from the clipboard. FString TextToImport; FPlatformMisc::ClipboardPaste(TextToImport); // Import the nodes TSet<UEdGraphNode*> PastedNodes; FEdGraphUtilities::ImportNodesFromText(EdGraph, TextToImport, /*out*/ PastedNodes); //Average position of nodes so we can move them while still maintaining relative distances to each other FVector2D AvgNodePosition(0.0f, 0.0f); for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It) { UEdGraphNode* Node = (*It); if (Node) { AvgNodePosition.X += Node->NodePosX; AvgNodePosition.Y += Node->NodePosY; } } if (PastedNodes.Num() > 0) { float InvNumNodes = 1.0f / float(PastedNodes.Num()); AvgNodePosition.X *= InvNumNodes; AvgNodePosition.Y *= InvNumNodes; } for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It) { UEdGraphNode* PasteNode = (*It); if (PasteNode) { // Select the newly pasted stuff CurrentGraphEditor->SetNodeSelection(PasteNode, true); PasteNode->NodePosX = (PasteNode->NodePosX - AvgNodePosition.X) + Location.X; PasteNode->NodePosY = (PasteNode->NodePosY - AvgNodePosition.Y) + Location.Y; PasteNode->SnapToGrid(16); // Give new node a different Guid from the old one PasteNode->CreateNewGuid(); } } // Update UI CurrentGraphEditor->NotifyGraphChanged(); UObject* GraphOwner = EdGraph->GetOuter(); if (GraphOwner) { GraphOwner->PostEditChange(); GraphOwner->MarkPackageDirty(); } }