Files
UnrealEngine/Engine/Plugins/Enterprise/VariantManager/Source/VariantManager/Private/VariantManagerModule.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

123 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "VariantManagerModule.h"
#include "LevelVariantSets.h"
#include "LevelVariantSetsEditorToolkit.h"
#include "VariantManager.h"
#include "VariantManagerContentEditorModule.h"
#include "VariantManagerEditorCommands.h"
#include "VariantManagerStyle.h"
#include "LevelEditor.h"
#include "Widgets/Docking/SDockTab.h"
#include "WorkspaceMenuStructure.h"
#include "WorkspaceMenuStructureModule.h"
#include "VariantManagerUtils.h"
#define LOCTEXT_NAMESPACE "VariantManagerModule"
class FVariantManagerModule : public IVariantManagerModule
{
public:
virtual void StartupModule() override
{
FVariantManagerEditorCommands::Register();
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>(TEXT("LevelEditor"));
// Register a delegate to detect whenever we should open an editor for a LevelVariantSets asset, and relay the
// data to LevelVariantSetsEditorToolkit, which will spawn a VariantManager
IVariantManagerContentEditorModule& ContentEditorModule = FModuleManager::LoadModuleChecked<IVariantManagerContentEditorModule>(VARIANTMANAGERCONTENTEDITORMODULE_MODULE_NAME);
FOnLevelVariantSetsEditor LevelVariantSetsEditorDelegate = FOnLevelVariantSetsEditor::CreateStatic( FVariantManagerModule::OnLevelVariantSetsEditor );
ContentEditorModule.RegisterOnLevelVariantSetsDelegate( LevelVariantSetsEditorDelegate );
// We need to register a tab spawner now so that old tabs that were open when we closed the editor can be reopened
// correctly displaying the "Variant Manager" title
// Sadly this code runs after the LevelEditorModule is loaded, but before it has created its TabManager. We need to
// subscribe to this event then, so that as soon as its created we'll register this spawner
OnTabManagerChangedSubscription = LevelEditorModule.OnTabManagerChanged().AddLambda([ &LevelEditorModule ]()
{
RegisterTabSpawner( LevelEditorModule.GetLevelEditorTabManager() );
});
// Make sure we update the cached FProperty pointers we use for exception properties whenever hot reload happens to a relevant class
FVariantManagerUtils::RegisterForHotReload();
}
virtual void ShutdownModule() override
{
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>(TEXT("LevelEditor"));
LevelEditorModule.OnTabManagerChanged().Remove(OnTabManagerChangedSubscription);
IVariantManagerContentEditorModule& ContentEditorModule = FModuleManager::LoadModuleChecked<IVariantManagerContentEditorModule>(VARIANTMANAGERCONTENTEDITORMODULE_MODULE_NAME);
ContentEditorModule.UnregisterOnLevelVariantSetsDelegate();
UnregisterTabSpawner( LevelEditorModule.GetLevelEditorTabManager() );
FVariantManagerUtils::UnregisterForHotReload();
FVariantManagerEditorCommands::Unregister();
}
virtual TSharedRef<FVariantManager> CreateVariantManager(ULevelVariantSets* InLevelVariantSets) override
{
TSharedRef<FVariantManager> VariantManager = MakeShareable(new FVariantManager);
VariantManager->InitVariantManager(InLevelVariantSets);
return VariantManager;
}
static void RegisterTabSpawner( const TSharedPtr< FTabManager >& TabManager )
{
if ( !TabManager )
{
return;
}
if ( TabManager->HasTabSpawner( FLevelVariantSetsEditorToolkit::GetVariantManagerTabID() ) )
{
UnregisterTabSpawner( TabManager );
}
const FName VariantManagerStyleSetName = FVariantManagerStyle::Get().GetStyleSetName();
TabManager->RegisterTabSpawner( FLevelVariantSetsEditorToolkit::GetVariantManagerTabID(), FOnSpawnTab::CreateStatic( &FVariantManagerModule::HandleTabManagerSpawnTab ) )
.SetDisplayName( LOCTEXT("VariantManagerMainTab", "Variant Manager") )
.SetGroup( WorkspaceMenu::GetMenuStructure().GetLevelEditorCategory() )
.SetIcon( FSlateIcon(VariantManagerStyleSetName, "VariantManager.Icon") );
}
static void UnregisterTabSpawner( const TSharedPtr< FTabManager >& TabManager )
{
if ( !TabManager )
{
return;
}
TabManager->UnregisterTabSpawner( FLevelVariantSetsEditorToolkit::GetVariantManagerTabID() );
}
static TSharedRef<SDockTab> HandleTabManagerSpawnTab(const FSpawnTabArgs& Args)
{
return SNew(SDockTab)
.Label(LOCTEXT("VariantManagerMainTitle", "Variant Manager"))
.TabColorScale( FLevelVariantSetsEditorToolkit::GetWorldCentricTabColorScaleStatic() )
.ContentPadding(FMargin(0))
.TabRole(ETabRole::PanelTab);
}
static void OnLevelVariantSetsEditor(const EToolkitMode::Type Mode, const TSharedPtr<class IToolkitHost>& EditWithinLevelEditor, class ULevelVariantSets* LevelVariantSets)
{
TSharedRef<FLevelVariantSetsEditorToolkit> Toolkit = MakeShareable(new FLevelVariantSetsEditorToolkit());
Toolkit->Initialize(Mode, EditWithinLevelEditor, LevelVariantSets);
}
private:
FDelegateHandle OnTabManagerChangedSubscription;
};
IMPLEMENT_MODULE(FVariantManagerModule, VariantManager);
#undef LOCTEXT_NAMESPACE