void FAssetTypeActions_StaticMesh::GetActions( const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder ) { auto Meshes = GetTypedWeakObjectPtrs<UStaticMesh>(InObjects); MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_Edit", "Edit"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_EditTooltip", "Opens the selected meshes in the static mesh editor."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteEdit, Meshes ), FCanExecuteAction() ) ); MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_Reimport", "Reimport"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_ReimportTooltip", "Reimports the selected meshes from file."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteReimport, Meshes ), FCanExecuteAction() ) ); MenuBuilder.AddSubMenu( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_ImportLOD", "ImportLOD"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_ImportLODtooltip", "Imports meshes into the LODs"), FNewMenuDelegate::CreateSP( this, &FAssetTypeActions_StaticMesh::GetImportLODMenu, Meshes ) ); MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_FindInExplorer", "Find Source"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_FindInExplorerTooltip", "Opens explorer at the location of this asset."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteFindInExplorer, Meshes ), FCanExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::CanExecuteSourceCommands, Meshes ) ) ); MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_OpenInExternalEditor", "Open Source"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_OpenInExternalEditorTooltip", "Opens the selected asset in an external editor."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteOpenInExternalEditor, Meshes ), FCanExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::CanExecuteSourceCommands, Meshes ) ) ); MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_CreateDestructibleMesh", "Create Destructible Mesh"), NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_CreateDestructibleMeshTooltip", "Creates a DestructibleMesh from the StaticMesh and opens it in the DestructibleMesh editor."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteCreateDestructibleMesh, Meshes ), FCanExecuteAction() ) ); }
void FAssetTypeActions_StaticMesh::GetActions( const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder ) { auto Meshes = GetTypedWeakObjectPtrs<UStaticMesh>(InObjects); if (CVarEnableSaveGeneratedLODsInPackage.GetValueOnGameThread() != 0) { MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_SaveGeneratedLODsInPackage", "Save Generated LODs"), NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_SaveGeneratedLODsInPackageTooltip", "Run the mesh reduce and save the generated LODs as part of the package."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP(this, &FAssetTypeActions_StaticMesh::ExecuteSaveGeneratedLODsInPackage, Meshes), FCanExecuteAction() ) ); } MenuBuilder.AddMenuEntry( NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_CreateDestructibleMesh", "Create Destructible Mesh"), NSLOCTEXT("AssetTypeActions_StaticMesh", "ObjectContext_CreateDestructibleMeshTooltip", "Creates a DestructibleMesh from the StaticMesh and opens it in the DestructibleMesh editor."), FSlateIcon(FEditorStyle::GetStyleSetName(), "ClassIcon.DestructibleComponent"), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_StaticMesh::ExecuteCreateDestructibleMesh, Meshes ), FCanExecuteAction() ) ); MenuBuilder.AddSubMenu( NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_ImportLOD", "Import LOD"), NSLOCTEXT("AssetTypeActions_StaticMesh", "StaticMesh_ImportLODtooltip", "Imports meshes into the LODs"), FNewMenuDelegate::CreateSP( this, &FAssetTypeActions_StaticMesh::GetImportLODMenu, Meshes ) ); }
void FMainMenu::FillWindowMenu( FMenuBuilder& MenuBuilder, const TSharedRef< FExtender > Extender, const TSharedPtr<FTabManager> TabManager ) { MenuBuilder.BeginSection("WindowLocalTabSpawners"); { // Automatically populate tab spawners from TabManager if (TabManager.IsValid()) { const IWorkspaceMenuStructure& MenuStructure = WorkspaceMenu::GetMenuStructure(); TabManager->PopulateTabSpawnerMenu(MenuBuilder, MenuStructure.GetStructureRoot()); } } MenuBuilder.EndSection(); MenuBuilder.BeginSection("WindowGlobalTabSpawners"); { //@todo The tab system needs to be able to be extendable by plugins [9/3/2013 Justin.Sargent] if (IModularFeatures::Get().IsModularFeatureAvailable(EditorFeatures::PluginsEditor ) ) { FGlobalTabmanager::Get()->PopulateTabSpawnerMenu(MenuBuilder, "PluginsEditor"); } } MenuBuilder.EndSection(); MenuBuilder.BeginSection("UnrealFrontendTabs", NSLOCTEXT("MainAppMenu", "UnrealFrontendHeader", "Unreal Frontend")); { FGlobalTabmanager::Get()->PopulateTabSpawnerMenu(MenuBuilder, "DeviceManager"); if (GetDefault<UEditorExperimentalSettings>()->bMessagingDebugger) { if (IModularFeatures::Get().IsModularFeatureAvailable("MessagingDebugger")) { FGlobalTabmanager::Get()->PopulateTabSpawnerMenu(MenuBuilder, "MessagingDebugger"); } } FGlobalTabmanager::Get()->PopulateTabSpawnerMenu(MenuBuilder, "SessionFrontend"); if (GetDefault<UEditorExperimentalSettings>()->bGameLauncher) { FGlobalTabmanager::Get()->PopulateTabSpawnerMenu(MenuBuilder, "SessionLauncher"); } if (FParse::Param(FCommandLine::Get(), TEXT("TranslationTools"))) { MenuBuilder.AddSubMenu( LOCTEXT("TranslationEditorSubMenuLabel", "TranslationEditor"), LOCTEXT("EditorPreferencesSubMenuToolTip", "Open the Translation Editor for a Given Project and Language"), FNewMenuDelegate::CreateStatic(&FMainFrameTranslationEditorMenu::MakeMainFrameTranslationEditorSubMenu) ); } } MenuBuilder.EndSection(); MenuBuilder.BeginSection("WindowLayout", NSLOCTEXT("MainAppMenu", "LayoutManagementHeader", "Layout")); { MenuBuilder.AddMenuEntry(FMainFrameCommands::Get().SaveLayout); MenuBuilder.AddMenuEntry(FMainFrameCommands::Get().ToggleFullscreen); } MenuBuilder.EndSection(); }
static void FillProjectMenuItems( FMenuBuilder& MenuBuilder ) { MenuBuilder.BeginSection( "FileProject", LOCTEXT("ProjectHeading", "Project") ); { MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().NewProject ); MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().OpenProject ); const bool bUseShortIDEName = true; FText ShortIDEName = FSourceCodeNavigation::GetSuggestedSourceCodeIDE(bUseShortIDEName); MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().AddCodeToProject, NAME_None, TAttribute<FText>(), FText::Format(LOCTEXT("AddCodeToProjectTooltip", "Adds C++ code to the project. The code can only be compiled if you have {0} installed."), ShortIDEName) ); MenuBuilder.AddSubMenu( LOCTEXT("PackageProjectSubMenuLabel", "Package Project"), LOCTEXT("PackageProjectSubMenuToolTip", "Compile, cook and package your project and its content for distribution"), FNewMenuDelegate::CreateStatic( &FPackageProjectMenu::MakeMenu ), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "MainFrame.PackageProject") ); if (FPaths::FileExists(FModuleManager::Get().GetSolutionFilepath())) { MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().RefreshCodeProject, NAME_None, FText::Format(LOCTEXT("RefreshCodeProjectLabel", "Refresh {0} Project"), ShortIDEName), FText::Format(LOCTEXT("RefreshCodeProjectTooltip", "Refreshes your C++ code project in {0}."), ShortIDEName) ); MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().OpenIDE, NAME_None, FText::Format(LOCTEXT("OpenIDELabel", "Open {0}"), ShortIDEName), FText::Format(LOCTEXT("OpenIDETooltip", "Opens your C++ code in {0}."), ShortIDEName) ); } // @hack GDC: this should be moved somewhere else and be less hacky ITargetPlatform* RunningTargetPlatform = GetTargetPlatformManager()->GetRunningTargetPlatform(); if (RunningTargetPlatform != nullptr) { FString CookedPlatformName = RunningTargetPlatform->PlatformName() + TEXT("NoEditor"); FText CookedPlatformText = FText::FromString(RunningTargetPlatform->PlatformName()); FUIAction Action( FExecuteAction::CreateStatic(&FMainFrameActionCallbacks::CookContent, CookedPlatformName, CookedPlatformText), FCanExecuteAction::CreateStatic(&FMainFrameActionCallbacks::CookContentCanExecute, CookedPlatformName) ); MenuBuilder.AddMenuEntry( FText::Format(LOCTEXT("CookContentForPlatform", "Cook Content for {0}"), CookedPlatformText), FText::Format(LOCTEXT("CookContentForPlatformTooltip", "Cook your game content for debugging on the {0} platform"), CookedPlatformText), FSlateIcon(), Action ); } } MenuBuilder.EndSection(); }
void FLevelEditorContextMenuImpl::FillTransformMenu( FMenuBuilder& MenuBuilder ) { if ( FLevelEditorActionCallbacks::ActorSelected_CanExecute() ) { MenuBuilder.BeginSection("TransformSnapAlign"); { MenuBuilder.AddSubMenu( LOCTEXT("SnapAlignSubMenu", "Snap/Align"), LOCTEXT("SnapAlignSubMenu_ToolTip", "Actor snap/align utils"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillSnapAlignMenu ) ); } MenuBuilder.EndSection(); MenuBuilder.BeginSection("DeltaTransformToActors"); { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().DeltaTransformToActors ); } MenuBuilder.EndSection(); } MenuBuilder.BeginSection("MirrorLock"); { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().MirrorActorX ); MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().MirrorActorY ); MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().MirrorActorZ ); MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().LockActorMovement ); } }
void FThumbnailSection::BuildSectionContextMenu(FMenuBuilder& MenuBuilder, const FGuid& ObjectBinding) { MenuBuilder.BeginSection(NAME_None, LOCTEXT("ViewMenuText", "View")); { MenuBuilder.AddSubMenu( LOCTEXT("ThumbnailsMenu", "Thumbnails"), FText(), FNewMenuDelegate::CreateLambda([=](FMenuBuilder& InMenuBuilder){ TSharedPtr<ISequencer> Sequencer = SequencerPtr.Pin(); FText CurrentTime = FText::FromString(Sequencer->GetZeroPadNumericTypeInterface()->ToString(Sequencer->GetGlobalTime())); InMenuBuilder.BeginSection(NAME_None, LOCTEXT("ThisSectionText", "This Section")); { InMenuBuilder.AddMenuEntry( LOCTEXT("RefreshText", "Refresh"), LOCTEXT("RefreshTooltip", "Refresh this section's thumbnails"), FSlateIcon(), FUIAction(FExecuteAction::CreateRaw(this, &FThumbnailSection::RedrawThumbnails)) ); InMenuBuilder.AddMenuEntry( FText::Format(LOCTEXT("SetSingleTime", "Set Thumbnail Time To {0}"), CurrentTime), LOCTEXT("SetSingleTimeTooltip", "Defines the time at which this section should draw its single thumbnail to the current cursor position"), FSlateIcon(), FUIAction( FExecuteAction::CreateLambda([=]{ SetSingleTime(Sequencer->GetGlobalTime()); GetMutableDefault<UMovieSceneUserThumbnailSettings>()->bDrawSingleThumbnails = true; GetMutableDefault<UMovieSceneUserThumbnailSettings>()->SaveConfig(); }) ) ); } InMenuBuilder.EndSection(); InMenuBuilder.BeginSection(NAME_None, LOCTEXT("GlobalSettingsText", "Global Settings")); { InMenuBuilder.AddMenuEntry( LOCTEXT("RefreshAllText", "Refresh All"), LOCTEXT("RefreshAllTooltip", "Refresh all sections' thumbnails"), FSlateIcon(), FUIAction(FExecuteAction::CreateLambda([]{ GetDefault<UMovieSceneUserThumbnailSettings>()->BroadcastRedrawThumbnails(); })) ); FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor"); FDetailsViewArgs Args(false, false, false, FDetailsViewArgs::HideNameArea); TSharedRef<IDetailsView> DetailView = PropertyModule.CreateDetailView(Args); DetailView->SetObject(GetMutableDefault<UMovieSceneUserThumbnailSettings>()); InMenuBuilder.AddWidget(DetailView, FText(), true); } InMenuBuilder.EndSection(); }) ); } MenuBuilder.EndSection(); }
static void ConstructLandscapeViewportMenu(FMenuBuilder& MenuBuilder) { struct Local { static void BuildLandscapeVisualizersMenu(FMenuBuilder& InMenuBuilder) { const FLandscapeEditorCommands& LandscapeActions = FLandscapeEditorCommands::Get(); InMenuBuilder.BeginSection("LandscapeVisualizers", LOCTEXT("LandscapeHeader", "Landscape Visualizers")); { InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeNormal, NAME_None, LOCTEXT("LandscapeViewModeNormal", "Normal")); InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeLOD, NAME_None, LOCTEXT("LandscapeViewModeLOD", "LOD")); InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeLayerDensity, NAME_None, LOCTEXT("LandscapeViewModeLayerDensity", "Layer Density")); if (GLevelEditorModeTools().IsModeActive(FBuiltinEditorModes::EM_Landscape)) { InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeLayerUsage, NAME_None, LOCTEXT("LandscapeViewModeLayerUsage", "Layer Usage")); InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeLayerDebug, NAME_None, LOCTEXT("LandscapeViewModeLayerDebug", "Layer Debug")); } InMenuBuilder.AddMenuEntry(LandscapeActions.ViewModeWireframeOnTop, NAME_None, LOCTEXT("LandscapeViewModeWireframeOnTop", "Wireframe on Top")); } InMenuBuilder.EndSection(); } }; MenuBuilder.AddSubMenu(LOCTEXT("LandscapeSubMenu", "Visualizers"), LOCTEXT("LandscapeSubMenu_ToolTip", "Select a Landscape visualiser"), FNewMenuDelegate::CreateStatic(&Local::BuildLandscapeVisualizersMenu)); }
void FLevelEditorContextMenu::BuildGroupMenu( FMenuBuilder& MenuBuilder, const FSelectedActorInfo& SelectedActorInfo ) { if( GEditor->bGroupingActive ) { // Whether or not we added a grouping sub-menu bool bNeedGroupSubMenu = SelectedActorInfo.bHaveSelectedLockedGroup || SelectedActorInfo.bHaveSelectedUnlockedGroup; // Grouping based on selection (must have selected at least two actors) if( SelectedActorInfo.NumSelected > 1 ) { if( !SelectedActorInfo.bHaveSelectedLockedGroup && !SelectedActorInfo.bHaveSelectedUnlockedGroup ) { // Only one menu entry needed so dont use a sub-menu MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().RegroupActors, NAME_None, FLevelEditorCommands::Get().GroupActors->GetLabel(), FLevelEditorCommands::Get().GroupActors->GetDescription() ); } else { // Put everything into a sub-menu bNeedGroupSubMenu = true; } } if( bNeedGroupSubMenu ) { MenuBuilder.AddSubMenu( LOCTEXT("GroupMenu", "Groups"), LOCTEXT("GroupMenu_ToolTip", "Opens the actor grouping menu"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillGroupMenu ) ); } } }
void FCinematicShotSection::BuildSectionContextMenu(FMenuBuilder& MenuBuilder, const FGuid& ObjectBinding) { FThumbnailSection::BuildSectionContextMenu(MenuBuilder, ObjectBinding); MenuBuilder.BeginSection(NAME_None, LOCTEXT("ShotMenuText", "Shot")); { if (SequenceInstance.IsValid()) { MenuBuilder.AddSubMenu( LOCTEXT("TakesMenu", "Takes"), LOCTEXT("TakesMenuTooltip", "Shot takes"), FNewMenuDelegate::CreateLambda([=](FMenuBuilder& InMenuBuilder){ AddTakesMenu(InMenuBuilder); })); MenuBuilder.AddMenuEntry( LOCTEXT("NewTake", "New Take"), FText::Format(LOCTEXT("NewTakeTooltip", "Create a new take for {0}"), SectionObject.GetShotDisplayName()), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(CinematicShotTrackEditor.Pin().ToSharedRef(), &FCinematicShotTrackEditor::NewTake, &SectionObject)) ); } MenuBuilder.AddMenuEntry( LOCTEXT("InsertNewShot", "Insert Shot"), FText::Format(LOCTEXT("InsertNewShotTooltip", "Insert a new shot after {0}"), SectionObject.GetShotDisplayName()), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(CinematicShotTrackEditor.Pin().ToSharedRef(), &FCinematicShotTrackEditor::InsertShot, &SectionObject)) ); if (SequenceInstance.IsValid()) { MenuBuilder.AddMenuEntry( LOCTEXT("DuplicateShot", "Duplicate Shot"), FText::Format(LOCTEXT("DuplicateShotTooltip", "Duplicate {0} to create a new shot"), SectionObject.GetShotDisplayName()), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(CinematicShotTrackEditor.Pin().ToSharedRef(), &FCinematicShotTrackEditor::DuplicateShot, &SectionObject)) ); MenuBuilder.AddMenuEntry( LOCTEXT("RenderShot", "Render Shot"), FText::Format(LOCTEXT("RenderShotTooltip", "Render shot movie"), SectionObject.GetShotDisplayName()), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(CinematicShotTrackEditor.Pin().ToSharedRef(), &FCinematicShotTrackEditor::RenderShot, &SectionObject)) ); /* //@todo MenuBuilder.AddMenuEntry( LOCTEXT("RenameShot", "Rename Shot"), FText::Format(LOCTEXT("RenameShotTooltip", "Rename {0}"), SectionObject.GetShotDisplayName()), FSlateIcon(), FUIAction(FExecuteAction::CreateSP(CinematicShotTrackEditor.Pin().ToSharedRef(), &FCinematicShotTrackEditor::RenameShot, &SectionObject)) ); */ } } MenuBuilder.EndSection(); }
static void CreateSpriteActionsSubMenu(FMenuBuilder& MenuBuilder, TArray<FAssetData> SelectedAssets) { MenuBuilder.AddSubMenu( LOCTEXT("SpriteActionsSubMenuLabel", "Sprite Actions"), LOCTEXT("SpriteActionsSubMenuToolTip", "Sprite-related actions for this texture."), FNewMenuDelegate::CreateStatic(&FPaperContentBrowserExtensions_Impl::PopulateSpriteActionsMenu, SelectedAssets), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "ClassIcon.PaperSprite") ); }
void F3DAttachTrackEditor::BuildObjectBindingTrackMenu(FMenuBuilder& MenuBuilder, const FGuid& ObjectBinding, const UClass* ObjectClass) { if (ObjectClass->IsChildOf(AActor::StaticClass())) { UMovieSceneSection* DummySection = nullptr; MenuBuilder.AddSubMenu( LOCTEXT("AddAttach", "Attach"), LOCTEXT("AddAttachTooltip", "Adds an attach track."), FNewMenuDelegate::CreateRaw(this, &FActorPickerTrackEditor::ShowActorSubMenu, ObjectBinding, DummySection)); } }
static void CreateLODGroupActionsSubMenu(FMenuBuilder& MenuBuilder, TArray<FAssetData> SelectedAssets) { MenuBuilder.BeginSection("Simplygon", LOCTEXT("SimplygonHeading", "Simplygon")); { MenuBuilder.AddSubMenu( LOCTEXT("LODGroupSubMenu", "Assign LOD Group"), LOCTEXT("LODGroupSubMenu_ToolTip", "Assign LODGroup to selection"), FNewMenuDelegate::CreateStatic(&PopulateLODGroupMenu, SelectedAssets), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "SimplygonIcon.TabIcon")); } MenuBuilder.EndSection(); }
void FGameplayDebugger::CreateSnappingOptionsMenu(FMenuBuilder& Builder) { #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) if (GCurrentLevelEditingViewportClient && GCurrentLevelEditingViewportClient->EngineShowFlags.DebugAI && GCurrentLevelEditingViewportClient->IsSimulateInEditorViewport()) { Builder.AddMenuSeparator(); Builder.AddSubMenu( LOCTEXT("Test_GameplayDebugger_SnappingOptions_Menu", "Gameplay Debugger"), LOCTEXT("Test_GameplayDebugger_SnappingOptions_Menu_Tooltip", "Quick setting for Gameplay Debugger tool in selected view"), FNewMenuDelegate::CreateRaw(this, &FGameplayDebugger::CreateSettingSubMenu) ); } #endif }
/** Generates a lighting info dialogs sub-menu */ static void MakeLightingInfoMenu( FMenuBuilder& InMenuBuilder ) { InMenuBuilder.BeginSection("LevelEditorBuildLightingInfo", LOCTEXT( "LightingInfoHeading", "Lighting Info Dialogs" ) ); { InMenuBuilder.AddSubMenu( LOCTEXT( "LightingToolsSubMenu", "Lighting Tools" ), LOCTEXT( "LightingToolsSubMenu_ToolTip", "Shows the Lighting Tools options." ), FNewMenuDelegate::CreateStatic( &FLightingMenus::MakeLightingToolsMenu ) ); InMenuBuilder.AddSubMenu( LOCTEXT( "LightingDensityRenderingSubMenu", "LightMap Density Rendering Options" ), LOCTEXT( "LightingDensityRenderingSubMenu_ToolTip", "Shows the LightMap Density Rendering viewmode options." ), FNewMenuDelegate::CreateStatic( &FLightingMenus::MakeLightingDensityMenu ) ); InMenuBuilder.AddSubMenu( LOCTEXT( "LightingResolutionAdjustmentSubMenu", "LightMap Resolution Adjustment" ), LOCTEXT( "LightingResolutionAdjustmentSubMenu_ToolTip", "Shows the LightMap Resolution Adjustment options." ), FNewMenuDelegate::CreateStatic( &FLightingMenus::MakeLightingResolutionMenu ) ); InMenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().LightingStaticMeshInfo, NAME_None, LOCTEXT( "BuildLightingInfo_LightingStaticMeshInfo", "Lighting StaticMesh Info..." ) ); } InMenuBuilder.EndSection(); }
static void FillRecentFileAndExitMenuItems( FMenuBuilder& MenuBuilder ) { MenuBuilder.BeginSection( "FileRecentFiles" ); { if ( FMainFrameActionCallbacks::ProjectNames.Num() > 0 ) { MenuBuilder.AddSubMenu( LOCTEXT("SwitchProjectSubMenu", "Recent Projects"), LOCTEXT("SwitchProjectSubMenu_ToolTip", "Select a project to switch to"), FNewMenuDelegate::CreateStatic( &FRecentProjectsMenu::MakeMenu ), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "MainFrame.RecentProjects") ); } } MenuBuilder.EndSection(); MenuBuilder.AddMenuSeparator(); MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().Exit, "Exit" ); }
void FLevelCollectionModel::CustomizeFileMainMenu(FMenuBuilder& InMenuBuilder) const { const FLevelCollectionCommands& Commands = FLevelCollectionCommands::Get(); // Cache SCC state CacheCanExecuteSourceControlVars(); InMenuBuilder.AddSubMenu( LOCTEXT("SourceControl", "Source Control"), LOCTEXT("SourceControl_ToolTip", "Source Control Options"), FNewMenuDelegate::CreateSP(this, &FLevelCollectionModel::FillSourceControlSubMenu)); if (AreAnyLevelsSelected()) { InMenuBuilder.AddMenuEntry( Commands.World_SaveSelectedLevels ); InMenuBuilder.AddMenuEntry( Commands.World_SaveSelectedLevelAs ); InMenuBuilder.AddMenuEntry( Commands.World_MigrateSelectedLevels ); } }
void FAssetTypeActions_AnimationAsset::GetActions( const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder ) { auto AnimAssets = GetTypedWeakObjectPtrs<UAnimationAsset>(InObjects); MenuBuilder.AddMenuEntry( LOCTEXT("AnimSequenceBase_FindSkeleton", "Find Skeleton"), LOCTEXT("AnimSequenceBase_FindSkeletonTooltip", "Finds the skeleton for the selected assets in the content browser."), FSlateIcon(), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_AnimationAsset::ExecuteFindSkeleton, AnimAssets ), FCanExecuteAction() ) ); MenuBuilder.AddSubMenu( LOCTEXT("RetargetAnimSubmenu", "Retarget Anim Assets"), LOCTEXT("RetargetAnimSubmenu_ToolTip", "Opens the retarget anim assets menu"), FNewMenuDelegate::CreateSP( this, &FAssetTypeActions_AnimationAsset::FillRetargetMenu, InObjects ) ); }
void OnAutomationToolsMenuCreation(FMenuBuilder& MenuBuilder) { MenuBuilder.BeginSection("Testing", LOCTEXT("Testing", "Testing")); MenuBuilder.AddMenuEntry( LOCTEXT("AutomationLabel", "Test Automation"), LOCTEXT("Tooltip", "Launch the Testing Automation Frontend."), FSlateIcon(FEditorStyle::GetStyleSetName(), "AutomationTools.MenuIcon"), FUIAction(FExecuteAction::CreateStatic(&FEditorAutomationModule::OnShowAutomationFrontend))); MenuBuilder.EndSection(); // TODO Come up with a way to hide this if no tools are registered. if (WorkspaceMenu::GetMenuStructure().GetAutomationToolsCategory()->GetChildItems().Num() > 0) { MenuBuilder.AddSubMenu( LOCTEXT("AutomationTools", "Automation Tools"), LOCTEXT("AutomationToolsToolTip", "Assorted tools to help generate data for some of the automation tests."), FNewMenuDelegate::CreateRaw(this, &FEditorAutomationModule::PopulateAutomationTools) ); } }
void FStreamingLevelCollectionModel::CustomizeFileMainMenu(FMenuBuilder& InMenuBuilder) const { FLevelCollectionModel::CustomizeFileMainMenu(InMenuBuilder); const FLevelCollectionCommands& Commands = FLevelCollectionCommands::Get(); InMenuBuilder.BeginSection("LevelsAddLevel"); { InMenuBuilder.AddSubMenu( LOCTEXT("LevelsStreamingMethod", "Default Streaming Method"), LOCTEXT("LevelsStreamingMethod_Tooltip", "Changes the default streaming method for a new levels"), FNewMenuDelegate::CreateRaw(this, &FStreamingLevelCollectionModel::FillDefaultStreamingMethodSubMenu ) ); InMenuBuilder.AddMenuEntry( Commands.World_CreateEmptyLevel ); InMenuBuilder.AddMenuEntry( Commands.World_AddExistingLevel ); InMenuBuilder.AddMenuEntry( Commands.World_AddSelectedActorsToNewLevel ); InMenuBuilder.AddMenuEntry( Commands.World_MergeSelectedLevels ); } InMenuBuilder.EndSection(); }
static void FillRecentFileAndExitMenuItems( FMenuBuilder& MenuBuilder ) { MenuBuilder.BeginSection("FileRecentFiles"); { if (GetDefault<UEditorStyleSettings>()->bShowProjectMenus && FMainFrameActionCallbacks::ProjectNames.Num() > 0) { MenuBuilder.AddSubMenu( LOCTEXT("SwitchProjectSubMenu", "Recent Projects"), LOCTEXT("SwitchProjectSubMenu_ToolTip", "Select a project to switch to"), FNewMenuDelegate::CreateStatic(&FRecentProjectsMenu::MakeMenu), false, FSlateIcon(FEditorStyle::GetStyleSetName(), "MainFrame.RecentProjects") ); } } MenuBuilder.EndSection(); #if !PLATFORM_MAC // Handled by app's menu in menu bar MenuBuilder.AddMenuSeparator(); MenuBuilder.AddMenuEntry( FMainFrameCommands::Get().Exit, "Exit" ); #endif }
void FAssetTypeActions_SoundWave::GetActions( const TArray<UObject*>& InObjects, FMenuBuilder& MenuBuilder ) { FAssetTypeActions_SoundBase::GetActions(InObjects, MenuBuilder); auto SoundNodes = GetTypedWeakObjectPtrs<USoundWave>(InObjects); MenuBuilder.AddMenuEntry( LOCTEXT("SoundWave_CreateCue", "Create Cue"), LOCTEXT("SoundWave_CreateCueTooltip", "Creates a sound cue using this sound wave."), FSlateIcon(FEditorStyle::GetStyleSetName(), "ClassIcon.SoundCue"), FUIAction( FExecuteAction::CreateSP( this, &FAssetTypeActions_SoundWave::ExecuteCreateSoundCue, SoundNodes ), FCanExecuteAction() ) ); MenuBuilder.AddSubMenu( LOCTEXT("SoundWave_CreateDialogue", "Create Dialogue"), LOCTEXT("SoundWave_CreateDialogueTooltip", "Creates a dialogue wave using this sound wave."), FNewMenuDelegate::CreateSP(this, &FAssetTypeActions_SoundWave::FillVoiceMenu, SoundNodes)); }
//------------------------------------------------------------------------------ void SBlueprintFavoritesPalette::GenerateContextMenuEntries(FMenuBuilder& MenuBuilder) const { FBlueprintFavoritesPaletteCommands const& PaletteCommands = FBlueprintFavoritesPaletteCommands::Get(); MenuBuilder.BeginSection("FavoritedItem"); { TSharedPtr<FEdGraphSchemaAction> SelectedAction = GetSelectedAction(); // if we have a specific action selected if (SelectedAction.IsValid()) { MenuBuilder.AddMenuEntry(PaletteCommands.RemoveSingleFavorite); } // if we have a category selected { FString CategoryName = GraphActionMenu->GetSelectedCategoryName(); // make sure it is an actual category and isn't the root (assume there's only one category with that name) if (!CategoryName.IsEmpty() && (CategoryName != SBlueprintFavoritesPaletteUtils::FavoritesCategoryName)) { MenuBuilder.AddMenuEntry(PaletteCommands.RemoveSubFavorites); } } } MenuBuilder.EndSection(); MenuBuilder.BeginSection("FavoritesList"); { SBlueprintSubPalette::GenerateContextMenuEntries(MenuBuilder); MenuBuilder.AddSubMenu( LOCTEXT("LoadProfile", "Load Profile"), LOCTEXT("LoadProfileTooltip", "Replace your current favorites with ones from a pre-defined profile."), FNewMenuDelegate::CreateStatic(&SBlueprintFavoritesPaletteUtils::BuildProfilesSubMenu) ); MenuBuilder.AddMenuEntry(PaletteCommands.ClearFavorites); } MenuBuilder.EndSection(); }
void SVisualLogger::FillFileMenu(FMenuBuilder& MenuBuilder, const TSharedPtr<FTabManager> InTabManager) { MenuBuilder.BeginSection("LogFile", LOCTEXT("FileMenu", "Log File")); { MenuBuilder.AddMenuEntry(FVisualLoggerCommands::Get().LoadFromVLog); MenuBuilder.AddMenuEntry(FVisualLoggerCommands::Get().SaveToVLog); } MenuBuilder.EndSection(); MenuBuilder.BeginSection("LogFilters", LOCTEXT("FIlterMenu", "Log Filters")); { MenuBuilder.AddSubMenu( LOCTEXT("LoadPreset", "Load Preset"), LOCTEXT("LoadPresetTooltip", "Load filter's preset"), FNewMenuDelegate::CreateRaw(this, &SVisualLogger::FillLoadPresetMenu)); MenuBuilder.AddMenuEntry( LOCTEXT("SavePreset", "Save Preset"), LOCTEXT("SavePresetTooltip", "Save filter's setting as preset"), FSlateIcon(), FUIAction( FExecuteAction::CreateLambda( [this](){ } ))); } MenuBuilder.EndSection(); }
virtual void BuildSectionContextMenu(FMenuBuilder& MenuBuilder, const FGuid& ObjectBinding) override { MenuBuilder.AddSubMenu( LOCTEXT("SetAttach", "Attach"), LOCTEXT("SetAttachTooltip", "Set attach"), FNewMenuDelegate::CreateRaw(AttachTrackEditor, &FActorPickerTrackEditor::ShowActorSubMenu, ObjectBinding, &Section)); }
/** * Fills the Blueprint menu with extra options */ void FillBlueprintOptions(FMenuBuilder& MenuBuilder, TArray<AActor*> SelectedActors) { // Gather Blueprint classes for this actor TArray< FMenuBlueprintClass > BlueprintClasses; GatherBlueprintsForActors( SelectedActors, BlueprintClasses ); MenuBuilder.BeginSection("ActorBlueprint", LOCTEXT("BlueprintsHeading", "Blueprints") ); // Adds the "Create Blueprint..." menu option if valid. { int NumBlueprintableActors = 0; bool IsBlueprintBased = BlueprintClasses.Num() > 1; if(!BlueprintClasses.Num()) { for(auto It(SelectedActors.CreateIterator());It;++It) { AActor* Actor = *It; if( FKismetEditorUtilities::CanCreateBlueprintOfClass(Actor->GetClass())) { NumBlueprintableActors++; } } } const bool bCanHarvestComponentsForBlueprint = (!IsBlueprintBased && (NumBlueprintableActors > 0)); if(bCanHarvestComponentsForBlueprint) { AActor* ActorOverride = nullptr; FUIAction CreateBlueprintAction( FExecuteAction::CreateStatic( &FCreateBlueprintFromActorDialog::OpenDialog, true, ActorOverride ) ); MenuBuilder.AddMenuEntry(LOCTEXT("CreateBlueprint", "Create Blueprint..."), LOCTEXT("CreateBlueprint_Tooltip", "Harvest Components from Selected Actors and create Blueprint"), FSlateIcon(FEditorStyle::GetStyleSetName(), "Kismet.HarvestBlueprintFromActors"), CreateBlueprintAction); } } // Check to see if we have any classes with functions to display if( BlueprintClasses.Num() > 0 ) { { UBlueprint* FirstBlueprint = Cast<UBlueprint>(BlueprintClasses[0].Blueprint.Get()); // Determine if the selected objects that have blueprints are all of the same class, and if they are all up to date bool bAllAreSameType = true; bool bAreAnyNotUpToDate = false; for (int32 ClassIndex = 0; ClassIndex < BlueprintClasses.Num(); ++ClassIndex) { UBlueprint* CurrentBlueprint = Cast<UBlueprint>(BlueprintClasses[ClassIndex].Blueprint.Get()); bAllAreSameType = bAllAreSameType && (CurrentBlueprint == FirstBlueprint); if (CurrentBlueprint != NULL) { bAreAnyNotUpToDate |= !CurrentBlueprint->IsUpToDate(); } } // For a single selected class, we show a top level item (saves 2 clicks); otherwise we show the full hierarchy if (bAllAreSameType && (FirstBlueprint != NULL)) { // Shortcut to edit the blueprint directly, saves two clicks FUIAction UIAction; UIAction.ExecuteAction.BindStatic( &EditKismetCodeFor, /*Blueprint=*/ TWeakObjectPtr<UBlueprint>(FirstBlueprint) ); const FText Label = LOCTEXT("EditBlueprint", "Edit Blueprint"); const FText Description = FText::Format( LOCTEXT("EditBlueprint_ToolTip", "Opens {0} in the Blueprint editor"), FText::FromString( FirstBlueprint->GetName() ) ); MenuBuilder.AddMenuEntry( Label, Description, FSlateIcon(), UIAction ); } else { // More than one type of blueprint is selected, so add a sub-menu for "Edit Kismet Code" MenuBuilder.AddSubMenu( LOCTEXT("EditBlueprintSubMenu", "Edit Blueprint"), LOCTEXT("EditBlueprintSubMenu_ToolTip", "Shows Blueprints that can be opened for editing"), FNewMenuDelegate::CreateStatic( &FillEditCodeMenu, BlueprintClasses ) ); } // For any that aren't up to date, we offer a compile blueprints button if (bAreAnyNotUpToDate) { // Shortcut to edit the blueprint directly, saves two clicks FUIAction UIAction; UIAction.ExecuteAction.BindStatic(&RecompileOutOfDateKismetForSelection); const FText Label = LOCTEXT("CompileOutOfDateBPs", "Compile Out-of-Date Blueprints"); const FText Description = LOCTEXT("CompileOutOfDateBPs_ToolTip", "Compiles out-of-date blueprints for selected actors"); MenuBuilder.AddMenuEntry( Label, Description, FSlateIcon(), UIAction ); } } } MenuBuilder.EndSection(); }
void FStreamingLevelCollectionModel::BuildHierarchyMenu(FMenuBuilder& InMenuBuilder) const { const FLevelCollectionCommands& Commands = FLevelCollectionCommands::Get(); // We show the "level missing" commands, when missing level is selected solely if (IsOneLevelSelected() && InvalidSelectedLevels.Num() == 1) { InMenuBuilder.BeginSection("MissingLevel", LOCTEXT("ViewHeaderRemove", "Missing Level") ); { InMenuBuilder.AddMenuEntry( Commands.FixUpInvalidReference ); InMenuBuilder.AddMenuEntry( Commands.RemoveInvalidReference ); } InMenuBuilder.EndSection(); } // Add common commands InMenuBuilder.BeginSection("Levels", LOCTEXT("LevelsHeader", "Levels") ); { // Make level current if (IsOneLevelSelected()) { InMenuBuilder.AddMenuEntry( Commands.World_MakeLevelCurrent ); } // Visibility commands InMenuBuilder.AddSubMenu( LOCTEXT("VisibilityHeader", "Visibility"), LOCTEXT("VisibilitySubMenu_ToolTip", "Selected Level(s) visibility commands"), FNewMenuDelegate::CreateSP(this, &FStreamingLevelCollectionModel::FillVisibilitySubMenu ) ); // Lock commands InMenuBuilder.AddSubMenu( LOCTEXT("LockHeader", "Lock"), LOCTEXT("LockSubMenu_ToolTip", "Selected Level(s) lock commands"), FNewMenuDelegate::CreateSP(this, &FStreamingLevelCollectionModel::FillLockSubMenu ) ); // Level streaming specific commands if (AreAnyLevelsSelected() && !(IsOneLevelSelected() && GetSelectedLevels()[0]->IsPersistent())) { InMenuBuilder.AddMenuEntry(Commands.World_RemoveSelectedLevels); // InMenuBuilder.AddSubMenu( LOCTEXT("LevelsChangeStreamingMethod", "Change Streaming Method"), LOCTEXT("LevelsChangeStreamingMethod_Tooltip", "Changes the streaming method for the selected levels"), FNewMenuDelegate::CreateRaw(this, &FStreamingLevelCollectionModel::FillSetStreamingMethodSubMenu )); } } InMenuBuilder.EndSection(); // Level selection commands InMenuBuilder.BeginSection("LevelsSelection", LOCTEXT("SelectionHeader", "Selection") ); { InMenuBuilder.AddMenuEntry( Commands.SelectAllLevels ); InMenuBuilder.AddMenuEntry( Commands.DeselectAllLevels ); InMenuBuilder.AddMenuEntry( Commands.InvertLevelSelection ); } InMenuBuilder.EndSection(); // Level actors selection commands InMenuBuilder.BeginSection("Actors", LOCTEXT("ActorsHeader", "Actors") ); { InMenuBuilder.AddMenuEntry( Commands.AddsActors ); InMenuBuilder.AddMenuEntry( Commands.RemovesActors ); // Move selected actors to a selected level if (IsOneLevelSelected()) { InMenuBuilder.AddMenuEntry( Commands.MoveActorsToSelected ); InMenuBuilder.AddMenuEntry( Commands.MoveFoliageToSelected ); } if (AreAnyLevelsSelected() && !(IsOneLevelSelected() && SelectedLevelsList[0]->IsPersistent())) { InMenuBuilder.AddMenuEntry( Commands.SelectStreamingVolumes ); } } InMenuBuilder.EndSection(); }
void FSequencerObjectBindingNode::HandleAddTrackSubMenuNew(FMenuBuilder& AddTrackMenuBuilder, TArray<TArray<UProperty*> > KeyablePropertyPaths) { // [PostProcessSettings] [Bloom1Tint] [X] // [PostProcessSettings] [Bloom1Tint] [Y] // [PostProcessSettings] [ColorGrading] // Create property menu data based on keyable property paths TSet<UProperty*> PropertiesTraversed; TArray<PropertyMenuData> KeyablePropertyMenuData; for (auto KeyablePropertyPath : KeyablePropertyPaths) { PropertyMenuData KeyableMenuData; KeyableMenuData.PropertyPath = KeyablePropertyPath; // If the path is greater than 1, keep track of the actual properties (not channels) and only add these properties once since we can't do single channel keying of a property yet. if (KeyablePropertyPath.Num() > 1) //@todo { if (PropertiesTraversed.Find(KeyablePropertyPath[1]) != nullptr) { continue; } KeyableMenuData.MenuName = FObjectEditorUtils::GetCategoryFName(KeyablePropertyPath[1]).ToString(); PropertiesTraversed.Add(KeyablePropertyPath[1]); } else { // No sub menus items, so skip continue; } KeyablePropertyMenuData.Add(KeyableMenuData); } // Sort on the menu name KeyablePropertyMenuData.Sort([](const PropertyMenuData& A, const PropertyMenuData& B) { int32 CompareResult = A.MenuName.Compare(B.MenuName); return CompareResult < 0; }); // Add menu items for (int32 MenuDataIndex = 0; MenuDataIndex < KeyablePropertyMenuData.Num(); ) { TArray<TArray<UProperty*> > KeyableSubMenuPropertyPaths; KeyableSubMenuPropertyPaths.Add(KeyablePropertyMenuData[MenuDataIndex].PropertyPath); for (; MenuDataIndex < KeyablePropertyMenuData.Num()-1; ) { if (KeyablePropertyMenuData[MenuDataIndex].MenuName == KeyablePropertyMenuData[MenuDataIndex+1].MenuName) { ++MenuDataIndex; KeyableSubMenuPropertyPaths.Add(KeyablePropertyMenuData[MenuDataIndex].PropertyPath); } else { break; } } const int32 PropertyNameIndexStart = 1; // Strip off the struct property name const int32 PropertyNameIndexEnd = 2; // Stop at the property name, don't descend into the channels AddTrackMenuBuilder.AddSubMenu( FText::FromString(KeyablePropertyMenuData[MenuDataIndex].MenuName), FText::GetEmpty(), FNewMenuDelegate::CreateSP(this, &FSequencerObjectBindingNode::AddPropertyMenuItems, KeyableSubMenuPropertyPaths, PropertyNameIndexStart, PropertyNameIndexEnd)); ++MenuDataIndex; } }
void FSequencerObjectBindingNode::BuildContextMenu(FMenuBuilder& MenuBuilder) { ISequencerModule& SequencerModule = FModuleManager::GetModuleChecked<ISequencerModule>("Sequencer"); UObject* BoundObject = GetSequencer().FindSpawnedObjectOrTemplate(ObjectBinding); TSharedRef<FUICommandList> CommandList(new FUICommandList); TSharedPtr<FExtender> Extender = SequencerModule.GetObjectBindingContextMenuExtensibilityManager()->GetAllExtenders(CommandList, TArrayBuilder<UObject*>().Add(BoundObject)); if (Extender.IsValid()) { MenuBuilder.PushExtender(Extender.ToSharedRef()); } if (GetSequencer().IsLevelEditorSequencer()) { UMovieScene* MovieScene = GetSequencer().GetFocusedMovieSceneSequence()->GetMovieScene(); FMovieSceneSpawnable* Spawnable = MovieScene->FindSpawnable(ObjectBinding); if (Spawnable) { MenuBuilder.AddSubMenu( LOCTEXT("OwnerLabel", "Spawned Object Owner"), LOCTEXT("OwnerTooltip", "Specifies how the spawned object is to be owned"), FNewMenuDelegate::CreateSP(this, &FSequencerObjectBindingNode::AddSpawnOwnershipMenu) ); MenuBuilder.AddMenuEntry( FSequencerCommands::Get().ConvertToPossessable ); } else { const UClass* ObjectClass = GetClassForObjectBinding(); if (ObjectClass->IsChildOf(AActor::StaticClass())) { FFormatNamedArguments Args; MenuBuilder.AddSubMenu( FText::Format( LOCTEXT("Assign Actor ", "Assign Actor"), Args), FText::Format( LOCTEXT("AssignActorTooltip", "Assign an actor to this track"), Args ), FNewMenuDelegate::CreateRaw(&GetSequencer(), &FSequencer::AssignActor, ObjectBinding)); } MenuBuilder.AddMenuEntry( FSequencerCommands::Get().ConvertToSpawnable ); } MenuBuilder.AddMenuEntry( LOCTEXT("Import FBX", "Import..."), LOCTEXT("ImportFBXTooltip", "Import FBX animation to this object"), FSlateIcon(), FUIAction( FExecuteAction::CreateLambda([=]{ GetSequencer().ImportFBX(); }) )); MenuBuilder.AddMenuEntry( LOCTEXT("Export FBX", "Export..."), LOCTEXT("ExportFBXTooltip", "Export FBX animation from this object"), FSlateIcon(), FUIAction( FExecuteAction::CreateLambda([=]{ GetSequencer().ExportFBX(); }) )); MenuBuilder.BeginSection("Organize", LOCTEXT("OrganizeContextMenuSectionName", "Organize")); { MenuBuilder.AddSubMenu( LOCTEXT("LabelsSubMenuText", "Labels"), LOCTEXT("LabelsSubMenuTip", "Add or remove labels on this track"), FNewMenuDelegate::CreateSP(this, &FSequencerObjectBindingNode::HandleLabelsSubMenuCreate) ); } MenuBuilder.EndSection(); } FSequencerDisplayNode::BuildContextMenu(MenuBuilder); }
void FMainMenu::FillEditMenu( FMenuBuilder& MenuBuilder, const TSharedRef< FExtender > Extender, const TSharedPtr<FTabManager> TabManager ) { MenuBuilder.BeginSection("EditHistory", LOCTEXT("HistoryHeading", "History")); { struct Local { /** @return Returns a dynamic text string for Undo that contains the name of the action */ static FText GetUndoLabelText() { return FText::Format(LOCTEXT("DynamicUndoLabel", "Undo {0}"), GUnrealEd->Trans->GetUndoContext().Title); } /** @return Returns a dynamic text string for Redo that contains the name of the action */ static FText GetRedoLabelText() { return FText::Format(LOCTEXT("DynamicRedoLabel", "Redo {0}"), GUnrealEd->Trans->GetRedoContext().Title); } }; // Undo TAttribute<FText> DynamicUndoLabel; DynamicUndoLabel.BindStatic(&Local::GetUndoLabelText); MenuBuilder.AddMenuEntry( FGenericCommands::Get().Undo, "Undo", DynamicUndoLabel); // TAttribute< FString >::Create( &Local::GetUndoLabelText ) ); // Redo TAttribute< FText > DynamicRedoLabel; DynamicRedoLabel.BindStatic( &Local::GetRedoLabelText ); MenuBuilder.AddMenuEntry(FGenericCommands::Get().Redo, "Redo", DynamicRedoLabel); // TAttribute< FString >::Create( &Local::GetRedoLabelText ) ); } MenuBuilder.EndSection(); MenuBuilder.BeginSection("EditLocalTabSpawners", LOCTEXT("ConfigurationHeading", "Configuration")); { if (GetDefault<UEditorExperimentalSettings>()->bToolbarCustomization) { FUIAction ToggleMultiBoxEditMode( FExecuteAction::CreateStatic(&FMultiBoxSettings::ToggleToolbarEditing), FCanExecuteAction(), FIsActionChecked::CreateStatic(&FMultiBoxSettings::IsInToolbarEditMode) ); MenuBuilder.AddMenuEntry( LOCTEXT("EditToolbarsLabel", "Edit Toolbars"), LOCTEXT("EditToolbarsToolTip", "Allows customization of each toolbar"), FSlateIcon(), ToggleMultiBoxEditMode, NAME_None, EUserInterfaceActionType::ToggleButton ); // Automatically populate tab spawners from TabManager if (TabManager.IsValid()) { const IWorkspaceMenuStructure& MenuStructure = WorkspaceMenu::GetMenuStructure(); TabManager->PopulateTabSpawnerMenu(MenuBuilder, MenuStructure.GetEditOptions()); } } if (GetDefault<UEditorStyleSettings>()->bExpandConfigurationMenus) { MenuBuilder.AddSubMenu( LOCTEXT("EditorPreferencesSubMenuLabel", "Editor Preferences"), LOCTEXT("EditorPreferencesSubMenuToolTip", "Configure the behavior and features of this Editor"), FNewMenuDelegate::CreateStatic(&FSettingsMenu::MakeMenu, FName("Editor")) ); MenuBuilder.AddSubMenu( LOCTEXT("ProjectSettingsSubMenuLabel", "Project Settings"), LOCTEXT("ProjectSettingsSubMenuToolTip", "Change the settings of the currently loaded project"), FNewMenuDelegate::CreateStatic(&FSettingsMenu::MakeMenu, FName("Project")) ); } else { MenuBuilder.AddMenuEntry( LOCTEXT("EditorPreferencesMenuLabel", "Editor Preferences..."), LOCTEXT("EditorPreferencesMenuToolTip", "Configure the behavior and features of this Editor"), FSlateIcon(), FUIAction(FExecuteAction::CreateStatic(&FSettingsMenu::OpenSettings, FName("Editor"), FName("General"), FName("Appearance"))) ); MenuBuilder.AddMenuEntry( LOCTEXT("ProjectSettingsMenuLabel", "Project Settings..."), LOCTEXT("ProjectSettingsMenuToolTip", "Change the settings of the currently loaded project"), FSlateIcon(), FUIAction(FExecuteAction::CreateStatic(&FSettingsMenu::OpenSettings, FName("Project"), FName("Game"), FName("General"))) ); } } MenuBuilder.EndSection(); }
void FLevelEditorContextMenu::FillMenu( FMenuBuilder& MenuBuilder, TWeakPtr<SLevelEditor> LevelEditor, LevelEditorMenuContext ContextType, TSharedPtr<FExtender> Extender ) { // Generate information about our selection TArray<AActor*> SelectedActors; GEditor->GetSelectedActors()->GetSelectedObjects<AActor>( SelectedActors ); FSelectedActorInfo& SelectionInfo = FLevelEditorContextMenuImpl::SelectionInfo; SelectionInfo = AssetSelectionUtils::BuildSelectedActorInfo( SelectedActors ); // Get all menu extenders for this context menu from the level editor module FLevelEditorModule& LevelEditorModule = FModuleManager::GetModuleChecked<FLevelEditorModule>( TEXT("LevelEditor") ); TArray<FLevelEditorModule::FLevelViewportMenuExtender_SelectedActors> MenuExtenderDelegates = LevelEditorModule.GetAllLevelViewportContextMenuExtenders(); TArray<TSharedPtr<FExtender>> Extenders; if(Extender.IsValid()) { Extenders.Add(Extender); } auto LevelEditorActions = LevelEditor.Pin()->GetLevelEditorActions().ToSharedRef(); for (int32 i = 0; i < MenuExtenderDelegates.Num(); ++i) { if (MenuExtenderDelegates[i].IsBound()) { Extenders.Add(MenuExtenderDelegates[i].Execute(LevelEditorActions, SelectedActors)); } } MenuBuilder.PushCommandList(LevelEditorActions); MenuBuilder.PushExtender(FExtender::Combine(Extenders).ToSharedRef()); TArray<TWeakObjectPtr<UObject>> LabelObjects; for ( FSelectionIterator SelItor(*GEditor->GetSelectedActors()) ; SelItor ; ++SelItor ) { LabelObjects.Add(*SelItor); } // Check if current selection has any assets that can be browsed to TArray< UObject* > ReferencedAssets; GEditor->GetReferencedAssetsForEditorSelection( ReferencedAssets ); const bool bCanSyncToContentBrowser = GEditor->CanSyncToContentBrowser(); if( bCanSyncToContentBrowser || ReferencedAssets.Num() > 0 ) { MenuBuilder.BeginSection("ActorAsset", LOCTEXT("AssetHeading", "Asset") ); { if( bCanSyncToContentBrowser ) { MenuBuilder.AddMenuEntry( FGlobalEditorCommonCommands::Get().FindInContentBrowser ); } if( ReferencedAssets.Num() == 1 ) { auto Asset = ReferencedAssets[0]; MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().EditAsset, NAME_None, FText::Format( LOCTEXT("EditAssociatedAsset", "Edit {0}"), FText::FromString( Asset->GetName() ) ), TAttribute<FText>(), FSlateIcon( FEditorStyle::GetStyleSetName(), FClassIconFinder::FindIconNameForClass( Asset->GetClass() ) ) ); } else if ( ReferencedAssets.Num() > 1 ) { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().EditAssetNoConfirmMultiple, NAME_None, LOCTEXT("EditAssociatedAssetsMultiple", "Edit Multiple Assets"), TAttribute<FText>(), FSlateIcon( FEditorStyle::GetStyleSetName(), "ClassIcon.Default" ) ); } MenuBuilder.AddMenuEntry( FGlobalEditorCommonCommands::Get().ViewReferences ); } MenuBuilder.EndSection(); } MenuBuilder.BeginSection( "ActorControl", LOCTEXT("ActorHeading", "Actor") ); { MenuBuilder.AddMenuEntry( FEditorViewportCommands::Get().FocusViewportToSelection ); MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().SnapCameraToActor ); } MenuBuilder.EndSection(); // Go to C++ Code if( SelectionInfo.SelectionClass != NULL ) { if ( FSourceCodeNavigation::IsCompilerAvailable()) { FString ClassHeaderPath; if( FSourceCodeNavigation::FindClassHeaderPath( SelectionInfo.SelectionClass, ClassHeaderPath ) && IFileManager::Get().FileSize( *ClassHeaderPath ) != INDEX_NONE ) { const FString CodeFileName = FPaths::GetCleanFilename( *ClassHeaderPath ); MenuBuilder.BeginSection( "ActorCode", LOCTEXT("ActorCodeHeading", "C++") ); { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().GoToCodeForActor, NAME_None, FText::Format( LOCTEXT("GoToCodeForActor", "Open {0}"), FText::FromString( CodeFileName ) ), FText::Format( LOCTEXT("GoToCodeForActor_ToolTip", "Opens the header file for this actor ({0}) in a code editing program"), FText::FromString( CodeFileName ) ) ); } MenuBuilder.EndSection(); } } const FString DocumentationLink = FEditorClassUtils::GetDocumentationLink(SelectionInfo.SelectionClass); if (!DocumentationLink.IsEmpty()) { MenuBuilder.BeginSection( "ActorDocumentation", LOCTEXT("ActorDocsHeading", "Documentation") ); { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().GoToDocsForActor, NAME_None, LOCTEXT("GoToDocsForActor", "View Documentation"), LOCTEXT("GoToDocsForActor_ToolTip", "Click to open documentation for this actor"), FSlateIcon(FEditorStyle::GetStyleSetName(), "HelpIcon.Hovered" )); } MenuBuilder.EndSection(); } } MenuBuilder.BeginSection("ActorSelectVisibilityLevels"); { // Add a sub-menu for "Select" MenuBuilder.AddSubMenu( LOCTEXT("SelectSubMenu", "Select"), LOCTEXT("SelectSubMenu_ToolTip", "Opens the actor selection menu"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillSelectActorMenu ) ); MenuBuilder.AddSubMenu( LOCTEXT("EditSubMenu", "Edit"), FText::GetEmpty(), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillEditMenu, ContextType ) ); MenuBuilder.AddSubMenu( LOCTEXT("VisibilitySubMenu", "Visibility"), LOCTEXT("VisibilitySubMenu_ToolTip", "Selected actor visibility options"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillActorVisibilityMenu ) ); // Build the menu for grouping actors BuildGroupMenu( MenuBuilder, SelectionInfo ); MenuBuilder.AddSubMenu( LOCTEXT("LevelSubMenu", "Level"), LOCTEXT("LevelSubMenu_ToolTip", "Options for interacting with this actor's level"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillActorLevelMenu ) ); } MenuBuilder.EndSection(); if (ContextType == LevelEditorMenuContext::Viewport) { LevelEditorCreateActorMenu::FillAddReplaceViewportContextMenuSections( MenuBuilder ); } if( GEditor->PlayWorld != NULL ) { if( SelectionInfo.NumSelected > 0 ) { MenuBuilder.BeginSection( "Simulation", NSLOCTEXT( "LevelViewportContextMenu", "SimulationHeading", "Simulation" ) ); { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().KeepSimulationChanges ); } MenuBuilder.EndSection(); } } MenuBuilder.BeginSection("LevelViewportAttach"); { // Only display the attach menu if we have actors selected if ( GEditor->GetSelectedActorCount() ) { if(SelectionInfo.bHaveAttachedActor) { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().DetachFromParent ); } MenuBuilder.AddSubMenu( LOCTEXT( "ActorAttachToSubMenu", "Attach To" ), LOCTEXT( "ActorAttachToSubMenu_ToolTip", "Attach Actor as child" ), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillActorMenu ) ); } // Add a heading for "Movement" if an actor is selected if ( GEditor->GetSelectedActorIterator() ) { // Add a sub-menu for "Transform" MenuBuilder.AddSubMenu( LOCTEXT("TransformSubMenu", "Transform"), LOCTEXT("TransformSubMenu_ToolTip", "Actor transform utils"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillTransformMenu ) ); } // @todo UE4: The current pivot options only work for brushes if( SelectionInfo.bHaveBrush ) { // You can only move the pivot in ortho viewports, but you can reset it in any viewport if( GCurrentLevelEditingViewportClient->ViewportType != LVT_Perspective ) { // Add a sub-menu for "Pivot" MenuBuilder.AddSubMenu( LOCTEXT("PivotSubMenu", "Pivot"), LOCTEXT("PivotSubMenu_ToolTip", "Actor pivoting utils"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillPivotMenu ) ); } else { MenuBuilder.AddMenuEntry( FLevelEditorCommands::Get().ResetPivot ); } } if (GetDefault<UEditorExperimentalSettings>()->bActorMerging && (SelectionInfo.bHaveStaticMeshComponent || SelectionInfo.bHaveLandscape)) { MenuBuilder.AddSubMenu( LOCTEXT("MergeActorsSubMenu", "Merge"), LOCTEXT("MergeActorsSubMenu_ToolTip", "Actor merging utils"), FNewMenuDelegate::CreateStatic( &FLevelEditorContextMenuImpl::FillMergeActorsMenu ) ); } } MenuBuilder.EndSection(); FLevelScriptEventMenuHelper::FillLevelBlueprintEventsMenu(MenuBuilder, SelectedActors); MenuBuilder.PopCommandList(); MenuBuilder.PopExtender(); }