Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/Subsystems/BrowseToAssetOverrideSubsystem.cpp
2025-05-18 13:04:45 +08:00

89 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Subsystems/BrowseToAssetOverrideSubsystem.h"
#include "Editor.h"
#include "GameFramework/Actor.h"
UBrowseToAssetOverrideSubsystem* UBrowseToAssetOverrideSubsystem::Get()
{
if (GEditor)
{
return GEditor->GetEditorSubsystem<UBrowseToAssetOverrideSubsystem>();
}
return nullptr;
}
FName UBrowseToAssetOverrideSubsystem::GetBrowseToAssetOverride(const UObject* Object)
{
// Actors also allow this to be overridden per-instance via meta-data
// If set, that takes priority over any per-class overrides
if (const AActor* Actor = Cast<AActor>(Object))
{
const FString& ActorBrowseToAssetOverride = Actor->GetBrowseToAssetOverride();
if (!ActorBrowseToAssetOverride.IsEmpty())
{
return *ActorBrowseToAssetOverride;
}
}
// Walk the class hierarchy to see if there's a valid per-class override for this instance
if (PerClassOverrides.Num() > 0)
{
for (const UClass* Class = Object->GetClass(); Class; Class = Class->GetSuperClass())
{
if (const FBrowseToAssetOverrideDelegate* CallbackPtr = PerClassOverrides.Find(Class->GetClassPathName()))
{
FName CallbackBrowseToAssetOverride = CallbackPtr->IsBound() ? CallbackPtr->Execute(Object) : FName();
if (!CallbackBrowseToAssetOverride.IsNone())
{
return CallbackBrowseToAssetOverride;
}
}
}
}
// Query all the class interfaces to see if there's a valid per-interface override for this instance
if (PerInterfaceOverrides.Num() > 0)
{
for (const UClass* ObjectClass = Object->GetClass(); ObjectClass; ObjectClass = ObjectClass->GetSuperClass())
{
for (const FImplementedInterface& Interface : ObjectClass->Interfaces)
{
if (const FBrowseToAssetOverrideDelegate* CallbackPtr = PerInterfaceOverrides.Find(Interface.Class->GetClassPathName()))
{
FName CallbackBrowseToAssetOverride = CallbackPtr->IsBound() ? CallbackPtr->Execute(Object) : FName();
if (!CallbackBrowseToAssetOverride.IsNone())
{
return CallbackBrowseToAssetOverride;
}
}
}
}
}
return FName();
}
void UBrowseToAssetOverrideSubsystem::RegisterBrowseToAssetOverrideForClass(const FTopLevelAssetPath& Class, FBrowseToAssetOverrideDelegate&& Callback)
{
PerClassOverrides.Add(Class, MoveTemp(Callback));
}
void UBrowseToAssetOverrideSubsystem::UnregisterBrowseToAssetOverrideForClass(const FTopLevelAssetPath& Class)
{
PerClassOverrides.Remove(Class);
}
void UBrowseToAssetOverrideSubsystem::RegisterBrowseToAssetOverrideForInterface(const FTopLevelAssetPath& Interface, FBrowseToAssetOverrideDelegate&& Callback)
{
PerInterfaceOverrides.Add(Interface, MoveTemp(Callback));
}
void UBrowseToAssetOverrideSubsystem::UnregisterBrowseToAssetOverrideForInterface(const FTopLevelAssetPath& Interface)
{
PerInterfaceOverrides.Remove(Interface);
}