// Copyright Epic Games, Inc. All Rights Reserved. #include "MoviePipelineQuickRenderMenu.h" #include "Customizations/Graph/MovieGraphQuickRenderSettingsCustomization.h" #include "Editor.h" #include "Framework/Application/SlateApplication.h" #include "Framework/Docking/TabManager.h" #include "Graph/MovieGraphQuickRender.h" #include "Misc/ConfigCacheIni.h" #include "Misc/MessageDialog.h" #include "MoviePipelineQuickRenderUIState.h" #include "MoviePipelineUtils.h" #include "MovieRenderPipelineCoreModule.h" #include "MovieRenderPipelineEditorModule.h" #include "MovieRenderPipelineEditorUtils.h" #include "MovieRenderPipelineSettings.h" #include "MovieRenderPipelineStyle.h" #include "PropertyEditorModule.h" #include "SActionButton.h" #include "Styling/ToolBarStyle.h" #include "ToolMenu.h" #include "ToolMenus.h" #include "Widgets/Input/SComboBox.h" #include "Widgets/Text/SRichTextBlock.h" class UMovieGraphVariable; class UMovieGraphConfig; #define LOCTEXT_NAMESPACE "FMoviePipelineQuickRenderMenu" void FMoviePipelineQuickRenderMenu::AddQuickRenderButtonToToolMenu(UToolMenu* InMenu) { if (!InMenu) { return; } // Use a lambda to fetch the button icon so it can change dynamically with the active mode const TAttribute ToolbarIconAttribute = TAttribute::CreateLambda([]() { const EMovieGraphQuickRenderButtonMode ButtonMode = FMoviePipelineQuickRenderUIState::GetQuickRenderButtonMode(); const EMovieGraphQuickRenderMode QuickRenderMode = FMoviePipelineQuickRenderUIState::GetQuickRenderMode(); if (ButtonMode == EMovieGraphQuickRenderButtonMode::QuickRender) { return GetIconForQuickRenderMode(QuickRenderMode); } return FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.MovieRenderQueueMode"); }); // Add to the existing "Content" section in the Assets toolbar FToolMenuSection& Section = InMenu->FindOrAddSection("Content"); const FToolMenuEntry QuickRenderLaunchButton = FToolMenuEntry::InitToolBarButton( "QuickRender", FUIAction( FExecuteAction::CreateStatic(&FMoviePipelineQuickRenderMenu::QuickRenderButtonPressed)), LOCTEXT("QuickRenderButtonName", "Quick Render"), TAttribute::Create( TAttribute::FGetter::CreateLambda([]() { return LOCTEXT("BeginQuickRender", "Begin Render\n\nThere are two modes to choose from:" "\n- Movie Render Queue. This uses the job(s) that are active in the Movie Render Queue editor as the source of the render." "\n\n- Quick Render. This performs a render without having to manually configure a queue and a graph. A typical quick render uses " "the current map and level sequence, the level sequence's playback range, and the viewport's look, to generate frames. Several different types of quick " "renders are available -- see the options drop-down."); }) ), ToolbarIconAttribute ); Section.AddEntry(QuickRenderLaunchButton); const FToolMenuEntry QuickRenderOptionsButton = FToolMenuEntry::InitComboButton( "QuickRenderOptions", FUIAction(), FOnGetContent::CreateStatic(&FMoviePipelineQuickRenderMenu::GenerateQuickRenderOptionsMenu), LOCTEXT("QuickRenderOptionsLabel", "Quick Render Options"), LOCTEXT("QuickRenderOptionsToolTip", "Quick Render Options"), TAttribute(), true ); Section.AddEntry(QuickRenderOptionsButton); } void FMoviePipelineQuickRenderMenu::RemoveQuickRenderButtonToolMenu() { if (UToolMenus* ToolMenus = UToolMenus::TryGet()) { ToolMenus->RemoveEntry("LevelEditor.LevelEditorToolBar.AssetsToolBar", "Content", "QuickRender"); } } void FMoviePipelineQuickRenderMenu::LoadQuickRenderSettings() { InitQuickRenderModeSettingsFromMode(FMoviePipelineQuickRenderUIState::GetQuickRenderMode()); } void FMoviePipelineQuickRenderMenu::QuickRenderButtonPressed() { LoadQuickRenderSettings(); if (FMoviePipelineQuickRenderUIState::GetQuickRenderButtonMode() == EMovieGraphQuickRenderButtonMode::QuickRender) { // The settings window will have its own Render button, so don't perform the render if showing the settings first if (FMoviePipelineQuickRenderUIState::GetShouldShowSettingsBeforeRender()) { OpenQuickRenderSettingsWindow(FToolMenuContext()); } else { UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem(); QuickRenderSubsystem->BeginQuickRender(FMoviePipelineQuickRenderUIState::GetQuickRenderMode(), QuickRenderModeSettings.Get()); } } else { // If there's an existing Movie Render Queue tab open, try to do a render with what's in the queue. Otherwise, just open the MRQ editor tab. if (FGlobalTabmanager::Get()->FindExistingLiveTab(IMovieRenderPipelineEditorModule::MoviePipelineQueueTabName)) { if (!UE::MovieRenderPipelineEditor::Private::PerformLocalRender()) { FMessageDialog::Open( EAppMsgType::Ok, LOCTEXT("UnableToStartLocalRender", "Unable to start local render. Make sure a job is present in the queue, a render is not currently running, and an executor is specified in Project Settings.")); } } else { FGlobalTabmanager::Get()->TryInvokeTab(IMovieRenderPipelineEditorModule::MoviePipelineQueueTabName); } } } TSharedRef FMoviePipelineQuickRenderMenu::GenerateQuickRenderOptionsMenu() { static const FName MenuName("MoviePipeline.QuickRenderOptionsMenu"); LoadQuickRenderSettings(); if (!UToolMenus::Get()->IsMenuRegistered(MenuName)) { UToolMenu* Menu = UToolMenus::Get()->RegisterMenu(MenuName); GenerateModesMenuSection(Menu); GenerateQuickRenderMenuSection(Menu); GenerateQuickRenderConfigurationMenuSection(Menu); GenerateOutputMenuSection(Menu); GenerateSettingsMenuSection(Menu); } return UToolMenus::Get()->GenerateWidget(MenuName, FToolMenuContext()); } void FMoviePipelineQuickRenderMenu::OpenQuickRenderSettingsWindow(const FToolMenuContext& InToolMenuContext) { LoadQuickRenderSettings(); if (const TSharedPtr SettingsWindow = WeakQuickRenderSettingsWindow.Pin()) { SettingsWindow->DrawAttention(FWindowDrawAttentionParameters()); return; } // Before the window opens, sync up the mode that the Settings window is using to be the mode that the toolbar shows FMoviePipelineQuickRenderUIState::SetWindowQuickRenderMode(FMoviePipelineQuickRenderUIState::GetQuickRenderMode()); // Init the modes that are available to switch to QuickRenderModes.Empty(); const UEnum* ModesEnum = StaticEnum(); for (int32 EnumIndex = 0; EnumIndex < ModesEnum->NumEnums() - 1; ++EnumIndex) // -1 to avoid MAX { QuickRenderModes.Add(MakeShared(ModesEnum->GetNameByIndex(EnumIndex))); } // Update the graph preset's variable assignments in case the graph was updated since the last time the window opened UpdateVariableAssignmentsForCurrentGraph(); FPropertyEditorModule& PropertyEditorModule = FModuleManager::Get().LoadModuleChecked("PropertyEditor"); FDetailsViewArgs DetailsViewArgs; DetailsViewArgs.bShowPropertyMatrixButton = false; DetailsViewArgs.bCustomNameAreaLocation = false; DetailsViewArgs.NameAreaSettings = FDetailsViewArgs::HideNameArea; DetailsViewArgs.bAllowSearch = false; DetailsViewArgs.ViewIdentifier = "MoviePipelineQuickRenderSettings"; DetailsViewArgs.bLockable = false; // Create the details panel and display the quick render settings const TSharedPtr DetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs); DetailsView->RegisterInstancedCustomPropertyLayout( UMovieGraphQuickRenderModeSettings::StaticClass(), FOnGetDetailCustomizationInstance::CreateStatic(&FMovieGraphQuickRenderSettingsCustomization::MakeInstance)); DetailsView->SetObject(QuickRenderModeSettings.Get()); const TSharedRef QuickRenderSettingsWindow = SNew(SWindow) .Title(LOCTEXT("QuickRenderSettingsWindow_Title", "Quick Render")) .SupportsMaximize(false) .ClientSize(FVector2D(600.f, 510.f)) .Content() [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .HAlign(HAlign_Fill) [ GenerateQuickRenderSettingsWindowToolbar() ] + SVerticalBox::Slot() [ DetailsView.ToSharedRef() ] ]; if (const TSharedPtr RootWindow = FGlobalTabmanager::Get()->GetRootWindow()) { FSlateApplication::Get().AddWindowAsNativeChild(QuickRenderSettingsWindow, RootWindow.ToSharedRef()); } else { FSlateApplication::Get().AddWindow(QuickRenderSettingsWindow); } WeakDetailsPanel = DetailsView; WeakQuickRenderSettingsWindow = QuickRenderSettingsWindow; } TSharedRef FMoviePipelineQuickRenderMenu::GenerateQuickRenderSettingsWindowToolbar() { auto GetWidgetForQuickRenderMode = [](TFunction&& GetQuickRenderMode) { return SNew(SHorizontalBox) + SHorizontalBox::Slot() .Padding(FMargin{0.0f, 0.0f, 5.0f, 0.0f}) .AutoWidth() [ SNew(SImage) .ColorAndOpacity(FSlateColor::UseForeground()) .Image_Lambda([GetQuickRenderMode]() { return GetIconForQuickRenderMode(GetQuickRenderMode()).GetIcon(); }) .DesiredSizeOverride(FVector2d(16, 16)) ] + SHorizontalBox::Slot() [ SNew(STextBlock) .Text_Lambda([GetQuickRenderMode]() { return StaticEnum()->GetDisplayNameTextByValue(static_cast(GetQuickRenderMode())); }) .ToolTipText_Lambda([GetQuickRenderMode]() { const UEnum* ModeEnum = StaticEnum(); return ModeEnum->GetToolTipTextByIndex(ModeEnum->GetIndexByValue(static_cast(GetQuickRenderMode()))); }) ]; }; FToolBarBuilder ToolbarBuilder(TSharedPtr(), FMultiBoxCustomization::None); ToolbarBuilder.BeginSection("Quick Render"); ToolbarBuilder.AddWidget( SNew(SComboBox>) .OptionsSource(&FMoviePipelineQuickRenderMenu::QuickRenderModes) .OnGenerateWidget_Lambda([GetWidgetForQuickRenderMode](TSharedPtr InItem) { return GetWidgetForQuickRenderMode([InItem]() { const int64 ModeValue = StaticEnum()->GetValueByName(*InItem); return static_cast(ModeValue); }); }) .OnSelectionChanged_Lambda([](TSharedPtr InSelectedItem, ESelectInfo::Type) { const EMovieGraphQuickRenderMode NewRenderMode = static_cast( StaticEnum()->GetValueByName(*InSelectedItem)); FMoviePipelineQuickRenderUIState::SetWindowQuickRenderMode(NewRenderMode); // Also inform the details panel of this change. It needs to display new settings for the chosen mode. if (const TSharedPtr DetailsPanel = WeakDetailsPanel.Pin()) { InitQuickRenderModeSettingsFromMode(NewRenderMode); DetailsPanel->SetObject(QuickRenderModeSettings.Get()); } }) [ GetWidgetForQuickRenderMode([]() { return FMoviePipelineQuickRenderUIState::GetWindowQuickRenderMode(); }) ], NAME_None, false, HAlign_Left); ToolbarBuilder.AddWidget( SNew(SActionButton) .Text(LOCTEXT("QuickRenderSettingsWindow_QuickRenderButtonText", "Quick Render")) .Icon(FAppStyle::Get().GetBrush("LevelEditor.OpenCinematic")) .ActionButtonType(EActionButtonType::Primary) .OnClicked_Lambda([]() { // Sync the Setting window's mode to the toolbar mode. This is only done when a render is performed, not when the window is closed. FMoviePipelineQuickRenderUIState::SetQuickRenderMode(FMoviePipelineQuickRenderUIState::GetWindowQuickRenderMode()); UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem(); QuickRenderSubsystem->BeginQuickRender(FMoviePipelineQuickRenderUIState::GetQuickRenderMode(), QuickRenderModeSettings.Get()); return FReply::Handled(); }), NAME_None, false, HAlign_Right); ToolbarBuilder.EndSection(); return ToolbarBuilder.MakeWidget(); } void FMoviePipelineQuickRenderMenu::GenerateModesMenuSection(UToolMenu* InMenu) { FToolMenuSection& Section = InMenu->AddSection("MoviePipelineQuickRenderModes", LOCTEXT("QuickRenderModesSection", "Modes")); auto AddModeAction = [&Section](const FName& InName, const FText& InLabel, const FText& InToolTip, const FSlateIcon& InIcon, EMovieGraphQuickRenderButtonMode CheckedValue) { FToolUIAction NewAction; NewAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([CheckedValue](const FToolMenuContext&) { FMoviePipelineQuickRenderUIState::SetQuickRenderButtonMode(CheckedValue); QuickRenderModeSettings->PostEditChange(); }); NewAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { return true; }); NewAction.GetActionCheckState = FToolMenuGetActionCheckState::CreateLambda([CheckedValue](const FToolMenuContext&) { return (FMoviePipelineQuickRenderUIState::GetQuickRenderButtonMode() == CheckedValue) ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; }); Section.AddMenuEntry(InName, InLabel, InToolTip, InIcon, NewAction, EUserInterfaceActionType::RadioButton); }; AddModeAction( FName("QuickRender_MovieRenderQueueMode"), LOCTEXT("QuickRenderMode_MovieRenderQueueLabel", "Movie Render Queue"), LOCTEXT("QuickRenderMode_MovieRenderQueueToolTip", "Performs a render with the job(s) currently active in the Movie Render Queue editor."), FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.MovieRenderQueueMode"), EMovieGraphQuickRenderButtonMode::NormalMovieRenderQueue); AddModeAction( FName("QuickRender_QuickRenderMode"), LOCTEXT("QuickRenderMode_QuickRenderLabel", "Quick Render"), LOCTEXT("QuickRenderMode_QuickRenderToolTip", "Performs a render using the Quick Render settings."), FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.QuickRenderMode"), EMovieGraphQuickRenderButtonMode::QuickRender); } void FMoviePipelineQuickRenderMenu::GenerateQuickRenderMenuSection(UToolMenu* InMenu) { FToolMenuSection& Section = InMenu->AddSection("MoviePipelineQuickRenderType", LOCTEXT("QuickRenderType", "Quick Render")); auto AddQuickRenderModeAction = [&Section](const FName& InName, EMovieGraphQuickRenderMode CheckedValue) { const UEnum* ModeEnum = StaticEnum(); const int32 ValueIndex = ModeEnum->GetIndexByValue(static_cast(CheckedValue)); const FText ActionTooltip = ModeEnum->GetToolTipTextByIndex(ValueIndex); const FText ActionLabel = ModeEnum->GetDisplayNameTextByIndex(ValueIndex); FToolUIAction NewAction; NewAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([CheckedValue](const FToolMenuContext&) { FMoviePipelineQuickRenderUIState::SetQuickRenderMode(CheckedValue); QuickRenderModeSettings->PostEditChange(); }); NewAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { return true; }); NewAction.GetActionCheckState = FToolMenuGetActionCheckState::CreateLambda([CheckedValue](const FToolMenuContext&) { return (FMoviePipelineQuickRenderUIState::GetQuickRenderMode() == CheckedValue) ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; }); Section.AddMenuEntry(InName, ActionLabel, ActionTooltip, GetIconForQuickRenderMode(CheckedValue), NewAction, EUserInterfaceActionType::RadioButton); }; AddQuickRenderModeAction( FName("QuickRender_CurrentSequence"), EMovieGraphQuickRenderMode::CurrentSequence); AddQuickRenderModeAction( FName("QuickRender_UseViewportCamera"), EMovieGraphQuickRenderMode::UseViewportCameraInSequence); // The "Current Shot at Playhead" mode is disabled for now, may be added in the future. /*AddQuickRenderModeAction( FName("QuickRender_CurrentShotAtPlayhead"), EMovieGraphQuickRenderMode::CurrentShotAtPlayhead);*/ AddQuickRenderModeAction( FName("QuickRender_CurrentViewport"), EMovieGraphQuickRenderMode::CurrentViewport); AddQuickRenderModeAction( FName("QuickRender_SelectedCameras"), EMovieGraphQuickRenderMode::SelectedCameras); } void FMoviePipelineQuickRenderMenu::GenerateQuickRenderConfigurationMenuSection(UToolMenu* InMenu) { FToolMenuSection& Section = InMenu->AddSection("MoviePipelineQuickRenderConfiguration", LOCTEXT("QuickRenderConfiguration", "Quick Render Configuration")); Section.AddEntry(FToolMenuEntry::InitWidget( "QuickRenderConfiguration", SNew(SBox) .Padding(FMargin(16.f, 3.f)) [ SNew(SRichTextBlock) .TextStyle(FAppStyle::Get(), "NormalText.Subdued") .Text_Lambda([]() { // Generate "Configuration" text const FText GraphName = !QuickRenderModeSettings->GraphPreset.IsNull() ? FText::FromString(QuickRenderModeSettings->GraphPreset.GetAssetName()) : LOCTEXT("QuickRenderConfigMenu_InvalidGraph", "Invalid"); // Generate "After Render" text const FText AfterRender = (QuickRenderModeSettings->PostRenderBehavior == EMovieGraphQuickRenderPostRenderActionType::PlayRenderOutput) ? LOCTEXT("QuickRenderConfigMenu_PlayRenderOutput", "Play Render Output") : LOCTEXT("QuickRenderConfigMenu_DoNothing", "Do Nothing"); // Generate "Viewport Look" text const EMovieGraphQuickRenderViewportLookFlags ViewportLookFlags = static_cast(QuickRenderModeSettings->ViewportLookFlags); TArray ViewportFlags; if (EnumHasAnyFlags(ViewportLookFlags, EMovieGraphQuickRenderViewportLookFlags::Ocio)) { ViewportFlags.Add(LOCTEXT("QuickRenderConfigMenu_OCIO", "OCIO")); } if (EnumHasAnyFlags(ViewportLookFlags, EMovieGraphQuickRenderViewportLookFlags::ShowFlags)) { ViewportFlags.Add(LOCTEXT("QuickRenderConfigMenu_ShowFlags", "Show Flags")); } if (EnumHasAnyFlags(ViewportLookFlags, EMovieGraphQuickRenderViewportLookFlags::ViewMode)) { ViewportFlags.Add(LOCTEXT("QuickRenderConfigMenu_ViewMode", "View Mode")); } if (ViewportLookFlags == EMovieGraphQuickRenderViewportLookFlags::None) { ViewportFlags.Add(LOCTEXT("QuickRenderConfigMenu_DontApply", "Don't Apply")); } // Generate "Sequencer Frame Range" text const FText SequencerFrameRange = StaticEnum()->GetDisplayNameTextByValue(static_cast(QuickRenderModeSettings->FrameRangeType)); // TODO: Add in graph variables summary as well (although this might make a summary that's too long in some cases) FText ConfigurationSummaryText = FText::Format( LOCTEXT("QuickRenderConfigurationSummary", "Configuration: {0}\nAfter Render: {1}\nApply Viewport Look: {2}\nSequencer Frame Range: {3}"), { GraphName, AfterRender, FText::Join(LOCTEXT("CommaDelim", ", "), ViewportFlags), SequencerFrameRange, }); return ConfigurationSummaryText; }) .LineHeightPercentage(1.3f) ], FText::GetEmpty() )); } void FMoviePipelineQuickRenderMenu::GenerateOutputMenuSection(UToolMenu* InMenu) { // Only show the section if Quick Render mode is active FToolMenuSection& Section = InMenu->AddSection("MoviePipelineQuickRenderOutput", LOCTEXT("QuickRenderOutput", "Output")); Section.Visibility = TAttribute::CreateLambda([]() -> EVisibility { return (FMoviePipelineQuickRenderUIState::GetQuickRenderButtonMode() == EMovieGraphQuickRenderButtonMode::QuickRender) ? EVisibility::Visible : EVisibility::Collapsed; }); // Menu entry for "Play Last Render" // --------------------------------- FToolUIAction PlayLastRenderAction; PlayLastRenderAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([](const FToolMenuContext&) { UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem(); QuickRenderSubsystem->PlayLastRender(); }); PlayLastRenderAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem(); return QuickRenderSubsystem->CanPlayLastRender(); }); Section.AddMenuEntry( "QuickRender_PlayLastRender", LOCTEXT("QuickRender_PlayLastRenderLabel", "Play Last Render"), LOCTEXT("QuickRender_PlayLastRenderToolTip", "Play the media from the last time that Quick Render ran."), FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.PlayLastRender"), PlayLastRenderAction); // Menu entry for "Open Output Directory" // -------------------------------------- FToolUIAction OpenOutputDirectoryAction; OpenOutputDirectoryAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([](const FToolMenuContext&) { UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem(); QuickRenderSubsystem->OpenOutputDirectory(QuickRenderModeSettings.Get()); }); OpenOutputDirectoryAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { return true; }); Section.AddMenuEntry( "QuickRender_OpenOutputDirectory", LOCTEXT("QuickRender_OpenOutputDirectoryLabel", "Open Output Directory"), LOCTEXT("QuickRender_OpenOutputDirectoryToolTip", "Open the output directory that Quick Render is currently configured to save media into."), FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.FolderOpen"), OpenOutputDirectoryAction); } void FMoviePipelineQuickRenderMenu::GenerateSettingsMenuSection(UToolMenu* InMenu) { FToolMenuSection& Section = InMenu->AddSection("MoviePipelineQuickRenderSettings"); Section.AddSeparator("SettingsSeparator"); FToolUIAction ShowSettingsAction; ShowSettingsAction.ExecuteAction = FToolMenuExecuteAction::CreateLambda([](const FToolMenuContext&) { FMoviePipelineQuickRenderUIState::SetShouldShowSettingsBeforeRender(!FMoviePipelineQuickRenderUIState::GetShouldShowSettingsBeforeRender()); QuickRenderModeSettings->PostEditChange(); }); ShowSettingsAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { return true; }); ShowSettingsAction.GetActionCheckState = FToolMenuGetActionCheckState::CreateLambda([](const FToolMenuContext&) { return FMoviePipelineQuickRenderUIState::GetShouldShowSettingsBeforeRender() ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; }); Section.AddMenuEntry( "QuickRender_ShowSettingsBefore", LOCTEXT("QuickRender_ShowSettingsBeforeLabel", "Show Settings Before Quick Render"), LOCTEXT("QuickRender_ShowSettingsBeforeToolTip", "Show the quick render settings before starting a quick render."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "Icons.OpenInExternalEditor"), ShowSettingsAction, EUserInterfaceActionType::ToggleButton); FToolUIAction OpenSettingsAction; OpenSettingsAction.ExecuteAction = FToolMenuExecuteAction::CreateStatic(&FMoviePipelineQuickRenderMenu::OpenQuickRenderSettingsWindow); OpenSettingsAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&) { return true; }); Section.AddMenuEntry( "QuickRender_OpenSettings", LOCTEXT("QuickRender_OpenSettingsLabel", "Quick Render Settings"), LOCTEXT("QuickRender_OpenSettingsToolTip", "Open the quick render settings."), FSlateIcon(FAppStyle::Get().GetStyleSetName(), "Icons.Settings"), OpenSettingsAction); } FSlateIcon FMoviePipelineQuickRenderMenu::GetIconForQuickRenderMode(const EMovieGraphQuickRenderMode QuickRenderMode) { switch(QuickRenderMode) { case EMovieGraphQuickRenderMode::CurrentSequence: return FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.CurrentSequenceMode"); case EMovieGraphQuickRenderMode::CurrentViewport: return FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.CurrentViewportMode"); case EMovieGraphQuickRenderMode::SelectedCameras: return FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.SelectedCamerasMode"); case EMovieGraphQuickRenderMode::UseViewportCameraInSequence: return FSlateIcon(FMovieRenderPipelineStyle::Get().GetStyleSetName(), "MovieRenderPipeline.QuickRender.Icon.ViewportCameraInSequenceMode"); default: return FSlateIcon(); } } void FMoviePipelineQuickRenderMenu::InitQuickRenderModeSettingsFromMode(const EMovieGraphQuickRenderMode QuickRenderMode) { QuickRenderModeSettings = TStrongObjectPtr(UMovieGraphQuickRenderSettings::GetSavedQuickRenderModeSettings(QuickRenderMode)); UpdateVariableAssignmentsForCurrentGraph(); } void FMoviePipelineQuickRenderMenu::UpdateVariableAssignmentsForCurrentGraph() { MoviePipeline::RefreshVariableAssignments(QuickRenderModeSettings->GraphPreset.LoadSynchronous(), QuickRenderModeSettings->GraphVariableAssignments, QuickRenderModeSettings.Get()); } #undef LOCTEXT_NAMESPACE