//------------------------------------------------------------------------------ FBlueprintActionUiSpec UBlueprintVariableNodeSpawner::GetUiSpec(FBlueprintActionContext const& Context, FBindingSet const& Bindings) const { UEdGraph* TargetGraph = (Context.Graphs.Num() > 0) ? Context.Graphs[0] : nullptr; FBlueprintActionUiSpec MenuSignature = PrimeDefaultUiSpec(TargetGraph); if (UProperty const* WrappedVariable = GetVarProperty()) { checkSlow(Context.Blueprints.Num() > 0); UBlueprint const* TargetBlueprint = Context.Blueprints[0]; // @TODO: this is duplicated in a couple places, move it to some shared resource UClass const* TargetClass = (TargetBlueprint->GeneratedClass != nullptr) ? TargetBlueprint->GeneratedClass : TargetBlueprint->ParentClass; for (UEdGraphPin* Pin : Context.Pins) { if ((Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Object) && Pin->PinType.PinSubCategoryObject.IsValid()) { TargetClass = CastChecked<UClass>(Pin->PinType.PinSubCategoryObject.Get()); } } auto OwnerClass = WrappedVariable->GetOwnerClass(); const bool bIsOwneClassValid = OwnerClass && (!Cast<const UBlueprintGeneratedClass>(OwnerClass) || OwnerClass->ClassGeneratedBy); //todo: more general validation UClass const* VariableClass = bIsOwneClassValid ? OwnerClass->GetAuthoritativeClass() : NULL; if (VariableClass && !TargetClass->IsChildOf(VariableClass)) { MenuSignature.Category = FEditorCategoryUtils::BuildCategoryString(FCommonEditorCategory::Class, FText::FromString(VariableClass->GetDisplayNameText().ToString())); } } DynamicUiSignatureGetter.ExecuteIfBound(Context, Bindings, &MenuSignature); return MenuSignature; }
//------------------------------------------------------------------------------ FBlueprintActionUiSpec UBlueprintComponentNodeSpawner::GetUiSpec(FBlueprintActionContext const& Context, FBindingSet const& Bindings) const { UEdGraph* TargetGraph = (Context.Graphs.Num() > 0) ? Context.Graphs[0] : nullptr; FBlueprintActionUiSpec MenuSignature = PrimeDefaultUiSpec(TargetGraph); if (Bindings.Num() > 0) { FText AssetName; if (UObject* AssetBinding = Bindings.CreateConstIterator()->Get()) { AssetName = FText::FromName(AssetBinding->GetFName()); } FText const ComponentTypeName = FText::FromName(ComponentClass->GetFName()); MenuSignature.MenuName = FText::Format(LOCTEXT("AddBoundComponentMenuName", "Add {0} (as {1})"), AssetName, ComponentTypeName); MenuSignature.Tooltip = FText::Format(LOCTEXT("AddBoundComponentTooltip", "Spawn {0} using {1}"), ComponentTypeName, AssetName); } DynamicUiSignatureGetter.ExecuteIfBound(Context, Bindings, &MenuSignature); return MenuSignature; }