void UEdGraph::MoveNodesToAnotherGraph(UEdGraph* DestinationGraph, bool bIsLoading, bool bInIsCompiling/* = false*/) { // Move one node over at a time while (Nodes.Num()) { if (UEdGraphNode* Node = Nodes.Pop()) { #if WITH_EDITOR // During compilation, do not move ghost nodes, they are not used during compilation. if (bInIsCompiling && !Node->bIsNodeEnabled) { // Break all node links, if any exist, do not move the node Node->BreakAllNodeLinks(); continue; } #endif // Let the name be autogenerated, to automatically avoid naming conflicts // Since this graph is always going to come from a cloned source graph, user readable names can come from the remap stored in a MessageLog. //@todo: The bIsLoading check is to force no reset loaders when blueprints are compiling on load. This might not catch all cases though! Node->Rename(/*NewName=*/ NULL, /*NewOuter=*/ DestinationGraph, REN_DontCreateRedirectors | (bIsLoading ? REN_ForceNoResetLoaders : 0)); DestinationGraph->Nodes.Add(Node); } } DestinationGraph->NotifyGraphChanged(); NotifyGraphChanged(); }
void USoundClassGraph::AddNewSoundClass(UEdGraphPin* FromPin, class USoundClass* SoundClass, int32 NodePosX, int32 NodePosY, bool bSelectNewNode/* = true*/) { check(SoundClass->ChildClasses.Num() == 0); Modify(); USoundClassGraphNode* GraphNode = CreateNode(SoundClass, NodePosX, NodePosY, bSelectNewNode); GraphNode->AutowireNewNode(FromPin); NotifyGraphChanged(); }
void USoundClassGraph::AddDroppedSoundClasses(const TArray<USoundClass*>& SoundClasses, int32 NodePosX, int32 NodePosY) { Modify(); for (int32 ClassIndex = 0; ClassIndex < SoundClasses.Num(); ClassIndex++) { NodePosY += ConstructNodes(SoundClasses[ClassIndex], NodePosX, NodePosY); } NotifyGraphChanged(); }
void UEdGraph::SelectNodeSet(TSet<const UEdGraphNode*> NodeSelection, bool bFromUI/*= false*/) { FEdGraphEditAction SelectionAction; SelectionAction.Action = GRAPHACTION_SelectNode; SelectionAction.Graph = this; SelectionAction.Nodes = NodeSelection; NotifyGraphChanged(SelectionAction); }
void SGraphEditorImpl::SetPinVisibility( SGraphEditor::EPinVisibility Visibility ) { if( GraphPanel.IsValid()) { SGraphEditor::EPinVisibility CachedVisibility = GraphPanel->GetPinVisibility(); GraphPanel->SetPinVisibility(Visibility); if(CachedVisibility != Visibility) { NotifyGraphChanged(); } } }
void USoundClassGraph::RebuildGraph() { check(RootSoundClass); Modify(false); RemoveAllNodes(); ConstructNodes(RootSoundClass, 0, 0); NotifyGraphChanged(); }
void SGraphEditorImpl::ReconstructNodes() { const UEdGraphSchema* Schema = this->EdGraphObj->GetSchema(); for (FGraphPanelSelectionSet::TConstIterator NodeIt( GraphPanel->SelectionManager.GetSelectedNodes() ); NodeIt; ++NodeIt) { if (UEdGraphNode* Node = Cast<UEdGraphNode>(*NodeIt)) { Schema->ReconstructNode(*Node); } } NotifyGraphChanged(); }
bool UEdGraph::RemoveNode( UEdGraphNode* NodeToRemove ) { Modify(); int32 NumTimesNodeRemoved = Nodes.Remove(NodeToRemove); #if WITH_EDITOR NodeToRemove->BreakAllNodeLinks(); #endif //#if WITH_EDITOR FEdGraphEditAction RemovalAction; RemovalAction.Graph = this; RemovalAction.Action = GRAPHACTION_RemoveNode; RemovalAction.Nodes.Add(NodeToRemove); NotifyGraphChanged(RemovalAction); return NumTimesNodeRemoved > 0; }
void UEdGraph::AddNode( UEdGraphNode* NodeToAdd, bool bFromUI/* = false*/, bool bSelectNewNode/* = true*/ ) { this->Nodes.Add(NodeToAdd); check(NodeToAdd->GetOuter() == this); // Create the graph EEdGraphActionType AddNodeAction = GRAPHACTION_AddNode; if (bSelectNewNode) { AddNodeAction = (EEdGraphActionType)( ((int32)AddNodeAction) | GRAPHACTION_SelectNode ); } FEdGraphEditAction Action(AddNodeAction, this, NodeToAdd); NotifyGraphChanged( Action ); }
void UMaterialGraph::LinkGraphNodesFromMaterial() { for (int32 Index = 0; Index < Nodes.Num(); ++Index) { Nodes[Index]->BreakAllNodeLinks(); } if (RootNode) { // Use Material Inputs to make GraphNode Connections for (int32 Index = 0; Index < MaterialInputs.Num(); ++Index) { UEdGraphPin* InputPin = RootNode->GetInputPin(Index); auto ExpressionInput = MaterialInputs[Index].GetExpressionInput(Material); if (ExpressionInput.Expression) { UMaterialGraphNode* GraphNode = CastChecked<UMaterialGraphNode>(ExpressionInput.Expression->GraphNode); InputPin->MakeLinkTo(GraphNode->GetOutputPin(GetValidOutputIndex(&ExpressionInput))); } } } for (int32 Index = 0; Index < Material->Expressions.Num(); Index++) { UMaterialExpression* Expression = Material->Expressions[Index]; if (Expression) { const TArray<FExpressionInput*> ExpressionInputs = Expression->GetInputs(); for (int32 InputIndex = 0; InputIndex < ExpressionInputs.Num(); ++InputIndex) { UEdGraphPin* InputPin = CastChecked<UMaterialGraphNode>(Expression->GraphNode)->GetInputPin(InputIndex); if ( ExpressionInputs[InputIndex]->Expression) { UMaterialGraphNode* GraphNode = CastChecked<UMaterialGraphNode>(ExpressionInputs[InputIndex]->Expression->GraphNode); InputPin->MakeLinkTo(GraphNode->GetOutputPin(GetValidOutputIndex(ExpressionInputs[InputIndex]))); } } } } NotifyGraphChanged(); }
void USoundClassGraph::RebuildGraph() { check(RootSoundClass); // Don't allow initial graph rebuild to affect package dirty state; remember current state... UPackage* Package = GetOutermost(); const bool bIsDirty = Package->IsDirty(); Modify(); RemoveAllNodes(); ConstructNodes(RootSoundClass, 0, 0); NotifyGraphChanged(); // ...and restore it Package->SetDirtyFlag(bIsDirty); }
void USoundClassGraph::RefreshGraphLinks() { Modify(); for (int32 NodeIndex = 0; NodeIndex < Nodes.Num(); NodeIndex++) { USoundClassGraphNode* Node = CastChecked<USoundClassGraphNode>(Nodes[NodeIndex]); if (!Node->CheckRepresentsSoundClass()) { UEdGraphPin* ChildPin = Node->GetChildPin(); Node->Modify(); ChildPin->BreakAllPinLinks(); for (int32 ChildIndex = 0; ChildIndex < Node->SoundClass->ChildClasses.Num(); ChildIndex++) { USoundClass* ChildClass = Node->SoundClass->ChildClasses[ChildIndex]; if (ChildClass) { USoundClassGraphNode* ChildNode = FindExistingNode(ChildClass); if (!ChildNode) { // New Child not yet represented on graph ConstructNodes(ChildClass, Node->NodePosX+400, Node->NodePosY); ChildNode = FindExistingNode(ChildClass); } ChildPin->MakeLinkTo(ChildNode->GetParentPin()); } } Node->PostEditChange(); } } NotifyGraphChanged(); }
void SGraphEditorImpl::Construct( const FArguments& InArgs ) { Commands = MakeShareable( new FUICommandList() ); IsEditable = InArgs._IsEditable; Appearance = InArgs._Appearance; TitleBarEnabledOnly = InArgs._TitleBarEnabledOnly; TitleBar = InArgs._TitleBar; bAutoExpandActionMenu = InArgs._AutoExpandActionMenu; bShowPIENotification = InArgs._ShowPIENotification; OnNavigateHistoryBack = InArgs._OnNavigateHistoryBack; OnNavigateHistoryForward = InArgs._OnNavigateHistoryForward; OnNodeSpawnedByKeymap = InArgs._GraphEvents.OnNodeSpawnedByKeymap; // Make sure that the editor knows about what kinds // of commands GraphEditor can do. FGraphEditorCommands::Register(); // Tell GraphEditor how to handle all the known commands { Commands->MapAction( FGraphEditorCommands::Get().ReconstructNodes, FExecuteAction::CreateSP( this, &SGraphEditorImpl::ReconstructNodes ), FCanExecuteAction::CreateSP( this, &SGraphEditorImpl::CanReconstructNodes ) ); Commands->MapAction( FGraphEditorCommands::Get().BreakNodeLinks, FExecuteAction::CreateSP( this, &SGraphEditorImpl::BreakNodeLinks ), FCanExecuteAction::CreateSP( this, &SGraphEditorImpl::CanBreakNodeLinks ) ); Commands->MapAction( FGraphEditorCommands::Get().BreakPinLinks, FExecuteAction::CreateSP( this, &SGraphEditorImpl::BreakPinLinks, true), FCanExecuteAction::CreateSP( this, &SGraphEditorImpl::CanBreakPinLinks ) ); // Append any additional commands that a consumer of GraphEditor wants us to be aware of. const TSharedPtr<FUICommandList>& AdditionalCommands = InArgs._AdditionalCommands; if ( AdditionalCommands.IsValid() ) { Commands->Append( AdditionalCommands.ToSharedRef() ); } } GraphPinForMenu = NULL; EdGraphObj = InArgs._GraphToEdit; bNeedsRefresh = false; OnFocused = InArgs._GraphEvents.OnFocused; OnCreateActionMenu = InArgs._GraphEvents.OnCreateActionMenu; struct Local { static FString GetPIENotifyText(TAttribute<FGraphAppearanceInfo> Appearance, FString DefaultText) { FString OverrideText = Appearance.Get().PIENotifyText; return OverrideText.Len() ? OverrideText : DefaultText; } }; FString DefaultPIENotify(TEXT("SIMULATING")); TAttribute<FString> PIENotifyText = Appearance.IsBound() ? TAttribute<FString>::Create( TAttribute<FString>::FGetter::CreateStatic(&Local::GetPIENotifyText, Appearance, DefaultPIENotify) ) : TAttribute<FString>(DefaultPIENotify); TSharedPtr<SOverlay> OverlayWidget; this->ChildSlot [ SAssignNew(OverlayWidget, SOverlay) // The graph panel +SOverlay::Slot() .Expose(GraphPanelSlot) [ SAssignNew(GraphPanel, SGraphPanel) .GraphObj( EdGraphObj ) .GraphObjToDiff( InArgs._GraphToDiff) .OnGetContextMenuFor( this, &SGraphEditorImpl::GraphEd_OnGetContextMenuFor ) .OnSelectionChanged( InArgs._GraphEvents.OnSelectionChanged ) .OnNodeDoubleClicked( InArgs._GraphEvents.OnNodeDoubleClicked ) .IsEditable( this->IsEditable ) .OnDropActor( InArgs._GraphEvents.OnDropActor ) .OnDropStreamingLevel( InArgs._GraphEvents.OnDropStreamingLevel ) .IsEnabled(this, &SGraphEditorImpl::GraphEd_OnGetGraphEnabled) .OnVerifyTextCommit( InArgs._GraphEvents.OnVerifyTextCommit ) .OnTextCommitted( InArgs._GraphEvents.OnTextCommitted ) .OnSpawnNodeByShortcut( InArgs._GraphEvents.OnSpawnNodeByShortcut ) .OnUpdateGraphPanel( this, &SGraphEditorImpl::GraphEd_OnPanelUpdated ) .OnDisallowedPinConnection( InArgs._GraphEvents.OnDisallowedPinConnection ) .ShowPIENotification( InArgs._ShowPIENotification ) ] // Indicator of current zoom level +SOverlay::Slot() .Padding(5) .VAlign(VAlign_Top) .HAlign(HAlign_Right) [ SNew(STextBlock) .TextStyle( FEditorStyle::Get(), "Graph.ZoomText" ) .Text( this, &SGraphEditorImpl::GetZoomString ) .ColorAndOpacity( this, &SGraphEditorImpl::GetZoomTextColorAndOpacity ) ] // Title bar - optional +SOverlay::Slot() .VAlign(VAlign_Top) [ InArgs._TitleBar.IsValid() ? InArgs._TitleBar.ToSharedRef() : (TSharedRef<SWidget>)SNullWidget::NullWidget ] // Bottom-right corner text indicating the type of tool +SOverlay::Slot() .Padding(10) .VAlign(VAlign_Bottom) .HAlign(HAlign_Right) [ SNew(STextBlock) .Visibility( EVisibility::HitTestInvisible ) .TextStyle( FEditorStyle::Get(), "Graph.CornerText" ) .Text(Appearance.Get().CornerText) ] // Top-right corner text indicating PIE is active +SOverlay::Slot() .Padding(20) .VAlign(VAlign_Top) .HAlign(HAlign_Right) [ SNew(STextBlock) .Visibility(this, &SGraphEditorImpl::PIENotification) .TextStyle( FEditorStyle::Get(), "Graph.SimulatingText" ) .Text( PIENotifyText ) ] // Bottom-right corner text for notification list position +SOverlay::Slot() .Padding(15.f) .VAlign(VAlign_Bottom) .HAlign(HAlign_Right) [ SAssignNew(NotificationListPtr, SNotificationList) .Visibility(EVisibility::HitTestInvisible) ] ]; GraphPanel->RestoreViewSettings(FVector2D::ZeroVector, -1); NotifyGraphChanged(); }
void UAIGraph::OnSubNodeDropped() { NotifyGraphChanged(); }
void UNiagaraGraph::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) { NotifyGraphChanged(); }