// Copyright Epic Games, Inc. All Rights Reserved. #include "WorkspaceMenuStructureModule.h" #include "Framework/Docking/WorkspaceItem.h" #if WITH_EDITOR #include "Interfaces/IEditorStyleModule.h" #endif #include "Internationalization/Internationalization.h" #include "Misc/AssertionMacros.h" #include "Styling/AppStyle.h" #include "Styling/ISlateStyle.h" #include "Textures/SlateIcon.h" #include "WorkspaceMenuStructure.h" IMPLEMENT_MODULE( FWorkspaceMenuStructureModule, WorkspaceMenuStructure ); #define LOCTEXT_NAMESPACE "UnrealEditor" class FWorkspaceMenuStructure : public IWorkspaceMenuStructure { public: virtual TSharedRef GetStructureRoot() const override { return MenuRoot.ToSharedRef(); } virtual TSharedRef GetToolsStructureRoot() const override { return ToolsMenuRoot.ToSharedRef(); } virtual TSharedRef GetLevelEditorCategory() const override { return LevelEditorCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorViewportsCategory() const override { return LevelEditorViewportsCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorDetailsCategory() const override { return LevelEditorDetailsCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorModesCategory() const override { return LevelEditorModesCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorCinematicsCategory() const override { return LevelEditorCinematicsCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorVirtualProductionCategory() const override { return LevelEditorVirtualProductionCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorWorldPartitionCategory() const override { return LevelEditorWorldPartitionCategory.ToSharedRef(); } virtual TSharedRef GetLevelEditorOutlinerCategory() const override { return LevelEditorOutlinerCategory.ToSharedRef(); } virtual TSharedRef GetToolsCategory() const override { return ToolsCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsDebugCategory() const override { return DeveloperToolsDebugCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsLogCategory() const override { return DeveloperToolsLogCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsProfilingCategory() const override { return DeveloperToolsProfilingCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsAuditCategory() const override { return DeveloperToolsAuditCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsPlatformsCategory() const override { return DeveloperToolsPlatformsCategory.ToSharedRef(); } virtual TSharedRef GetDeveloperToolsMiscCategory() const override { return DeveloperToolsMiscCategory.ToSharedRef(); } virtual TSharedRef GetAutomationToolsCategory() const override { return AutomationToolsCategory.ToSharedRef(); } virtual TSharedRef GetEditOptions() const override { return EditOptions.ToSharedRef(); } void ResetLevelEditorCategory() { LevelEditorCategory->ClearItems(); LevelEditorViewportsCategory = LevelEditorCategory->AddGroup("Viewports", LOCTEXT("WorkspaceMenu_LevelEditorViewportCategory", "Viewports"), LOCTEXT("WorkspaceMenu_LevelEditorViewportCategoryTooltip", "Open a Viewport tab."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.Viewports"), true); LevelEditorDetailsCategory = LevelEditorCategory->AddGroup("Details", LOCTEXT("WorkspaceMenu_LevelEditorDetailCategory", "Details"), LOCTEXT("WorkspaceMenu_LevelEditorDetailCategoryTooltip", "Open a Details tab."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.Details"), true); LevelEditorCinematicsCategory = LevelEditorCategory->AddGroup("Cinematics", LOCTEXT("WorkspaceMenu_LevelEditorCinematicsCategory", "Cinematics"), LOCTEXT("WorkspaceMenu_LevelEditorCinematicsCategoryTooltip", "Open a Cinematics tab."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.Cinematics"), true); LevelEditorVirtualProductionCategory = LevelEditorCategory->AddGroup("VirtualProduction", LOCTEXT("WorkspaceMenu_LevelEditorVirtualProductionCategory", "Virtual Production"), LOCTEXT("WorkspaceMenu_LevelEditorVirtualProductionCategoryTooltip", "Open a Virtual Production tab."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.VirtualProduction"), true); LevelEditorModesCategory = LevelEditorCategory->AddGroup("EditorModes", LOCTEXT("WorkspaceMenu_LevelEditorToolsCategory", "Editor Modes"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.EditorModes"), true); LevelEditorWorldPartitionCategory = LevelEditorCategory->AddGroup("WorldPartition", LOCTEXT("WorkspaceMenu_LevelEditorWorldPartitionCategory", "World Partition"), LOCTEXT("WorkspaceMenu_LevelEditorWorldPartitionCategoryTooltip", "Open a World Partition tab."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.WorldPartition"), true); LevelEditorOutlinerCategory = LevelEditorCategory->AddGroup("Outliner", LOCTEXT("WorkspaceMenu_LevelEditorOutlinerCategory", "Outliner"), LOCTEXT("WorkspaceMenu_LevelEditorOutlinerCategoryTooltip", "Open an Outliner tab."), FSlateIcon(FAppStyle::GetAppStyleSetName(), "LevelEditor.Tabs.Outliner"), true); } void ResetToolsCategory() { // Developer tools sections DeveloperToolsCategory->ClearItems(); DeveloperToolsSubMenuDebugCategory = DeveloperToolsCategory->AddGroup("Debug", LOCTEXT("WorkspaceMenu_DeveloperToolsDebugCategory", "Debug"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Tabs.Debug"), true); DeveloperToolsDebugCategory = DeveloperToolsSubMenuDebugCategory->AddGroup( "Debug", LOCTEXT("WorkspaceMenu_DeveloperToolsDebugCategory", "Debug"), FSlateIcon(), true); AutomationToolsCategory = DeveloperToolsSubMenuDebugCategory->AddGroup( "Testing", LOCTEXT("WorkspaceMenu_AutomationToolsCategory", "Testing"), FSlateIcon(), true); DeveloperToolsProfilingCategory = DeveloperToolsCategory->AddGroup("Profile", LOCTEXT("WorkspaceMenu_DeveloperToolsProfilingCategory", "Profile"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Profile"), true); DeveloperToolsAuditCategory = DeveloperToolsCategory->AddGroup("Audit", LOCTEXT("WorkspaceMenu_DeveloperToolsAuditCategory", "Audit"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Audit"), true); DeveloperToolsPlatformsCategory = DeveloperToolsCategory->AddGroup("Platforms", LOCTEXT("WorkspaceMenu_DeveloperToolsPlatforms:WCategory", "Platforms"), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "LevelEditor.Platforms"), true); DeveloperToolsMiscCategory = DeveloperToolsCategory->AddGroup("Miscellaneous", LOCTEXT("WorkspaceMenu_DeveloperToolsMiscCategory", "Miscellaneous"), FSlateIcon(), true); } public: FWorkspaceMenuStructure() : MenuRoot(FWorkspaceItem::NewGroup(LOCTEXT("WorkspaceMenu_Root", "Menu Root"))) , ToolsMenuRoot(FWorkspaceItem::NewGroup(LOCTEXT("WorkspaceToolsMenu_Root", "Tools Menu Root"))) , LevelEditorCategory(MenuRoot->AddGroup( "LevelEditor", LOCTEXT("WorkspaceMenu_LevelEditorCategory", "Level Editor"), FSlateIcon(), true)) , ToolsCategory( ToolsMenuRoot->AddGroup("Tools", LOCTEXT("WorkspaceMenu_ToolsCategory", "Tools"), FSlateIcon(), true)) , DeveloperToolsCategory(ToolsMenuRoot->AddGroup( "Instrumentation", LOCTEXT("WorkspaceMenu_DeveloperToolsCategory", "Instrumentation"), FSlateIcon())) , DeveloperToolsLogCategory( MenuRoot->AddGroup("Log", LOCTEXT("WorkspaceMenu_DeveloperToolsLogCategory", "Log"), FSlateIcon(), true)) , EditOptions(FWorkspaceItem::NewGroup(LOCTEXT("WorkspaceEdit_Options", "Edit Options"))) { ResetLevelEditorCategory(); ResetToolsCategory(); } virtual ~FWorkspaceMenuStructure() {} private: TSharedPtr MenuRoot; TSharedPtr ToolsMenuRoot; TSharedPtr LevelEditorCategory; TSharedPtr LevelEditorViewportsCategory; TSharedPtr LevelEditorDetailsCategory; TSharedPtr LevelEditorCinematicsCategory; TSharedPtr LevelEditorVirtualProductionCategory; TSharedPtr LevelEditorModesCategory; TSharedPtr LevelEditorWorldPartitionCategory; TSharedPtr LevelEditorOutlinerCategory; TSharedPtr ToolsCategory; TSharedPtr DeveloperToolsCategory; TSharedPtr DeveloperToolsLogCategory; TSharedPtr DeveloperToolsSubMenuDebugCategory; TSharedPtr DeveloperToolsDebugCategory; TSharedPtr DeveloperToolsAuditCategory; TSharedPtr DeveloperToolsProfilingCategory; TSharedPtr DeveloperToolsPlatformsCategory; TSharedPtr DeveloperToolsMiscCategory; TSharedPtr AutomationToolsCategory; TSharedPtr EditOptions; }; void FWorkspaceMenuStructureModule::StartupModule() { #if WITH_EDITOR // The workspace menu categories rely on icons from the editor style. FModuleManager::LoadModuleChecked("EditorStyle"); #endif WorkspaceMenuStructure = MakeShareable(new FWorkspaceMenuStructure); } void FWorkspaceMenuStructureModule::ShutdownModule() { WorkspaceMenuStructure.Reset(); } const IWorkspaceMenuStructure& FWorkspaceMenuStructureModule::GetWorkspaceMenuStructure() const { check(WorkspaceMenuStructure.IsValid()); return *WorkspaceMenuStructure; } void FWorkspaceMenuStructureModule::ResetLevelEditorCategory() { check(WorkspaceMenuStructure.IsValid()); WorkspaceMenuStructure->ResetLevelEditorCategory(); } void FWorkspaceMenuStructureModule::ResetToolsCategory() { check(WorkspaceMenuStructure.IsValid()); WorkspaceMenuStructure->ResetToolsCategory(); } #undef LOCTEXT_NAMESPACE