Files
2025-05-18 13:04:45 +08:00

146 lines
4.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MVVMBlueprintFunctionReference.h"
#include "BlueprintCompilationManager.h"
#include "Engine/Blueprint.h"
#include "Kismet2/BlueprintEditorUtils.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(MVVMBlueprintFunctionReference)
#define LOCTEXT_NAMESPACE "MVVMBlueprintFunctionReference"
FMVVMBlueprintFunctionReference::FMVVMBlueprintFunctionReference(const UBlueprint* InContext, const UFunction* InFunction)
: Type(EMVVMBlueprintFunctionReferenceType::None)
{
UClass* OwnerClass = InFunction ? InFunction->GetOwnerClass() : nullptr;
ensure(OwnerClass);
if (!OwnerClass)
{
return;
}
Type = EMVVMBlueprintFunctionReferenceType::Function;
FName FieldName = InFunction->GetFName();
FGuid MemberGuid;
UBlueprint::GetGuidFromClassByFieldName<UFunction>(OwnerClass, FieldName, MemberGuid);
// Set the member reference
bool bIsSelf = (InContext->GeneratedClass && InContext->GeneratedClass->IsChildOf(OwnerClass))
|| (InContext->SkeletonGeneratedClass && InContext->SkeletonGeneratedClass->IsChildOf(OwnerClass));
if (bIsSelf)
{
FunctionReference.SetSelfMember(FieldName, MemberGuid);
}
else
{
FGuid Guid;
if (UBlueprint* VariableOwnerBP = Cast<UBlueprint>(OwnerClass->ClassGeneratedBy))
{
OwnerClass = VariableOwnerBP->SkeletonGeneratedClass ? VariableOwnerBP->SkeletonGeneratedClass : VariableOwnerBP->GeneratedClass;
}
FunctionReference.SetExternalMember(FieldName, OwnerClass, MemberGuid);
}
}
FMVVMBlueprintFunctionReference::FMVVMBlueprintFunctionReference(FMemberReference InReference)
: FunctionReference(MoveTemp(InReference))
, Type(EMVVMBlueprintFunctionReferenceType::Function)
{}
FMVVMBlueprintFunctionReference::FMVVMBlueprintFunctionReference(TSubclassOf<UK2Node> InNode)
: Node(InNode)
, Type(InNode.Get() != nullptr ? EMVVMBlueprintFunctionReferenceType::Node : EMVVMBlueprintFunctionReferenceType::None)
{
}
const UFunction* FMVVMBlueprintFunctionReference::GetFunction(const UBlueprint* SelfContext) const
{
UClass* ContextClass = SelfContext->SkeletonGeneratedClass ? SelfContext->SkeletonGeneratedClass : SelfContext->GeneratedClass;
return GetFunction(ContextClass);
}
const UFunction* FMVVMBlueprintFunctionReference::GetFunction(const UClass* SelfContext) const
{
if (Type != EMVVMBlueprintFunctionReferenceType::Function)
{
return nullptr;
}
if (FunctionReference.GetMemberName().IsNone())
{
return nullptr;
}
if (!FBlueprintCompilationManager::IsGeneratedClassLayoutReady())
{
SelfContext = FBlueprintEditorUtils::GetSkeletonClass(FunctionReference.GetMemberParentClass(const_cast<UClass*>(SelfContext)));
}
return FunctionReference.ResolveMember<UFunction>(const_cast<UClass*>(SelfContext), false);
}
TSubclassOf<UK2Node> FMVVMBlueprintFunctionReference::GetNode() const
{
return Type == EMVVMBlueprintFunctionReferenceType::Node ? Node : TSubclassOf<UK2Node>();
}
bool FMVVMBlueprintFunctionReference::IsValid(const UBlueprint* SelfContext) const
{
return GetFunction(SelfContext) != nullptr || GetNode().Get() != nullptr;
}
bool FMVVMBlueprintFunctionReference::IsValid(const UClass* SelfContext) const
{
return GetFunction(SelfContext) != nullptr || GetNode().Get() != nullptr;
}
bool FMVVMBlueprintFunctionReference::operator==(const FMVVMBlueprintFunctionReference& Other) const
{
if (Type != Other.Type)
{
return false;
}
switch (Type)
{
case EMVVMBlueprintFunctionReferenceType::Function:
return FunctionReference.IsSameReference(Other.FunctionReference);
case EMVVMBlueprintFunctionReferenceType::Node:
return Node == Other.Node;
case EMVVMBlueprintFunctionReferenceType::None:
return true;
default:
check(false);
return false;
}
}
FString FMVVMBlueprintFunctionReference::ToString() const
{
switch (Type)
{
case EMVVMBlueprintFunctionReferenceType::Function:
return FunctionReference.GetMemberName().ToString();
case EMVVMBlueprintFunctionReferenceType::Node:
return Node.Get() ? Node.Get()->GetName() : FString();
}
return FString();
}
FName FMVVMBlueprintFunctionReference::GetName() const
{
switch (Type)
{
case EMVVMBlueprintFunctionReferenceType::Function:
return FunctionReference.GetMemberName();
case EMVVMBlueprintFunctionReferenceType::Node:
return Node.Get() ? Node.Get()->GetFName() : FName();
}
return FName();
}
#undef LOCTEXT_NAMESPACE