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

140 lines
5.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "EditorDirectories.h"
#include "CoreGlobals.h"
#include "HAL/FileManager.h"
#include "HAL/Platform.h"
#include "Misc/AssertionMacros.h"
#include "Misc/ConfigCacheIni.h"
#include "Misc/Paths.h"
#include "Templates/UnrealTemplate.h"
FEditorDirectories& FEditorDirectories::Get()
{
static FEditorDirectories Directories;
return Directories;
}
FEditorDirectories::FEditorDirectories() :
bHasLoaded(false)
{
ConfigFile = GEditorPerProjectIni;
ConfigSectionName = TEXT("Directories2");
}
void FEditorDirectories::LoadLastDirectories()
{
for( int32 CurDirectoryIndex = 0; CurDirectoryIndex < UE_ARRAY_COUNT( LastDir ); ++CurDirectoryIndex )
{
LastDir[CurDirectoryIndex].Reset();
}
// NOTE: We append a "2" to the section name to enforce backwards compatibility. "Directories" is deprecated.
GConfig->GetString( *ConfigSectionName, TEXT("UNR"), LastDir[ELastDirectory::UNR], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("BRUSH"), LastDir[ELastDirectory::BRUSH], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("FBX"), LastDir[ELastDirectory::FBX], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("FBXAnim"), LastDir[ELastDirectory::FBX_ANIM], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("GenericImport"), LastDir[ELastDirectory::GENERIC_IMPORT], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("GenericExport"), LastDir[ELastDirectory::GENERIC_EXPORT], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("GenericOpen"), LastDir[ELastDirectory::GENERIC_OPEN], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("GenericSave"), LastDir[ELastDirectory::GENERIC_SAVE], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("MeshImportExport"), LastDir[ELastDirectory::MESH_IMPORT_EXPORT], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("WorldRoot"), LastDir[ELastDirectory::WORLD_ROOT], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("Level"), LastDir[ELastDirectory::LEVEL], ConfigFile );
GConfig->GetString( *ConfigSectionName, TEXT("Project"), LastDir[ELastDirectory::PROJECT], ConfigFile );
// Set up some defaults if they're not defined in the ini
if (DefaultDir.IsEmpty())
{
DefaultDir = FPaths::ProjectContentDir();
}
for( int32 CurDirectoryIndex = 0; CurDirectoryIndex < UE_ARRAY_COUNT( LastDir ); ++CurDirectoryIndex )
{
if (LastDir[ CurDirectoryIndex ].IsEmpty())
{
// Default all directories to the game content folder
if (CurDirectoryIndex == ELastDirectory::LEVEL)
{
const FString DefaultMapDir = DefaultDir / TEXT("Maps");
if( IFileManager::Get().DirectoryExists( *DefaultMapDir ) )
{
LastDir[CurDirectoryIndex] = DefaultMapDir;
continue;
}
}
else if (CurDirectoryIndex == ELastDirectory::PROJECT)
{
LastDir[CurDirectoryIndex] = FPaths::RootDir();
continue;
}
// Set to the default dir
LastDir[ CurDirectoryIndex ] = DefaultDir;
}
}
bHasLoaded = true;
}
/** Writes the current "LastDir" array back out to the config files */
void FEditorDirectories::SaveLastDirectories()
{
ensure(bHasLoaded);
// Save out default file directories
GConfig->SetString( *ConfigSectionName, TEXT("UNR"), *LastDir[ELastDirectory::UNR], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("BRUSH"), *LastDir[ELastDirectory::BRUSH], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("FBX"), *LastDir[ELastDirectory::FBX], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("FBXAnim"), *LastDir[ELastDirectory::FBX_ANIM], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("GenericImport"), *LastDir[ELastDirectory::GENERIC_IMPORT], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("GenericExport"), *LastDir[ELastDirectory::GENERIC_EXPORT], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("GenericOpen"), *LastDir[ELastDirectory::GENERIC_OPEN], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("GenericSave"), *LastDir[ELastDirectory::GENERIC_SAVE], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("MeshImportExport"), *LastDir[ELastDirectory::MESH_IMPORT_EXPORT], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("WorldRoot"), *LastDir[ELastDirectory::WORLD_ROOT], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("Level"), *LastDir[ELastDirectory::LEVEL], ConfigFile );
GConfig->SetString( *ConfigSectionName, TEXT("Project"), *LastDir[ELastDirectory::PROJECT], ConfigFile );
}
FString FEditorDirectories::GetLastDirectory( const ELastDirectory::Type InLastDir ) const
{
if ( InLastDir >= 0 && InLastDir < UE_ARRAY_COUNT( LastDir ) )
{
return LastDir[InLastDir];
}
return DefaultDir;
}
void FEditorDirectories::SetLastDirectory( const ELastDirectory::Type InLastDir, const FString& InLastStr )
{
if ( InLastDir >= 0 && InLastDir < UE_ARRAY_COUNT( LastDir ) )
{
LastDir[InLastDir] = InLastStr;
}
}
void FEditorDirectories::SetOverride(const FString& InConfigFile, const FString& InConfigSectionName, const FString& InDefaultDir)
{
// Prevent saving before config has been loaded otherwise data will be lost
if (bHasLoaded)
{
SaveLastDirectories();
}
ConfigFile = InConfigFile;
ConfigSectionName = InConfigSectionName;
DefaultDir = InDefaultDir;
LoadLastDirectories();
}
void FEditorDirectories::ResetOverride()
{
SaveLastDirectories();
ConfigFile = GEditorPerProjectIni;
ConfigSectionName = TEXT("Directories2");
DefaultDir.Reset();
LoadLastDirectories();
}