Files
UnrealEngine/Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineEditor/Private/MoviePipelineQuickRenderMenu.cpp
2025-05-18 13:04:45 +08:00

590 lines
25 KiB
C++

// 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<FSlateIcon> ToolbarIconAttribute = TAttribute<FSlateIcon>::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<FText>::Create(
TAttribute<FText>::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<FSlateIcon>(),
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<UMovieGraphQuickRenderSubsystem>();
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<SWidget> 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<SWindow> 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<EMovieGraphQuickRenderMode>();
for (int32 EnumIndex = 0; EnumIndex < ModesEnum->NumEnums() - 1; ++EnumIndex) // -1 to avoid MAX
{
QuickRenderModes.Add(MakeShared<FName>(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<FPropertyEditorModule>("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<IDetailsView> DetailsView = PropertyEditorModule.CreateDetailView(DetailsViewArgs);
DetailsView->RegisterInstancedCustomPropertyLayout(
UMovieGraphQuickRenderModeSettings::StaticClass(),
FOnGetDetailCustomizationInstance::CreateStatic(&FMovieGraphQuickRenderSettingsCustomization::MakeInstance));
DetailsView->SetObject(QuickRenderModeSettings.Get());
const TSharedRef<SWindow> 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<SWindow> RootWindow = FGlobalTabmanager::Get()->GetRootWindow())
{
FSlateApplication::Get().AddWindowAsNativeChild(QuickRenderSettingsWindow, RootWindow.ToSharedRef());
}
else
{
FSlateApplication::Get().AddWindow(QuickRenderSettingsWindow);
}
WeakDetailsPanel = DetailsView;
WeakQuickRenderSettingsWindow = QuickRenderSettingsWindow;
}
TSharedRef<SWidget> FMoviePipelineQuickRenderMenu::GenerateQuickRenderSettingsWindowToolbar()
{
auto GetWidgetForQuickRenderMode = [](TFunction<EMovieGraphQuickRenderMode()>&& 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<EMovieGraphQuickRenderMode>()->GetDisplayNameTextByValue(static_cast<int64>(GetQuickRenderMode()));
})
.ToolTipText_Lambda([GetQuickRenderMode]()
{
const UEnum* ModeEnum = StaticEnum<EMovieGraphQuickRenderMode>();
return ModeEnum->GetToolTipTextByIndex(ModeEnum->GetIndexByValue(static_cast<int64>(GetQuickRenderMode())));
})
];
};
FToolBarBuilder ToolbarBuilder(TSharedPtr<const FUICommandList>(), FMultiBoxCustomization::None);
ToolbarBuilder.BeginSection("Quick Render");
ToolbarBuilder.AddWidget(
SNew(SComboBox<TSharedPtr<FName>>)
.OptionsSource(&FMoviePipelineQuickRenderMenu::QuickRenderModes)
.OnGenerateWidget_Lambda([GetWidgetForQuickRenderMode](TSharedPtr<FName> InItem)
{
return GetWidgetForQuickRenderMode([InItem]()
{
const int64 ModeValue = StaticEnum<EMovieGraphQuickRenderMode>()->GetValueByName(*InItem);
return static_cast<EMovieGraphQuickRenderMode>(ModeValue);
});
})
.OnSelectionChanged_Lambda([](TSharedPtr<FName> InSelectedItem, ESelectInfo::Type)
{
const EMovieGraphQuickRenderMode NewRenderMode = static_cast<EMovieGraphQuickRenderMode>(
StaticEnum<EMovieGraphQuickRenderMode>()->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<IDetailsView> 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<UMovieGraphQuickRenderSubsystem>();
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<EMovieGraphQuickRenderMode>();
const int32 ValueIndex = ModeEnum->GetIndexByValue(static_cast<int64>(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<EMovieGraphQuickRenderViewportLookFlags>(QuickRenderModeSettings->ViewportLookFlags);
TArray<FText> 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<EMovieGraphQuickRenderFrameRangeType>()->GetDisplayNameTextByValue(static_cast<int64>(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: <RichTextBlock.BoldHighlight>{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<EVisibility>::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<UMovieGraphQuickRenderSubsystem>();
QuickRenderSubsystem->PlayLastRender();
});
PlayLastRenderAction.CanExecuteAction = FToolMenuCanExecuteAction::CreateLambda([](const FToolMenuContext&)
{
UMovieGraphQuickRenderSubsystem* QuickRenderSubsystem = GEditor->GetEditorSubsystem<UMovieGraphQuickRenderSubsystem>();
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<UMovieGraphQuickRenderSubsystem>();
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