Files
UnrealEngine/Engine/Source/Editor/UMGEditor/Private/Templates/WidgetTemplateBlueprintClass.cpp
2025-05-18 13:04:45 +08:00

127 lines
4.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Templates/WidgetTemplateBlueprintClass.h"
#include "Widgets/SToolTip.h"
#include "IDocumentation.h"
#include "UObject/CoreRedirects.h"
#include "WidgetBlueprint.h"
#include "WidgetBlueprintEditorUtils.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include "Styling/SlateIconFinder.h"
#include "Subsystems/AssetEditorSubsystem.h"
#include "Engine/BlueprintGeneratedClass.h"
#include "Editor.h"
#define LOCTEXT_NAMESPACE "UMGEditor"
//FWidgetTemplateBlueprintClass::FWidgetTemplateBlueprintClass(const FAssetData& InWidgetAssetData, TSubclassOf<UUserWidget> InUserWidgetClass, bool bInIsBlueprintGeneratedClass)
// : FWidgetTemplateBlueprintClass(InWidgetAssetData, InUserWidgetClass)
//{}
FWidgetTemplateBlueprintClass::FWidgetTemplateBlueprintClass(const FAssetData& InWidgetAssetData, TSubclassOf<UUserWidget> InUserWidgetClass)
: FWidgetTemplateClass(InWidgetAssetData, InUserWidgetClass)
{
// Blueprints get the class type actions for their parent native class - this avoids us having to load the blueprint
static const FTopLevelAssetPath WidgetBlueprintGeneratedClassAssetPath = UWidgetBlueprintGeneratedClass::StaticClass()->GetClassPathName();
static const FTopLevelAssetPath BlueprintGeneratedClassAssetPath = UBlueprintGeneratedClass::StaticClass()->GetClassPathName();
bool bClassIsUWidgetBlueprintGeneratedClass = Cast<UBlueprintGeneratedClass>(InUserWidgetClass.Get()) != nullptr;
bIsBlueprintGeneratedClass = WidgetBlueprintGeneratedClassAssetPath == InWidgetAssetData.AssetClassPath
|| BlueprintGeneratedClassAssetPath == InWidgetAssetData.AssetClassPath
|| bClassIsUWidgetBlueprintGeneratedClass;
if (bIsBlueprintGeneratedClass && !InUserWidgetClass && InWidgetAssetData.IsValid())
{
FString ParentClassName;
if (!WidgetAssetData.GetTagValue(FBlueprintTags::NativeParentClassPath, ParentClassName))
{
WidgetAssetData.GetTagValue(FBlueprintTags::ParentClassPath, ParentClassName);
}
if (!ParentClassName.IsEmpty())
{
const FString RedirectedClassPath = FCoreRedirects::GetRedirectedName(ECoreRedirectFlags::Type_Class, FCoreRedirectObjectName(ParentClassName)).ToString();
CachedParentClass = UClass::TryFindTypeSlow<UClass>(FPackageName::ExportTextPathToObjectPath(RedirectedClassPath));
}
}
}
FWidgetTemplateBlueprintClass::~FWidgetTemplateBlueprintClass()
{
}
FText FWidgetTemplateBlueprintClass::GetCategory() const
{
if (WidgetClass.Get())
{
return FWidgetBlueprintEditorUtils::GetPaletteCategory(WidgetClass.Get());
}
else
{
return FWidgetBlueprintEditorUtils::GetPaletteCategory(WidgetAssetData, CachedParentClass.Get());
}
}
UWidget* FWidgetTemplateBlueprintClass::Create(UWidgetTree* Tree)
{
// Load the blueprint asset or blueprint generated class if needed
if (!WidgetClass.Get())
{
FString AssetPath = WidgetAssetData.GetObjectPathString();
if (bIsBlueprintGeneratedClass)
{
WidgetClass = LoadObject<UBlueprintGeneratedClass>(nullptr, *AssetPath);
}
else if (UBlueprint* LoadedWidget = LoadObject<UBlueprint>(nullptr, *AssetPath))
{
WidgetClass = *LoadedWidget->GeneratedClass;
}
}
return FWidgetTemplateClass::CreateNamed(Tree, FName(*FBlueprintEditorUtils::GetClassNameWithoutSuffix(WidgetClass.Get())));
}
const FSlateBrush* FWidgetTemplateBlueprintClass::GetIcon() const
{
if (CachedParentClass.IsValid() && CachedParentClass->IsChildOf(UWidget::StaticClass()) && !CachedParentClass->IsChildOf(UUserWidget::StaticClass()))
{
return FSlateIconFinder::FindIconBrushForClass(CachedParentClass.Get());
}
else
{
return FSlateIconFinder::FindIconBrushForClass(UUserWidget::StaticClass());
}
}
TSharedRef<IToolTip> FWidgetTemplateBlueprintClass::GetToolTip() const
{
FText Description;
FString DescriptionStr = WidgetAssetData.GetTagValueRef<FString>( GET_MEMBER_NAME_CHECKED( UBlueprint, BlueprintDescription ) );
if ( !DescriptionStr.IsEmpty() )
{
DescriptionStr.ReplaceInline( TEXT( "\\n" ), TEXT( "\n" ) );
Description = FText::FromString( MoveTemp(DescriptionStr) );
}
else
{
Description = Name;
}
return IDocumentation::Get()->CreateToolTip( Description, nullptr, FString( TEXT( "Shared/Types/" ) ) + Name.ToString(), TEXT( "Class" ) );
}
FReply FWidgetTemplateBlueprintClass::OnDoubleClicked()
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset( WidgetAssetData.GetAsset() );
return FReply::Handled();
}
bool FWidgetTemplateBlueprintClass::Supports(UClass* InClass)
{
return InClass != nullptr && InClass->IsChildOf(UWidgetBlueprint::StaticClass());
}
#undef LOCTEXT_NAMESPACE