virtual void CustomizePinData(UEdGraphPin* Pin, FName SourcePropertyName, int32 ArrayIndex, UProperty* Property) const override { if (BaseNode != NULL) { BaseNode->CustomizePinData(Pin, SourcePropertyName, ArrayIndex); } }
void FOptionalPinManager::CreateVisiblePins(TArray<FOptionalPinFromProperty>& Properties, UStruct* SourceStruct, EEdGraphPinDirection Direction, UK2Node* TargetNode, uint8* StructBasePtr) { const UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>(); for (auto ExtraPropertyIt = Properties.CreateIterator(); ExtraPropertyIt; ++ExtraPropertyIt) { FOptionalPinFromProperty& PropertyEntry = *ExtraPropertyIt; if (UProperty* OuterProperty = FindFieldChecked<UProperty>(SourceStruct, PropertyEntry.PropertyName)) { // Do we treat an array property as one pin, or a pin per entry in the array? // Depends on if we have an instance of the struct to work with. UArrayProperty* ArrayProperty = Cast<UArrayProperty>(OuterProperty); if ((ArrayProperty != NULL) && (StructBasePtr != NULL)) { UProperty* InnerProperty = ArrayProperty->Inner; FEdGraphPinType PinType; if (Schema->ConvertPropertyToPinType(InnerProperty, /*out*/ PinType)) { FScriptArrayHelper_InContainer ArrayHelper(ArrayProperty, StructBasePtr); for (int32 Index = 0; Index < ArrayHelper.Num(); ++Index) { // Create the pin UEdGraphPin* NewPin = NULL; if (PropertyEntry.bShowPin) { FFormatNamedArguments Args; Args.Add(TEXT("PinName"), FText::FromName(PropertyEntry.PropertyName)); Args.Add(TEXT("Index"), Index); const FText PinFriendlyName = FText::Format(LOCTEXT("PinFriendlyNameWithIndex", "{PinName}_{Index}"), Args); const FString PinName = PinFriendlyName.ToString(); NewPin = TargetNode->CreatePin(Direction, PinType, PinName); NewPin->PinFriendlyName = PinFriendlyName; Schema->ConstructBasicPinTooltip(*NewPin, PropertyEntry.PropertyTooltip, NewPin->PinToolTip); // Allow the derived class to customize the created pin CustomizePinData(NewPin, PropertyEntry.PropertyName, Index, InnerProperty); } // Let derived classes take a crack at transferring default values uint8* ValuePtr = ArrayHelper.GetRawPtr(Index); if (NewPin != NULL) { PostInitNewPin(NewPin, PropertyEntry, Index, ArrayProperty->Inner, ValuePtr); } else { PostRemovedOldPin(PropertyEntry, Index, ArrayProperty->Inner, ValuePtr); } } } } else { // Not an array property FEdGraphPinType PinType; if (Schema->ConvertPropertyToPinType(OuterProperty, /*out*/ PinType)) { // Create the pin UEdGraphPin* NewPin = NULL; if (PropertyEntry.bShowPin) { const FString PinName = PropertyEntry.PropertyName.ToString(); NewPin = TargetNode->CreatePin(Direction, PinType, PinName); NewPin->PinFriendlyName = PropertyEntry.PropertyFriendlyName.IsEmpty() ? FText::FromString(PinName) : FText::FromString(PropertyEntry.PropertyFriendlyName); Schema->ConstructBasicPinTooltip(*NewPin, PropertyEntry.PropertyTooltip, NewPin->PinToolTip); // Allow the derived class to customize the created pin CustomizePinData(NewPin, PropertyEntry.PropertyName, INDEX_NONE, OuterProperty); } // Let derived classes take a crack at transferring default values if (StructBasePtr != NULL) { uint8* ValuePtr = OuterProperty->ContainerPtrToValuePtr<uint8>(StructBasePtr); if (NewPin != NULL) { PostInitNewPin(NewPin, PropertyEntry, INDEX_NONE, OuterProperty, ValuePtr); } else { PostRemovedOldPin(PropertyEntry, INDEX_NONE, OuterProperty, ValuePtr); } } } } } } }