Files
UnrealEngineUWP/Engine/Source/Editor/SkeletonEditor/Private/SkeletonEditorMode.cpp
Thomas Sarkanen d29ff33ce4 Updated notify add/replace menus to use class pickers for better searching of BP and native notifies
Also updated class picker to allow access to the native parent class for unloaded Blueprints
Improved skeleton notify management:
- Added 'Add' option to the manager
- Editor no longer freezes when selecting a notify (it was scanning all animations on the skeleton to populate the details panel).

#jira UE-61283 - Improve searching for Anim Notifies
#rb Martin.Wilson

[CL 4264307 by Thomas Sarkanen in Dev-Anim branch]
2018-08-07 04:00:14 -04:00

123 lines
5.0 KiB
C++

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "SkeletonEditorMode.h"
#include "Modules/ModuleManager.h"
#include "PersonaModule.h"
#include "SkeletonEditor.h"
#include "ISkeletonTree.h"
#include "ISkeletonEditorModule.h"
#include "IPersonaToolkit.h"
FSkeletonEditorMode::FSkeletonEditorMode(TSharedRef<FWorkflowCentricApplication> InHostingApp, TSharedRef<ISkeletonTree> InSkeletonTree)
: FApplicationMode(SkeletonEditorModes::SkeletonEditorMode)
{
HostingAppPtr = InHostingApp;
TSharedRef<FSkeletonEditor> SkeletonEditor = StaticCastSharedRef<FSkeletonEditor>(InHostingApp);
ISkeletonEditorModule& SkeletonEditorModule = FModuleManager::LoadModuleChecked<ISkeletonEditorModule>("SkeletonEditor");
TabFactories.RegisterFactory(SkeletonEditorModule.CreateSkeletonTreeTabFactory(InHostingApp, InSkeletonTree));
FOnObjectsSelected OnObjectsSelected = FOnObjectsSelected::CreateSP(&SkeletonEditor.Get(), &FSkeletonEditor::HandleObjectsSelected);
FOnObjectSelected OnObjectSelected = FOnObjectSelected::CreateSP(&SkeletonEditor.Get(), &FSkeletonEditor::HandleObjectSelected);
FPersonaModule& PersonaModule = FModuleManager::LoadModuleChecked<FPersonaModule>("Persona");
TabFactories.RegisterFactory(PersonaModule.CreateDetailsTabFactory(InHostingApp, FOnDetailsCreated::CreateSP(&SkeletonEditor.Get(), &FSkeletonEditor::HandleDetailsCreated)));
FPersonaViewportArgs ViewportArgs(SkeletonEditor->GetPersonaToolkit()->GetPreviewScene());
ViewportArgs.ContextName = TEXT("SkeletonEditor.Viewport");
PersonaModule.RegisterPersonaViewportTabFactories(TabFactories, InHostingApp, ViewportArgs);
TabFactories.RegisterFactory(PersonaModule.CreateAnimNotifiesTabFactory(InHostingApp, InSkeletonTree->GetEditableSkeleton(), OnObjectsSelected));
TabFactories.RegisterFactory(PersonaModule.CreateAdvancedPreviewSceneTabFactory(InHostingApp, SkeletonEditor->GetPersonaToolkit()->GetPreviewScene()));
TabFactories.RegisterFactory(PersonaModule.CreateRetargetManagerTabFactory(InHostingApp, InSkeletonTree->GetEditableSkeleton(), SkeletonEditor->GetPersonaToolkit()->GetPreviewScene(), SkeletonEditor->OnPostUndo));
TabFactories.RegisterFactory(PersonaModule.CreateCurveViewerTabFactory(InHostingApp, InSkeletonTree->GetEditableSkeleton(), SkeletonEditor->GetPersonaToolkit()->GetPreviewScene(), SkeletonEditor->OnPostUndo, OnObjectsSelected));
TabFactories.RegisterFactory(PersonaModule.CreateSkeletonSlotNamesTabFactory(InHostingApp, InSkeletonTree->GetEditableSkeleton(), SkeletonEditor->OnPostUndo, OnObjectSelected));
TabLayout = FTabManager::NewLayout("Standalone_SkeletonEditor_Layout_v1.2")
->AddArea
(
FTabManager::NewPrimaryArea()
->SetOrientation(Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.1f)
->SetHideTabWell(true)
->AddTab(InHostingApp->GetToolbarTabId(), ETabState::OpenedTab)
)
->Split
(
FTabManager::NewSplitter()
->SetSizeCoefficient(0.9f)
->SetOrientation(Orient_Horizontal)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.2f)
->SetHideTabWell(true)
->AddTab(SkeletonEditorTabs::SkeletonTreeTab, ETabState::OpenedTab)
->AddTab(SkeletonEditorTabs::RetargetManagerTab, ETabState::ClosedTab)
)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.6f)
->SetHideTabWell(true)
->AddTab(SkeletonEditorTabs::ViewportTab, ETabState::OpenedTab)
)
->Split
(
FTabManager::NewSplitter()
->SetSizeCoefficient(0.2f)
->SetOrientation(Orient_Vertical)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.5f)
->SetHideTabWell(false)
->AddTab(SkeletonEditorTabs::DetailsTab, ETabState::OpenedTab)
->AddTab(SkeletonEditorTabs::AdvancedPreviewTab, ETabState::OpenedTab)
->SetForegroundTab(SkeletonEditorTabs::DetailsTab)
)
->Split
(
FTabManager::NewStack()
->SetSizeCoefficient(0.5f)
->SetHideTabWell(false)
->AddTab(SkeletonEditorTabs::AnimNotifiesTab, ETabState::OpenedTab)
->AddTab(SkeletonEditorTabs::CurveNamesTab, ETabState::OpenedTab)
->AddTab(SkeletonEditorTabs::SlotNamesTab, ETabState::ClosedTab)
)
)
)
);
PersonaModule.OnRegisterTabs().Broadcast(TabFactories, InHostingApp);
LayoutExtender = MakeShared<FLayoutExtender>();
PersonaModule.OnRegisterLayoutExtensions().Broadcast(*LayoutExtender.Get());
TabLayout->ProcessExtensions(*LayoutExtender.Get());
}
void FSkeletonEditorMode::RegisterTabFactories(TSharedPtr<FTabManager> InTabManager)
{
TSharedPtr<FWorkflowCentricApplication> HostingApp = HostingAppPtr.Pin();
HostingApp->RegisterTabSpawners(InTabManager.ToSharedRef());
HostingApp->PushTabFactories(TabFactories);
FApplicationMode::RegisterTabFactories(InTabManager);
}
void FSkeletonEditorMode::AddTabFactory(FCreateWorkflowTabFactory FactoryCreator)
{
if (FactoryCreator.IsBound())
{
TabFactories.RegisterFactory(FactoryCreator.Execute(HostingAppPtr.Pin()));
}
}
void FSkeletonEditorMode::RemoveTabFactory(FName TabFactoryID)
{
TabFactories.UnregisterFactory(TabFactoryID);
}