EM_Task/UnrealEd/Private/Tools/EditorToolAssetAPI.cpp

99 lines
3.6 KiB
C++
Raw Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
#include "Tools/EditorToolAssetAPI.h"
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/Classes/Engine/World.h"
#include "AssetRegistryModule.h"
#include "AssetToolsModule.h"
#include "FileHelpers.h"
// for content-browser things
#include "ContentBrowserModule.h"
#include "IContentBrowserSingleton.h"
FString FEditorToolAssetAPI::GetActiveAssetFolderPath()
{
IContentBrowserSingleton& ContentBrowser = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser").Get();
return ContentBrowser.GetCurrentPath();
}
FString FEditorToolAssetAPI::GetWorldRelativeAssetRootPath(const UWorld* World)
{
if (ensure(World->GetOutermost() != nullptr) == false)
{
return TEXT("/Game/");
}
FString WorldPackageName = World->GetOutermost()->GetName();
FString WorldPackageFolder = FPackageName::GetLongPackagePath(WorldPackageName);
return WorldPackageFolder;
}
FString FEditorToolAssetAPI::InteractiveSelectAssetPath(const FString& DefaultAssetName, const FText& DialogTitleMessage)
{
IContentBrowserSingleton& ContentBrowser = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser").Get();
FString UseDefaultAssetName = DefaultAssetName;
FString CurrentPath = GetActiveAssetFolderPath();
if (CurrentPath.IsEmpty() == false)
{
UseDefaultAssetName = MakeUniqueAssetName(CurrentPath, DefaultAssetName);
}
FSaveAssetDialogConfig Config;
Config.DefaultAssetName = UseDefaultAssetName;
Config.DialogTitleOverride = DialogTitleMessage;
Config.DefaultPath = CurrentPath;
return ContentBrowser.CreateModalSaveAssetDialog(Config);
}
UPackage* FEditorToolAssetAPI::MakeNewAssetPackage(const FString& FolderPath, const FString& AssetBaseName, FString& UniqueAssetName)
{
FString UniquePackageName;
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
AssetToolsModule.Get().CreateUniqueAssetName(
FolderPath + TEXT("/") + AssetBaseName, TEXT(""), UniquePackageName, UniqueAssetName);
UPackage* AssetPackage = CreatePackage(*UniquePackageName);
return AssetPackage;
}
FString FEditorToolAssetAPI::MakeUniqueAssetName(const FString& FolderPath, const FString& AssetBaseName)
{
FString UniquePackageName, UniqueAssetName;
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
AssetToolsModule.Get().CreateUniqueAssetName(
FolderPath + TEXT("/") + AssetBaseName, TEXT(""), UniquePackageName, UniqueAssetName);
return UniqueAssetName;
}
void FEditorToolAssetAPI::InteractiveSaveGeneratedAsset(UObject* Asset, UPackage* AssetPackage)
{
Asset->MarkPackageDirty();
FAssetRegistryModule::AssetCreated(Asset);
TArray<UPackage*> PackagesToSave;
PackagesToSave.Add(AssetPackage);
bool bCheckDirty = true;
bool bPromptToSave = true;
FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave);
}
void FEditorToolAssetAPI::AutoSaveGeneratedAsset(UObject* Asset, UPackage* AssetPackage)
{
Asset->MarkPackageDirty();
FAssetRegistryModule::AssetCreated(Asset);
TArray<UPackage*> PackagesToSave;
PackagesToSave.Add(AssetPackage);
bool bCheckDirty = true;
bool bPromptToSave = false;
FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, bCheckDirty, bPromptToSave);
}
void FEditorToolAssetAPI::NotifyGeneratedAssetModified(UObject* Asset, UPackage* AssetPackage)
{
Asset->MarkPackageDirty();
FAssetRegistryModule::AssetCreated(Asset);
}