Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Public/WorldFolders.h
2025-05-18 13:04:45 +08:00

129 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "UObject/Object.h"
#include "UObject/WeakObjectPtr.h"
#include "Misc/Guid.h"
#include "WorldFoldersImplementation.h"
#include "WorldPersistentFolders.h"
#include "WorldTransientFolders.h"
#include "WorldFolders.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogWorldFolders, Log, All)
USTRUCT()
struct FActorFolderProps
{
GENERATED_USTRUCT_BODY()
FActorFolderProps() : bIsExpanded(true) {}
FORCEINLINE friend FArchive& operator<<(FArchive& Ar, FActorFolderProps& Folder)
{
return Ar << Folder.bIsExpanded;
}
bool bIsExpanded;
};
USTRUCT()
struct FActorPlacementFolder
{
GENERATED_BODY()
UPROPERTY()
FName Path;
UPROPERTY()
TWeakObjectPtr<UObject> RootObjectPtr;
UPROPERTY()
FGuid ActorFolderGuid;
void Reset()
{
Path = NAME_None;
RootObjectPtr.Reset();
ActorFolderGuid.Invalidate();
}
FActorPlacementFolder& operator = (const FFolder& InOtherFolder)
{
Path = InOtherFolder.GetPath();
RootObjectPtr = InOtherFolder.GetRootObjectPtr();
ActorFolderGuid = InOtherFolder.GetActorFolderGuid();
return *this;
}
FFolder GetFolder() const
{
FFolder::FRootObject RootObject = FFolder::FRootObject(RootObjectPtr.Get());
return ActorFolderGuid.IsValid() ? FFolder(RootObject, ActorFolderGuid) : FFolder(RootObject, Path);
}
};
/** Per-World Actor Folders UObject (used to support undo/redo reliably) */
UCLASS(MinimalAPI)
class UWorldFolders : public UObject
{
public:
GENERATED_BODY()
UNREALED_API void Initialize(UWorld* InWorld);
UNREALED_API void RebuildList();
UNREALED_API bool AddFolder(const FFolder& InFolder);
UNREALED_API bool RemoveFolder(const FFolder& InFolder, bool bShouldDeleteFolder = false);
UNREALED_API bool RenameFolder(const FFolder& InOldFolder, const FFolder& InNewFolder);
UNREALED_API bool IsFolderExpanded(const FFolder& InFolder) const;
UNREALED_API bool SetIsFolderExpanded(const FFolder& InFolder, bool bIsExpanded);
UNREALED_API FFolder GetActorEditorContextFolder(bool bMustMatchCurrentLevel) const;
UNREALED_API bool SetActorEditorContextFolder(const FFolder& InFolder);
UNREALED_API void PushActorEditorContext(bool bDuplicateContext = false);
UNREALED_API void PopActorEditorContext();
UNREALED_API bool ContainsFolder(const FFolder& InFolder) const;
UNREALED_API void ForEachFolder(TFunctionRef<bool(const FFolder&)> Operation);
UNREALED_API void ForEachFolderWithRootObject(const FFolder::FRootObject& InFolderRootObject, TFunctionRef<bool(const FFolder&)> Operation);
UNREALED_API void SaveState();
UNREALED_API UWorld* GetWorld() const;
//~ Begin UObject
UNREALED_API virtual void Serialize(FArchive& Ar) override;
//~ End UObject
//~ Begin Deprecated
UNREALED_API FActorFolderProps* GetFolderProperties(const FFolder& InFolder);
//~ End Deprecated
private:
UNREALED_API void BroadcastOnActorFolderCreated(const FFolder& InFolder);
UNREALED_API void BroadcastOnActorFolderDeleted(const FFolder& InFolder);
UNREALED_API void BroadcastOnActorFolderMoved(const FFolder& InSrcFolder, const FFolder& InDstFolder);
UNREALED_API FWorldFoldersImplementation& GetImpl(const FFolder& InFolder) const;
UNREALED_API bool IsUsingPersistentFolders(const FFolder& InFolder) const;
UNREALED_API FString GetWorldStateFilename() const;
UNREALED_API void LoadState();
TUniquePtr<FWorldPersistentFolders> PersistentFolders;
TUniquePtr<FWorldTransientFolders> TransientFolders;
TWeakObjectPtr<UWorld> World;
TMap<FFolder, FActorFolderProps> FoldersProperties;
TMap<FFolder, FActorFolderProps> LoadedStateFoldersProperties;
UPROPERTY()
FActorPlacementFolder CurrentFolder;
TArray<FActorPlacementFolder> CurrentFolderStack;
friend class FWorldFoldersImplementation;
friend class FWorldPersistentFolders;
friend class FWorldTransientFolders;
};