void UK2Node_MakeStruct::AllocateDefaultPins() { const UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>(); if(Schema && StructType) { CreatePin(EGPD_Output, Schema->PC_Struct, TEXT(""), StructType, false, false, StructType->GetName()); { FStructOnScope StructOnScope(Cast<UScriptStruct>(StructType)); FMakeStructPinManager OptionalPinManager(StructOnScope.GetStructMemory()); OptionalPinManager.RebuildPropertyList(ShowPinForProperties, StructType); OptionalPinManager.CreateVisiblePins(ShowPinForProperties, StructType, EGPD_Input, this); } // When struct has a lot of fields, mark their pins as advanced if(Pins.Num() > 5) { if(ENodeAdvancedPins::NoPins == AdvancedPinDisplay) { AdvancedPinDisplay = ENodeAdvancedPins::Hidden; } for(int32 PinIndex = 3; PinIndex < Pins.Num(); ++PinIndex) { if(UEdGraphPin * EdGraphPin = Pins[PinIndex]) { EdGraphPin->bAdvancedView = true; } } } } }
void UK2Node_GetClassDefaults::CreateOutputPins(UClass* InClass) { // Create the set of output pins through the optional pin manager FClassDefaultsOptionalPinManager OptionalPinManager(InClass, bExcludeObjectArrays); OptionalPinManager.RebuildPropertyList(ShowPinForProperties, InClass); OptionalPinManager.CreateVisiblePins(ShowPinForProperties, InClass, EGPD_Output, this); // Check for any advanced properties (outputs) bool bHasAdvancedPins = false; for(int32 PinIndex = 0; PinIndex < Pins.Num() && !bHasAdvancedPins; ++PinIndex) { UEdGraphPin* Pin = Pins[PinIndex]; check(Pin != nullptr); bHasAdvancedPins |= Pin->bAdvancedView; } // Toggle advanced display on/off based on whether or not we have any advanced outputs if(bHasAdvancedPins && AdvancedPinDisplay == ENodeAdvancedPins::NoPins) { AdvancedPinDisplay = ENodeAdvancedPins::Hidden; } else if(!bHasAdvancedPins) { AdvancedPinDisplay = ENodeAdvancedPins::NoPins; } }
void UAnimGraphNode_Base::InternalPinCreation(TArray<UEdGraphPin*>* OldPins) { // preload required assets first before creating pins PreloadRequiredAssets(); const UAnimationGraphSchema* Schema = GetDefault<UAnimationGraphSchema>(); if (const UStructProperty* NodeStruct = GetFNodeProperty()) { // Display any currently visible optional pins { FA3NodeOptionalPinManager OptionalPinManager(this, OldPins); OptionalPinManager.AllocateDefaultPins(NodeStruct->Struct, NodeStruct->ContainerPtrToValuePtr<uint8>(this)); } // Create the output pin, if needed CreateOutputPins(); } }
void UK2Node_SetFieldsInStruct::AllocateDefaultPins() { const UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>(); if (Schema && StructType) { CreatePin(EGPD_Input, Schema->PC_Exec, TEXT(""), NULL, false, false, Schema->PN_Execute); CreatePin(EGPD_Output, Schema->PC_Exec, TEXT(""), NULL, false, false, Schema->PN_Then); CreatePin(EGPD_Input, Schema->PC_Struct, TEXT(""), StructType, false, true, SetFieldsInStructHelper::StructRefPinName()); { FStructOnScope StructOnScope(Cast<UScriptStruct>(StructType)); FMakeStructPinManager OptionalPinManager(StructOnScope.GetStructMemory()); OptionalPinManager.RebuildPropertyList(ShowPinForProperties, StructType); OptionalPinManager.CreateVisiblePins(ShowPinForProperties, StructType, EGPD_Input, this); } } }
void UK2Node_GetClassDefaults::CreateOutputPins(UClass* InClass) { // Create the set of output pins through the optional pin manager FClassDefaultsOptionalPinManager OptionalPinManager(InClass, bExcludeObjectArrays); OptionalPinManager.RebuildPropertyList(ShowPinForProperties, InClass); OptionalPinManager.CreateVisiblePins(ShowPinForProperties, InClass, EGPD_Output, this); // Check for any advanced properties (outputs) bool bHasAdvancedPins = false; for(int32 PinIndex = 0; PinIndex < Pins.Num() && !bHasAdvancedPins; ++PinIndex) { UEdGraphPin* Pin = Pins[PinIndex]; check(Pin != nullptr); bHasAdvancedPins |= Pin->bAdvancedView; } // Toggle advanced display on/off based on whether or not we have any advanced outputs if(bHasAdvancedPins && AdvancedPinDisplay == ENodeAdvancedPins::NoPins) { AdvancedPinDisplay = ENodeAdvancedPins::Hidden; } else if(!bHasAdvancedPins) { AdvancedPinDisplay = ENodeAdvancedPins::NoPins; } // Unbind OnChanged() delegate from a previous Blueprint, if valid. // If the class was generated for a Blueprint, bind delegates to handle any OnChanged() & OnCompiled() events. bool bShouldClearDelegate = true; if (InClass) { if (UBlueprint* Blueprint = Cast<UBlueprint>(InClass->ClassGeneratedBy)) { // only clear the delegate if the pin has changed: bShouldClearDelegate = BlueprintSubscribedTo != Blueprint; } } if (bShouldClearDelegate) { if (OnBlueprintChangedDelegate.IsValid()) { if (BlueprintSubscribedTo) { BlueprintSubscribedTo->OnChanged().Remove(OnBlueprintChangedDelegate); } OnBlueprintChangedDelegate.Reset(); } // Unbind OnCompiled() delegate from a previous Blueprint, if valid. if (OnBlueprintCompiledDelegate.IsValid()) { if (BlueprintSubscribedTo) { BlueprintSubscribedTo->OnCompiled().Remove(OnBlueprintCompiledDelegate); } OnBlueprintCompiledDelegate.Reset(); } // Associated Blueprint changed, clear the BlueprintSubscribedTo: BlueprintSubscribedTo = nullptr; } if (InClass && bShouldClearDelegate) { if (UBlueprint* Blueprint = Cast<UBlueprint>(InClass->ClassGeneratedBy)) { BlueprintSubscribedTo = Blueprint; OnBlueprintChangedDelegate = Blueprint->OnChanged().AddUObject(this, &ThisClass::OnBlueprintClassModified); OnBlueprintCompiledDelegate = Blueprint->OnCompiled().AddUObject(this, &ThisClass::OnBlueprintClassModified); } } }