void UAnimGraphNode_BlendListByEnum::RemovePinFromBlendList(UEdGraphPin* Pin) { int32 RawArrayIndex = 0; bool bIsPosePin = false; bool bIsTimePin = false; GetPinInformation(Pin->PinName, /*out*/ RawArrayIndex, /*out*/ bIsPosePin, /*out*/ bIsTimePin); const int32 ExposedEnumIndex = (bIsPosePin || bIsTimePin) ? (RawArrayIndex - 1) : INDEX_NONE; if (ExposedEnumIndex != INDEX_NONE) { FScopedTransaction Transaction( LOCTEXT("RemovePin", "RemovePin") ); Modify(); // Record it as no longer exposed VisibleEnumEntries.RemoveAt(ExposedEnumIndex); // Remove the pose from the node UProperty* AssociatedProperty; int32 ArrayIndex; GetPinAssociatedProperty(GetFNodeType(), Pin, /*out*/ AssociatedProperty, /*out*/ ArrayIndex); ensure(ArrayIndex == (ExposedEnumIndex + 1)); // setting up removed pins info RemovedPinArrayIndex = ArrayIndex; Node.RemovePose(ArrayIndex); ReconstructNode(); //@TODO: Just want to invalidate the visual representation currently FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(GetBlueprint()); } }
void UAnimGraphNode_BlendListByEnum::CustomizePinData(UEdGraphPin* Pin, FName SourcePropertyName, int32 ArrayIndex) const { // if pin name starts with BlendPose or BlendWeight, change to enum name bool bIsPosePin; bool bIsTimePin; int32 RawArrayIndex; GetPinInformation(Pin->PinName, /*out*/ RawArrayIndex, /*out*/ bIsPosePin, /*out*/ bIsTimePin); checkSlow(RawArrayIndex == ArrayIndex); if (bIsPosePin || bIsTimePin) { if (RawArrayIndex > 0) { const int32 ExposedEnumPinIndex = RawArrayIndex - 1; // find pose index and see if it's mapped already or not if (VisibleEnumEntries.IsValidIndex(ExposedEnumPinIndex) && (BoundEnum != NULL)) { const FName& EnumElementName = VisibleEnumEntries[ExposedEnumPinIndex]; const int32 EnumIndex = BoundEnum->FindEnumIndex(EnumElementName); if (EnumIndex != INDEX_NONE) { Pin->PinFriendlyName = BoundEnum->GetEnumText(EnumIndex); } else { Pin->PinFriendlyName = FText::FromName(EnumElementName); } } else { Pin->PinFriendlyName = LOCTEXT("InvalidIndex", "Invalid index"); } } else if (ensure(RawArrayIndex == 0)) { Pin->PinFriendlyName = LOCTEXT("Default", "Default"); } // Append the pin type if (bIsPosePin) { FFormatNamedArguments Args; Args.Add(TEXT("PinFriendlyName"), Pin->PinFriendlyName); Pin->PinFriendlyName = FText::Format(LOCTEXT("FriendlyNamePose", "{PinFriendlyName} Pose"), Args); } if (bIsTimePin) { FFormatNamedArguments Args; Args.Add(TEXT("PinFriendlyName"), Pin->PinFriendlyName); Pin->PinFriendlyName = FText::Format(LOCTEXT("FriendlyNameBlendTime", "{PinFriendlyName} Blend Time"), Args); } } }
void UAnimGraphNode_BlendListByEnum::GetContextMenuActions(const FGraphNodeContextMenuBuilder& Context) const { if (!Context.bIsDebugging && (BoundEnum != NULL)) { if ((Context.Pin != NULL) && (Context.Pin->Direction == EGPD_Input)) { int32 RawArrayIndex = 0; bool bIsPosePin = false; bool bIsTimePin = false; GetPinInformation(Context.Pin->PinName, /*out*/ RawArrayIndex, /*out*/ bIsPosePin, /*out*/ bIsTimePin); if (bIsPosePin || bIsTimePin) { const int32 ExposedEnumIndex = RawArrayIndex - 1; if (ExposedEnumIndex != INDEX_NONE) { // Offer to remove this specific pin FUIAction Action = FUIAction( FExecuteAction::CreateUObject( this, &UAnimGraphNode_BlendListByEnum::RemovePinFromBlendList, const_cast<UEdGraphPin*>(Context.Pin)) ); Context.MenuBuilder->AddMenuEntry( LOCTEXT("RemovePose", "Remove Pose"), FText::GetEmpty(), FSlateIcon(), Action ); } } } // Offer to add any not-currently-visible pins bool bAddedHeader = false; const int32 MaxIndex = BoundEnum->NumEnums() - 1; // we don't want to show _MAX enum for (int32 Index = 0; Index < MaxIndex; ++Index) { FName ElementName = BoundEnum->GetEnum(Index); if (!VisibleEnumEntries.Contains(ElementName)) { FText PrettyElementName = BoundEnum->GetEnumText(Index); // Offer to add this entry if (!bAddedHeader) { bAddedHeader = true; Context.MenuBuilder->BeginSection("AnimGraphNodeAddElementPin", LOCTEXT("ExposeHeader", "Add pin for element")); { FUIAction Action = FUIAction( FExecuteAction::CreateUObject( this, &UAnimGraphNode_BlendListByEnum::ExposeEnumElementAsPin, ElementName) ); Context.MenuBuilder->AddMenuEntry(PrettyElementName, PrettyElementName, FSlateIcon(), Action); } Context.MenuBuilder->EndSection(); } else { FUIAction Action = FUIAction( FExecuteAction::CreateUObject( this, &UAnimGraphNode_BlendListByEnum::ExposeEnumElementAsPin, ElementName) ); Context.MenuBuilder->AddMenuEntry(PrettyElementName, PrettyElementName, FSlateIcon(), Action); } } } } }
void UAnimGraphNode_BlendLocomotionFour::CustomizePinData(UEdGraphPin* Pin, FName SourcePropertyName, int32 ArrayIndex) const { // if pin name starts with BlendPose or BlendWeight, change to enum name bool bIsPosePin; bool bIsTimePin; int32 RawArrayIndex; GetPinInformation(Pin->PinName.ToString(), /*out*/ RawArrayIndex, /*out*/ bIsPosePin, /*out*/ bIsTimePin); checkSlow(RawArrayIndex == ArrayIndex); if (bIsPosePin) { if (RawArrayIndex == 0) { //Pin->PinFriendlyName = FText::FromName("North Pose"); //FFormatNamedArguments Args; //Args.Add(TEXT("PinFriendlyName"), Pin->PinFriendlyName); Pin->PinFriendlyName = FText::FromString("N Pose"); } else if (RawArrayIndex == 1) { Pin->PinFriendlyName = FText::FromString("E Pose"); } else if (RawArrayIndex == 2) { Pin->PinFriendlyName = FText::FromString("S Pose"); } else if (RawArrayIndex == 3) { Pin->PinFriendlyName = FText::FromString("W Pose"); } } //if (bIsPosePin || bIsTimePin) //{ // if (RawArrayIndex > 0) // { // const int32 ExposedEnumPinIndex = RawArrayIndex - 1; // // find pose index and see if it's mapped already or not // if (VisibleEnumEntries.IsValidIndex(ExposedEnumPinIndex) && (BoundEnum != NULL)) // { // const FName& EnumElementName = VisibleEnumEntries[ExposedEnumPinIndex]; // const int32 EnumIndex = BoundEnum->GetIndexByName(EnumElementName); // if (EnumIndex != INDEX_NONE) // { // Pin->PinFriendlyName = BoundEnum->GetDisplayNameTextByIndex(EnumIndex); // } // else // { // Pin->PinFriendlyName = FText::FromName(EnumElementName); // } // } // else // { // Pin->PinFriendlyName = LOCTEXT("InvalidIndex", "Invalid index"); // } // } // else if (ensure(RawArrayIndex == 0)) // { // Pin->PinFriendlyName = LOCTEXT("Default", "Default"); // } // // Append the pin type // if (bIsPosePin) // { // FFormatNamedArguments Args; // Args.Add(TEXT("PinFriendlyName"), Pin->PinFriendlyName); // Pin->PinFriendlyName = FText::Format(LOCTEXT("FriendlyNamePose", "{PinFriendlyName} Pose"), Args); // } // if (bIsTimePin) // { // FFormatNamedArguments Args; // Args.Add(TEXT("PinFriendlyName"), Pin->PinFriendlyName); // Pin->PinFriendlyName = FText::Format(LOCTEXT("FriendlyNameBlendTime", "{PinFriendlyName} Blend Time"), Args); // } //} }