// Copyright IHY. #include "OptimizerEditorModule.h" #include "Modules/ModuleManager.h" #include "ToolMenus.h" #include "ToolMenuSection.h" #include "Framework/Commands/UIAction.h" #include "Framework/Docking/TabManager.h" #include "Framework/Application/SlateApplication.h" #include "Widgets/Docking/SDockTab.h" #include "Styling/AppStyle.h" #include "SOptimizerPanel.h" #define LOCTEXT_NAMESPACE "OptimizerEditor" namespace { const FName OptimizerTabId(TEXT("MeshOptimizer")); } IMPLEMENT_MODULE(FOptimizerEditorModule, OptimizerEditor) void FOptimizerEditorModule::StartupModule() { UToolMenus::RegisterStartupCallback( FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FOptimizerEditorModule::RegisterMenus)); } void FOptimizerEditorModule::ShutdownModule() { if (bTabRegistered && FSlateApplication::IsInitialized()) { FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(OptimizerTabId); bTabRegistered = false; } if (UToolMenus::IsToolMenuUIEnabled()) { UToolMenus::UnRegisterStartupCallback(this); UToolMenus::UnregisterOwner(this); } } void FOptimizerEditorModule::RegisterMenus() { FToolMenuOwnerScoped OwnerScoped(this); if (!bTabRegistered && FSlateApplication::IsInitialized()) { FGlobalTabmanager::Get()->RegisterNomadTabSpawner( OptimizerTabId, FOnSpawnTab::CreateRaw(this, &FOptimizerEditorModule::SpawnPanelTab)) .SetDisplayName(LOCTEXT("OptimizerTabTitle", "Mesh Optimizer")) .SetTooltipText(LOCTEXT("OptimizerTabTip", "Find sibling meshes and rebase them onto one canonical mesh (HISM-ready).")) .SetMenuType(ETabSpawnerMenuType::Hidden); bTabRegistered = true; } if (UToolMenu* ToolsMenu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Tools")) { FToolMenuSection& Section = ToolsMenu->FindOrAddSection("Optimizer", LOCTEXT("OptimizerSection", "Optimizer")); Section.AddMenuEntry( "OpenMeshOptimizer", LOCTEXT("OpenOptimizer", "Mesh Optimizer"), LOCTEXT("OpenOptimizerTip", "Find sibling meshes and rebase them onto one canonical mesh (HISM-ready)."), FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.Settings"), FUIAction(FExecuteAction::CreateLambda([]() { FGlobalTabmanager::Get()->TryInvokeTab(OptimizerTabId); }))); } } TSharedRef FOptimizerEditorModule::SpawnPanelTab(const FSpawnTabArgs& Args) { return SNew(SDockTab) .TabRole(ETabRole::NomadTab) [ SNew(SOptimizerPanel) ]; } #undef LOCTEXT_NAMESPACE