#pragma once #include "CoreMinimal.h" #include "WingServer.h" #include "WingBasics.h" #include "WingFetcher.h" #include "WingProperty.h" #include "EdGraph/EdGraph.h" #include "EdGraph/EdGraphNode.h" #include "GraphNode_SetPositions.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- USTRUCT() struct FMoveNodeEntry { GENERATED_BODY() UPROPERTY() FString Node; UPROPERTY() int32 X = 0; UPROPERTY() int32 Y = 0; }; UCLASS() class UWing_GraphNode_SetPositions : public UWingHandler { GENERATED_BODY() public: UPROPERTY(EditAnywhere, meta=(Description="Target graph")) FString Graph; UPROPERTY(EditAnywhere, meta=(Description="Array of {node, x, y} objects")) FWingJsonArray Nodes; virtual void Register() override { UWingServer::AddHandler(this, TEXT("Reposition one or more nodes in a Blueprint graph.")); } virtual void Handle() override { WingFetcher F(WingOut::Stdout); UEdGraph* TargetGraph = F.Walk(Graph).Cast(); if (!TargetGraph) return; int32 SuccessCount = 0; FMoveNodeEntry Entry; TArray Props = FWingProperty::GetAll(nullptr, &Entry, FMoveNodeEntry::StaticStruct(), true); for (const TSharedPtr& Elt : Nodes.Array) { if (!FWingProperty::PopulateFromJson(Props, *Elt, false, WingOut::Stdout)) continue; WingFetcher FN(TargetGraph, WingOut::Stdout); UEdGraphNode* Node = FN.Node(Entry.Node).Cast(); if (!Node) continue; Node->NodePosX = Entry.X; Node->NodePosY = Entry.Y; SuccessCount++; } WingOut::Stdout.Printf(TEXT("Moved %d/%d nodes.\n"), SuccessCount, Nodes.Array.Num()); } };