Files
UnrealEngineUWP/Engine/Source/Editor/AnimationModifiers/Private/AnimationModifiersModule.cpp
ben zeigler e4549adade #jira UE-60254 Fix shutdown crash in nativization module. Also fix several other places that were loading modules during module shutdown
#rb phillip.kavan

#ROBOMERGE-SOURCE: CL 4136215 in //UE4/Release-4.20/...
#ROBOMERGE-BOT: RELEASE (Release-4.20 -> Release-Staging-4.20)
#ROBOMERGE-AUTHOR: ben.zeigler

[CL 4136217 by ben zeigler in Staging-4.20 branch]
2018-06-18 16:22:43 -04:00

69 lines
2.5 KiB
C++

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "AnimationModifiersModule.h"
#include "IAssetTools.h"
#include "Animation/AnimSequence.h"
#include "AnimationModifier.h"
#include "SAnimationModifiersTab.h"
#include "AnimationModifierDetailCustomization.h"
#include "AnimationModifiersTabSummoner.h"
#include "Modules/ModuleManager.h"
#include "PropertyEditorModule.h"
#define LOCTEXT_NAMESPACE "AnimationModifiersModule"
IMPLEMENT_MODULE(FAnimationModifiersModule, AnimationModifiers);
void FAnimationModifiersModule::StartupModule()
{
// Register class/struct customizations
FPropertyEditorModule& PropertyEditorModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyEditorModule.RegisterCustomClassLayout("AnimationModifier", FOnGetDetailCustomizationInstance::CreateStatic(&FAnimationModifierDetailCustomization::MakeInstance));
// Add application mode extender
Extender = FWorkflowApplicationModeExtender::CreateRaw(this, &FAnimationModifiersModule::ExtendApplicationMode);
FWorkflowCentricApplication::GetModeExtenderList().Add(Extender);
}
TSharedRef<FApplicationMode> FAnimationModifiersModule::ExtendApplicationMode(const FName ModeName, TSharedRef<FApplicationMode> InMode)
{
// For skeleton and animation editor modes add our custom tab factory to it
if (ModeName == TEXT("SkeletonEditorMode") || ModeName == TEXT("AnimationEditorMode"))
{
InMode->AddTabFactory(FCreateWorkflowTabFactory::CreateStatic(&FAnimationModifiersTabSummoner::CreateFactory));
RegisteredApplicationModes.Add(InMode);
}
return InMode;
}
void FAnimationModifiersModule::ShutdownModule()
{
// Make sure we unregister the class layout
FPropertyEditorModule* PropertyEditorModule = FModuleManager::GetModulePtr<FPropertyEditorModule>("PropertyEditor");
if (PropertyEditorModule)
{
PropertyEditorModule->UnregisterCustomClassLayout("AnimationModifier");
}
// Remove extender delegate
FWorkflowCentricApplication::GetModeExtenderList().RemoveAll([this](FWorkflowApplicationModeExtender& StoredExtender) { return StoredExtender.GetHandle() == Extender.GetHandle(); });
// During shutdown clean up all factories from any modes which are still active/alive
for (TWeakPtr<FApplicationMode> WeakMode : RegisteredApplicationModes)
{
if (WeakMode.IsValid())
{
TSharedPtr<FApplicationMode> Mode = WeakMode.Pin();
Mode->RemoveTabFactory(FAnimationModifiersTabSummoner::AnimationModifiersName);
}
}
RegisteredApplicationModes.Empty();
}
#undef LOCTEXT_NAMESPACE // "AnimationModifiersModule"