// Copyright Epic Games, Inc. All Rights Reserved. #include "InterchangePipelineConfigurationGeneric.h" #include "Framework/Application/SlateApplication.h" #include "Interfaces/IMainFrameModule.h" #include "Misc/ConfigCacheIni.h" #include "Misc/ConfigContext.h" #include "Nodes/InterchangeBaseNodeContainer.h" #include "SInterchangePipelineConfigurationDialog.h" #include "Widgets/SWindow.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(InterchangePipelineConfigurationGeneric) namespace UE::Interchange::Private { float GetMinSizeX() { return 550.f; } float GetMinSizeY() { return 500.f; } const FVector2D& DefaultClientSize() { static FVector2D DefaultClientSize(1000.0, 650.0); return DefaultClientSize; } const FString& GetSizeXUid() { static FString SizeXStr = TEXT("SizeX"); return SizeXStr; } const FString& GetSizeYUid() { static FString SizeYStr = TEXT("SizeY"); return SizeYStr; } void RestoreClientSize(FVector2D& OutClientSize, const FString& WindowsUniqueID) { if (GConfig->DoesSectionExist(TEXT("InterchangeImportDialogOptions"), GEditorPerProjectIni)) { FString SizeXUid = WindowsUniqueID + GetSizeXUid(); FString SizeYUid = WindowsUniqueID + GetSizeYUid(); GConfig->GetDouble(TEXT("InterchangeImportDialogOptions"), *SizeXUid, OutClientSize.X, GEditorPerProjectIni); GConfig->GetDouble(TEXT("InterchangeImportDialogOptions"), *SizeYUid, OutClientSize.Y, GEditorPerProjectIni); } } void BackupClientSize(SWindow* Window, const FString& WindowsUniqueID) { if (!Window) { return; } // Need to convert it back so that on creating the window, it will appropriately adjust for DPI scale. const FVector2D ClientSize = Window->GetClientSizeInScreen() / Window->GetDPIScaleFactor(); FString SizeXUid = WindowsUniqueID + GetSizeXUid(); FString SizeYUid = WindowsUniqueID + GetSizeYUid(); GConfig->SetDouble(TEXT("InterchangeImportDialogOptions"), *SizeXUid, ClientSize.X, GEditorPerProjectIni); GConfig->SetDouble(TEXT("InterchangeImportDialogOptions"), *SizeYUid, ClientSize.Y, GEditorPerProjectIni); } } EInterchangePipelineConfigurationDialogResult UInterchangePipelineConfigurationGeneric::ShowPipelineConfigurationDialog(TArray& PipelineStacks , TArray& OutPipelines , TWeakObjectPtr SourceData , TWeakObjectPtr Translator , TWeakObjectPtr BaseNodeContainer) { using namespace UE::Interchange::Private; //Create and show the graph inspector UI dialog TSharedPtr ParentWindow; if(IMainFrameModule* MainFrame = FModuleManager::LoadModulePtr("MainFrame")) { ParentWindow = MainFrame->GetParentWindow(); } FString WindowDialogUid = TEXT("ImportContentDialog"); FVector2D ClientSize = DefaultClientSize(); RestoreClientSize(ClientSize, WindowDialogUid); TSharedRef Window = SNew(SWindow) .ClientSize(ClientSize) .MinWidth(GetMinSizeX()) .MinHeight(GetMinSizeY()) .Title(NSLOCTEXT("Interchange", "PipelineConfigurationGenericTitleContent", "Import Content")); TSharedPtr InterchangePipelineConfigurationDialog; Window->SetContent ( SAssignNew(InterchangePipelineConfigurationDialog, SInterchangePipelineConfigurationDialog) .OwnerWindow(Window) .SourceData(SourceData) .bSceneImport(false) .bReimport(false) .bTestConfigDialog(false) .PipelineStacks(PipelineStacks) .OutPipelines(&OutPipelines) .BaseNodeContainer(BaseNodeContainer) .Translator(Translator) ); Window->SetOnWindowClosed(FOnWindowClosed::CreateLambda([&WindowDialogUid](const TSharedRef& WindowMoved) { BackupClientSize(&WindowMoved.Get(), WindowDialogUid); })); FSlateApplication::Get().AddModalWindow(Window, ParentWindow, false); if (InterchangePipelineConfigurationDialog->IsCanceled()) { return EInterchangePipelineConfigurationDialogResult::Cancel; } if (InterchangePipelineConfigurationDialog->IsImportAll()) { return EInterchangePipelineConfigurationDialogResult::ImportAll; } return EInterchangePipelineConfigurationDialogResult::Import; } EInterchangePipelineConfigurationDialogResult UInterchangePipelineConfigurationGeneric::ShowScenePipelineConfigurationDialog(TArray& PipelineStacks , TArray& OutPipelines , TWeakObjectPtr SourceData , TWeakObjectPtr Translator , TWeakObjectPtr BaseNodeContainer) { using namespace UE::Interchange::Private; //Create and show the graph inspector UI dialog TSharedPtr ParentWindow; if (IMainFrameModule* MainFrame = FModuleManager::LoadModulePtr("MainFrame")) { ParentWindow = MainFrame->GetParentWindow(); } FString WindowDialogUid = TEXT("ImportSceneDialog"); FVector2D ClientSize = DefaultClientSize(); RestoreClientSize(ClientSize, WindowDialogUid); TSharedRef Window = SNew(SWindow) .ClientSize(ClientSize) .MinWidth(GetMinSizeX()) .MinHeight(GetMinSizeY()) .Title(NSLOCTEXT("Interchange", "PipelineConfigurationGenericTitleScene", "Import Scene")); TSharedPtr InterchangePipelineConfigurationDialog; Window->SetContent ( SAssignNew(InterchangePipelineConfigurationDialog, SInterchangePipelineConfigurationDialog) .OwnerWindow(Window) .SourceData(SourceData) .bSceneImport(true) .bReimport(false) .bTestConfigDialog(false) .PipelineStacks(PipelineStacks) .OutPipelines(&OutPipelines) .BaseNodeContainer(BaseNodeContainer) .Translator(Translator) ); Window->SetOnWindowClosed(FOnWindowClosed::CreateLambda([&WindowDialogUid](const TSharedRef& WindowMoved) { BackupClientSize(&WindowMoved.Get(), WindowDialogUid); })); FSlateApplication::Get().AddModalWindow(Window, ParentWindow, false); if (InterchangePipelineConfigurationDialog->IsCanceled()) { return EInterchangePipelineConfigurationDialogResult::Cancel; } if (InterchangePipelineConfigurationDialog->IsImportAll()) { return EInterchangePipelineConfigurationDialogResult::ImportAll; } return EInterchangePipelineConfigurationDialogResult::Import; } EInterchangePipelineConfigurationDialogResult UInterchangePipelineConfigurationGeneric::ShowReimportPipelineConfigurationDialog(TArray& PipelineStacks , TArray& OutPipelines , TWeakObjectPtr SourceData , TWeakObjectPtr Translator , TWeakObjectPtr BaseNodeContainer , TWeakObjectPtr ReimportAsset , bool bSceneImport) { using namespace UE::Interchange::Private; //Create and show the graph inspector UI dialog TSharedPtr ParentWindow; if (IMainFrameModule* MainFrame = FModuleManager::LoadModulePtr("MainFrame")) { ParentWindow = MainFrame->GetParentWindow(); } FString WindowDialogUid = TEXT("ImportContentDialog"); FVector2D ClientSize = DefaultClientSize(); RestoreClientSize(ClientSize, WindowDialogUid); TSharedRef Window = SNew(SWindow) .ClientSize(ClientSize) .MinWidth(GetMinSizeX()) .MinHeight(GetMinSizeY()) .Title(NSLOCTEXT("Interchange", "PipelineConfigurationGenericTitleReimportContent", "Reimport Content")); TSharedPtr InterchangePipelineConfigurationDialog; Window->SetContent ( SAssignNew(InterchangePipelineConfigurationDialog, SInterchangePipelineConfigurationDialog) .OwnerWindow(Window) .SourceData(SourceData) .bSceneImport(bSceneImport) .bReimport(true) .bTestConfigDialog(false) .PipelineStacks(PipelineStacks) .OutPipelines(&OutPipelines) .BaseNodeContainer(BaseNodeContainer) .ReimportObject(ReimportAsset) .Translator(Translator) ); Window->SetOnWindowClosed(FOnWindowClosed::CreateLambda([&WindowDialogUid](const TSharedRef& WindowMoved) { BackupClientSize(&WindowMoved.Get(), WindowDialogUid); })); FSlateApplication::Get().AddModalWindow(Window, ParentWindow, false); if (InterchangePipelineConfigurationDialog->IsCanceled()) { return EInterchangePipelineConfigurationDialogResult::Cancel; } if (InterchangePipelineConfigurationDialog->IsImportAll()) { return EInterchangePipelineConfigurationDialogResult::ImportAll; } return EInterchangePipelineConfigurationDialogResult::Import; } EInterchangePipelineConfigurationDialogResult UInterchangePipelineConfigurationGeneric::ShowTestPlanConfigurationDialog(TArray& PipelineStacks, TArray& OutPipelines, TWeakObjectPtr SourceData, TWeakObjectPtr Translator, TWeakObjectPtr BaseNodeContainer, TWeakObjectPtr ReimportAsset, bool bSceneImport, bool bReimport) { using namespace UE::Interchange::Private; //Create and show the graph inspector UI dialog TSharedPtr ParentWindow; if (IMainFrameModule* MainFrame = FModuleManager::LoadModulePtr("MainFrame")) { ParentWindow = MainFrame->GetParentWindow(); } FString WindowDialogUid = TEXT("TestPlanConfigurationDialog"); FVector2D ClientSize = DefaultClientSize(); RestoreClientSize(ClientSize, WindowDialogUid); TSharedRef Window = SNew(SWindow) .ClientSize(ClientSize) .MinWidth(GetMinSizeX()) .MinHeight(GetMinSizeY()) .Title(NSLOCTEXT("Interchange", "PipelineConfigurationGenericTitlePipelineConfiguration", "Pipeline Configuration")); TSharedPtr InterchangePipelineConfigurationDialog; Window->SetContent ( SAssignNew(InterchangePipelineConfigurationDialog, SInterchangePipelineConfigurationDialog) .OwnerWindow(Window) .SourceData(SourceData) .bSceneImport(bSceneImport) .bReimport(bReimport) .bTestConfigDialog(true) .PipelineStacks(PipelineStacks) .OutPipelines(&OutPipelines) .BaseNodeContainer(BaseNodeContainer) .ReimportObject(ReimportAsset) .Translator(Translator) ); Window->SetOnWindowClosed(FOnWindowClosed::CreateLambda([&WindowDialogUid](const TSharedRef& WindowMoved) { BackupClientSize(&WindowMoved.Get(), WindowDialogUid); })); FSlateApplication::Get().AddModalWindow(Window, ParentWindow, false); if (InterchangePipelineConfigurationDialog->IsCanceled()) { return EInterchangePipelineConfigurationDialogResult::Cancel; } return EInterchangePipelineConfigurationDialogResult::SaveConfig; }