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

140 lines
6.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "ISceneOutlinerHierarchy.h"
#include "Folder.h"
class FWorldPartitionActorDesc;
class FWorldPartitionActorDescInstance;
class UActorFolder;
class UWorldPartition;
class FActorHierarchy : public ISceneOutlinerHierarchy
{
public:
SCENEOUTLINER_API virtual ~FActorHierarchy();
static TUniquePtr<FActorHierarchy> Create(ISceneOutlinerMode* Mode, const TWeakObjectPtr<UWorld>& World);
/** Create a linearization of all applicable items in the hierarchy */
SCENEOUTLINER_API virtual void CreateItems(TArray<FSceneOutlinerTreeItemPtr>& OutItems) const override;
/** Create a linearization of all direct and indirect children of a given item in the hierarchy */
SCENEOUTLINER_API virtual void CreateChildren(const FSceneOutlinerTreeItemPtr& Item, TArray<FSceneOutlinerTreeItemPtr>& OutChildren) const override;
/** Forcibly create a parent item for a given tree item */
SCENEOUTLINER_API virtual FSceneOutlinerTreeItemPtr FindOrCreateParentItem(const ISceneOutlinerTreeItem& Item, const TMap<FSceneOutlinerTreeItemID, FSceneOutlinerTreeItemPtr>& Items, bool bCreate = false) override;
void SetShowingComponents(bool bInShowingComponents) { bShowingComponents = bInShowingComponents; }
void SetShowingOnlyActorWithValidComponents(bool bInShowingOnlyActorWithValidComponents) { bShowingOnlyActorWithValidComponents = bInShowingOnlyActorWithValidComponents; }
void SetShowingLevelInstances(bool bInShowingLevelInstances) { bShowingLevelInstances = bInShowingLevelInstances; }
void SetShowingUnloadedActors(bool bInShowingUnloadedActors) { bShowingUnloadedActors = bInShowingUnloadedActors; }
void SetShowingEmptyFolders(bool bInShowingEmptyFolders) { bShowingEmptyFolders = bInShowingEmptyFolders; }
void SetSearchComponentsByActorName(bool bInSearchComponentsByActorName) { bSearchComponentsByActorName = bInSearchComponentsByActorName;}
private:
bool IsShowingUnloadedActors() const;
/** Adds all the direct and indirect children of a world to OutItems */
void CreateWorldChildren(UWorld* World, TArray<FSceneOutlinerTreeItemPtr>& OutItems) const;
protected:
// Update the hierarchy when actor or world changing events occur
void OnWorldPartitionCreated(UWorld* InWorld);
/** Create all component items for an actor if we are showing components and place them in OutItems */
SCENEOUTLINER_API void CreateComponentItems(const AActor* Actor, TArray<FSceneOutlinerTreeItemPtr>& OutItems) const;
SCENEOUTLINER_API virtual void OnLevelActorAdded(AActor* InActor);
SCENEOUTLINER_API virtual void OnLevelActorDeleted(AActor* InActor);
SCENEOUTLINER_API virtual void OnLevelActorAttached(AActor* InActor, const AActor* InParent);
SCENEOUTLINER_API virtual void OnLevelActorDetached(AActor* InActor, const AActor* InParent);
SCENEOUTLINER_API virtual void OnLevelActorFolderChanged(const AActor* InActor, FName OldPath);
SCENEOUTLINER_API virtual void OnLoadedActorAdded(AActor& InActor);
SCENEOUTLINER_API virtual void OnLoadedActorRemoved(AActor& InActor);
SCENEOUTLINER_API virtual void OnActorDescInstanceAdded(FWorldPartitionActorDescInstance* InActorDescInstance);
SCENEOUTLINER_API virtual void OnActorDescInstanceRemoved(FWorldPartitionActorDescInstance* InActorDescInstance);
UE_DEPRECATED(5.4, "Use OnActorDescInstanceAdded instead")
SCENEOUTLINER_API virtual void OnActorDescAdded(FWorldPartitionActorDesc* ActorDesc) {}
UE_DEPRECATED(5.4, "Use OnActorDescInstanceRemoved instead")
SCENEOUTLINER_API virtual void OnActorDescRemoved(FWorldPartitionActorDesc* ActorDesc) {}
void OnComponentsUpdated();
void OnLevelActorListChanged();
SCENEOUTLINER_API virtual void OnActorFolderAdded(UActorFolder* InActorFolder);
void OnActorFoldersUpdatedEvent(ULevel* InLevel);
SCENEOUTLINER_API virtual void OnLevelAdded(ULevel* InLevel, UWorld* InWorld);
SCENEOUTLINER_API virtual void OnLevelRemoved(ULevel* InLevel, UWorld* InWorld);
void OnWorldPartitionInitialized(UWorldPartition* InWorldPartition);
void OnWorldPartitionUninitialized(UWorldPartition* InWorldPartition);
/** Called when a folder is to be created */
SCENEOUTLINER_API virtual void OnBroadcastFolderCreate(UWorld& InWorld, const FFolder& InNewFolder);
/** Called when a folder is to be moved */
SCENEOUTLINER_API virtual void OnBroadcastFolderMove(UWorld& InWorld, const FFolder& InOldFolder, const FFolder& InNewFolder);
/** Called when a folder is to be deleted */
SCENEOUTLINER_API virtual void OnBroadcastFolderDelete(UWorld& InWorld, const FFolder& InFolder);
// Remove the unloaded actor item for the given actor
SCENEOUTLINER_API void RemoveActorDesc(AActor& InActor);
// Add the unloaded actor item for the given actor
SCENEOUTLINER_API void AddActorDesc(AActor& InActor);
// Remove all Actor Folders belonging to this level
SCENEOUTLINER_API void RemoveLevelActorFolders(ULevel* InLevel, UWorld* InWorld);
// Create items for Actor Folders
SCENEOUTLINER_API void CreateFolderItems(UWorld* InWorld, TArray<FSceneOutlinerTreeItemPtr>& OutItems) const;
// Create items for unloaded actors
SCENEOUTLINER_API void CreateUnloadedItems(UWorld* World, TArray<FSceneOutlinerTreeItemPtr>& OutItems) const;
// Insert the given item at the right position in the tree, and optionally create and insert components if needed
SCENEOUTLINER_API void InsertActorItemAndCreateComponents(AActor* InActor, FSceneOutlinerTreeItemPtr ActorItem, TArray<FSceneOutlinerTreeItemPtr>& OutItems) const;
// Check if the actor we are creating an item for is in the current level instance, if we are currently editing one
SCENEOUTLINER_API bool CheckLevelInstanceEditing(UWorld* World, AActor* Actor) const;
// Create a SceneOutlinerTreeItem for the given actor
SCENEOUTLINER_API virtual FSceneOutlinerTreeItemPtr CreateItemForActor(AActor* InActor, bool bForce = false) const;
// Create a SceneOutlinerTreeItem for the given actor descriptor instance
SCENEOUTLINER_API virtual FSceneOutlinerTreeItemPtr CreateItemForActorDescInstance(const FWorldPartitionActorDescInstance* InActorDescInstance, bool bForce = false) const;
SCENEOUTLINER_API virtual FSceneOutlinerTreeItemPtr CreateItemForFolder(const FFolder& InFolder, const TWeakObjectPtr<UWorld>& InWorld, bool bForce = false) const;
protected:
/** Send a an event indicating a full refresh of the hierarchy is required */
void FullRefreshEvent();
TWeakObjectPtr<UWorld> RepresentingWorld;
bool bShowingComponents = false;
bool bShowingOnlyActorWithValidComponents = false;
bool bShowingLevelInstances = false;
bool bShowingUnloadedActors = false;
bool bShowingEmptyFolders = false;
bool bSearchComponentsByActorName = false;
protected:
SCENEOUTLINER_API static void Create_Internal(FActorHierarchy* Hierarchy, const TWeakObjectPtr<UWorld>& World);
SCENEOUTLINER_API FActorHierarchy(ISceneOutlinerMode* Mode, const TWeakObjectPtr<UWorld>& Worlds);
FActorHierarchy(const FActorHierarchy&) = delete;
FActorHierarchy& operator=(const FActorHierarchy&) = delete;
};