void FPropertyTableColumn::GenerateColumnId() { TWeakObjectPtr< UObject > Object = DataSource->AsUObject(); TSharedPtr< FPropertyPath > PropertyPath = DataSource->AsPropertyPath(); // Use partial path for a valid column ID if we have one. We are pointing to a container with an array, but all columns must be unique if ( PartialPath->GetNumProperties() > 0 ) { Id = FName( *PartialPath->ToString()); } else if ( Object.IsValid() ) { Id = Object->GetFName(); } else if ( PropertyPath.IsValid() ) { Id = FName( *PropertyPath->ToString() ); } else { Id = NAME_None; } }
void UAnimGraphNode_SequencePlayer::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const { auto LoadedAssetSetup = [](UEdGraphNode* NewNode, bool /*bIsTemplateNode*/, TWeakObjectPtr<UAnimSequence> SequencePtr) { UAnimGraphNode_SequencePlayer* SequencePlayerNode = CastChecked<UAnimGraphNode_SequencePlayer>(NewNode); SequencePlayerNode->Node.Sequence = SequencePtr.Get(); }; auto UnloadedAssetSetup = [](UEdGraphNode* NewNode, bool bIsTemplateNode, const FAssetData AssetData) { UAnimGraphNode_SequencePlayer* SequencePlayerNode = CastChecked<UAnimGraphNode_SequencePlayer>(NewNode); if (bIsTemplateNode) { if (const FString* SkeletonTag = AssetData.TagsAndValues.Find(TEXT("Skeleton"))) { SequencePlayerNode->UnloadedSkeletonName = *SkeletonTag; } } else { UAnimSequence* Sequence = Cast<UAnimSequence>(AssetData.GetAsset()); check(Sequence != nullptr); SequencePlayerNode->Node.Sequence = Sequence; } }; const UObject* QueryObject = ActionRegistrar.GetActionKeyFilter(); if (QueryObject == nullptr) { FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")); // define a filter to help in pulling UAnimSequence asset data from the registry FARFilter Filter; Filter.ClassNames.Add(UAnimSequence::StaticClass()->GetFName()); Filter.bRecursiveClasses = true; // Find matching assets and add an entry for each one TArray<FAssetData> SequenceList; AssetRegistryModule.Get().GetAssets(Filter, /*out*/SequenceList); for (auto AssetIt = SequenceList.CreateConstIterator(); AssetIt; ++AssetIt) { const FAssetData& Asset = *AssetIt; UBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass()); if (Asset.IsAssetLoaded()) { TWeakObjectPtr<UAnimSequence> AnimSequence = Cast<UAnimSequence>(Asset.GetAsset()); NodeSpawner->CustomizeNodeDelegate = UBlueprintNodeSpawner::FCustomizeNodeDelegate::CreateStatic(LoadedAssetSetup, AnimSequence); NodeSpawner->DefaultMenuSignature.MenuName = GetTitleGivenAssetInfo(FText::FromName(AnimSequence->GetFName()), AnimSequence->IsValidAdditive()); } else { NodeSpawner->CustomizeNodeDelegate = UBlueprintNodeSpawner::FCustomizeNodeDelegate::CreateStatic(UnloadedAssetSetup, Asset); NodeSpawner->DefaultMenuSignature.MenuName = GetTitleGivenAssetInfo(FText::FromName(Asset.AssetName), /*bKnownToBeAdditive =*/false); } ActionRegistrar.AddBlueprintAction(Asset, NodeSpawner); } } else if (const UAnimSequence* AnimSequence = Cast<UAnimSequence>(QueryObject)) { UBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass()); TWeakObjectPtr<UAnimSequence> SequencePtr = AnimSequence; NodeSpawner->CustomizeNodeDelegate = UBlueprintNodeSpawner::FCustomizeNodeDelegate::CreateStatic(LoadedAssetSetup, SequencePtr); NodeSpawner->DefaultMenuSignature.MenuName = GetTitleGivenAssetInfo(FText::FromName(AnimSequence->GetFName()), AnimSequence->IsValidAdditive()); ActionRegistrar.AddBlueprintAction(QueryObject, NodeSpawner); } else if (QueryObject == GetClass()) { FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")); // define a filter to help in pulling UAnimSequence asset data from the registry FARFilter Filter; Filter.ClassNames.Add(UAnimSequence::StaticClass()->GetFName()); Filter.bRecursiveClasses = true; // Find matching assets and add an entry for each one TArray<FAssetData> SequenceList; AssetRegistryModule.Get().GetAssets(Filter, /*out*/SequenceList); for (auto AssetIt = SequenceList.CreateConstIterator(); AssetIt; ++AssetIt) { const FAssetData& Asset = *AssetIt; if (Asset.IsAssetLoaded()) { continue; } UBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass()); NodeSpawner->CustomizeNodeDelegate = UBlueprintNodeSpawner::FCustomizeNodeDelegate::CreateStatic(UnloadedAssetSetup, Asset); NodeSpawner->DefaultMenuSignature.MenuName = GetTitleGivenAssetInfo(FText::FromName(Asset.AssetName), /*bKnownToBeAdditive =*/false); ActionRegistrar.AddBlueprintAction(Asset, NodeSpawner); } } }
void FPropertyTableColumn::GenerateColumnDisplayName() { TWeakObjectPtr< UObject > Object = DataSource->AsUObject(); TSharedPtr< FPropertyPath > PropertyPath = DataSource->AsPropertyPath(); if ( Object.IsValid() ) { if ( Object->IsA( UProperty::StaticClass() ) ) { const UProperty* Property = Cast< UProperty >( Object.Get() ); DisplayName = FText::FromString(UEditorEngine::GetFriendlyName(Property)); } else { DisplayName = FText::FromString(Object->GetFName().ToString()); } } else if ( PropertyPath.IsValid() ) { //@todo unify this logic with all the property editors [12/11/2012 Justin.Sargent] FString NewName; bool FirstAddition = true; const FPropertyInfo* PreviousPropInfo = NULL; for (int PropertyIndex = 0; PropertyIndex < PropertyPath->GetNumProperties(); PropertyIndex++) { const FPropertyInfo& PropInfo = PropertyPath->GetPropertyInfo( PropertyIndex ); if ( !(PropInfo.Property->IsA( UArrayProperty::StaticClass() ) && PropertyIndex != PropertyPath->GetNumProperties() - 1 ) ) { if ( !FirstAddition ) { NewName += TEXT( "->" ); } FString PropertyName = PropInfo.Property->GetDisplayNameText().ToString(); if ( PropertyName.IsEmpty() ) { PropertyName = PropInfo.Property->GetName(); const bool bIsBoolProperty = Cast<const UBoolProperty>( PropInfo.Property.Get() ) != NULL; if ( PreviousPropInfo != NULL ) { const UStructProperty* ParentStructProperty = Cast<const UStructProperty>( PreviousPropInfo->Property.Get() ); if( ParentStructProperty && ParentStructProperty->Struct->GetFName() == NAME_Rotator ) { if( PropInfo.Property->GetFName() == "Roll" ) { PropertyName = TEXT("X"); } else if( PropInfo.Property->GetFName() == "Pitch" ) { PropertyName = TEXT("Y"); } else if( PropInfo.Property->GetFName() == "Yaw" ) { PropertyName = TEXT("Z"); } else { check(0); } } } PropertyName = FName::NameToDisplayString( PropertyName, bIsBoolProperty ); } NewName += PropertyName; if ( PropInfo.ArrayIndex != INDEX_NONE ) { NewName += FString::Printf( TEXT( "[%d]" ), PropInfo.ArrayIndex ); } PreviousPropInfo = &PropInfo; FirstAddition = false; } } DisplayName = FText::FromString(*NewName); } else { DisplayName = LOCTEXT( "InvalidColumnName", "Invalid Property" ); } }