// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Nodes/InterchangeBaseNodeContainer.h" #include "InterchangePipelineBase.h" #include "InterchangePipelineConfigurationBase.h" #include "SInterchangeAssetCard.h" #include "Styling/SlateBrush.h" #include "Widgets/Layout/SScrollBox.h" #include "Widgets/Views/STreeView.h" class SBox; struct FPropertyAndParent; struct FSlateBrush; class IDetailsView; class SCheckBox; class STextComboBox; class UInterchangeCardsPipeline; class UInterchangeTranslatorBase; struct FInterchangePipelineItemType { public: FString DisplayName; UInterchangePipelineBase* Pipeline; UObject* ReimportObject = nullptr; UInterchangeBaseNodeContainer* Container = nullptr; UInterchangeSourceData* SourceData = nullptr; bool bShowEssentials = false; TArray ConflictInfos; }; class SInterchangePipelineItem : public STableRow> { public: void Construct( const FArguments& InArgs, const TSharedRef& OwnerTable, TSharedPtr InPipelineElement); private: const FSlateBrush* GetImageItemIcon() const; FSlateColor GetTextColor() const; TSharedPtr PipelineElement = nullptr; }; typedef SListView< TSharedPtr > SPipelineListViewType; enum class ECloseEventType : uint8 { Cancel, PrimaryButton, WindowClosing }; class SInterchangePipelineConfigurationDialog : public SCompoundWidget { public: SLATE_BEGIN_ARGS(SInterchangePipelineConfigurationDialog) : _OwnerWindow() {} SLATE_ARGUMENT(TWeakPtr, OwnerWindow) SLATE_ARGUMENT(TWeakObjectPtr, SourceData) SLATE_ARGUMENT(bool, bSceneImport) SLATE_ARGUMENT(bool, bReimport) SLATE_ARGUMENT(bool, bTestConfigDialog) SLATE_ARGUMENT(TArray, PipelineStacks) SLATE_ARGUMENT(TArray*, OutPipelines) SLATE_ARGUMENT(TWeakObjectPtr, BaseNodeContainer) SLATE_ARGUMENT(TWeakObjectPtr, ReimportObject) SLATE_ARGUMENT(TWeakObjectPtr, Translator) SLATE_END_ARGS() public: SInterchangePipelineConfigurationDialog(); virtual ~SInterchangePipelineConfigurationDialog(); void Construct(const FArguments& InArgs); virtual bool SupportsKeyboardFocus() const override { return true; } void ClosePipelineConfiguration(const ECloseEventType CloseEventType); FReply OnCloseDialog(const ECloseEventType CloseEventType) { ClosePipelineConfiguration(CloseEventType); return FReply::Handled(); } void OnWindowClosed(const TSharedRef& ClosedWindow) { ClosePipelineConfiguration(ECloseEventType::WindowClosing); } virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override; bool IsCanceled() const { return bCanceled; } bool IsImportAll() const { return bImportAll; } private: TSharedRef SpawnPipelineConfiguration(); TSharedRef SpawnCardsConfiguration(); bool IsPropertyVisible(const FPropertyAndParent&) const; FText GetSourceDescription() const; FReply OnResetToDefault(); bool ValidateAllPipelineSettings(TOptional& OutInvalidReason) const; bool IsImportButtonEnabled() const; FText GetImportButtonTooltip() const; void SaveAllPipelineSettings() const; /** Internal utility function to properly display pipeline's name */ static FString GetPipelineDisplayName(const UInterchangePipelineBase* Pipeline); void SetEditPipeline(FInterchangePipelineItemType* PipelineItemToEdit); FReply OnEditTranslatorSettings(); void GatherConflictAndExtraInfo(TArray& ConflictInfo, TMap& ExtraInfo); private: TWeakPtr< SWindow > OwnerWindow; double OriginalMinWindowSize = 0.0; double DeltaClientWindowSize = 0.0; TWeakObjectPtr SourceData; TWeakObjectPtr BaseNodeContainer; mutable TObjectPtr PreviewNodeContainer = nullptr; TWeakObjectPtr ReimportObject; TWeakObjectPtr Translator; TObjectPtr TranslatorSettings = nullptr; TArray PipelineStacks; TArray* OutPipelines; // The available stacks TArray> AvailableStacks; void OnStackSelectionChanged(TSharedPtr String, ESelectInfo::Type); void UpdateStack(const FName& NewStackName); ////////////////////////////////////////////////////////////////////////// // the pipelines list view TSharedPtr PipelinesListView; TArray< TSharedPtr< FInterchangePipelineItemType > > PipelineListViewItems; /** list view generate row callback */ TSharedRef MakePipelineListRowWidget(TSharedPtr InElement, const TSharedRef& OwnerTable); void OnPipelineSelectionChanged(TSharedPtr InItem, ESelectInfo::Type SelectInfo); // ////////////////////////////////////////////////////////////////////////// struct FFactoryNodeEnabledData { bool bEnable = true; TObjectPtr ObjectClass = nullptr; }; TArray> PipelineSupportAssetClasses; TSharedPtr CardViewScrollbar; TMap EnableDataPerFactoryNodeClass; TSharedPtr CardViewList = nullptr; TArray> AssetCards; void UpdatePipelineSupportedAssetClasses(); void UpdateEnableDataPerFactoryNodeClass(); void FillAssetCardsList(); void CreateCardsViewList(); void RefreshCardsViewList(); UInterchangeCardsPipeline* GenerateTransientCardsPipeline() const; //Splitter management double SplitAdvancedRatio = 0.6; TSharedPtr CardsAndAdvancedSplitter = nullptr; ECheckBoxState IsFilteringOptions() const { return bFilterOptions ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } ECheckBoxState IsShowEssentialsEnabled() const { return bShowEssentials ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void OnFilterOptionsChanged(ECheckBoxState CheckState); void OnShowEssentialsChanged(ECheckBoxState CheckState); const FSlateBrush* GetImportButtonIcon() const; void UpdatePreviewContainer(bool bUpdateCards) const; FReply OnPreviewImport() const; TSharedPtr PipelineConfigurationDetailsView; TSharedPtr UseSameSettingsForAllCheckBox; bool bSceneImport = false; bool bReimport = false; bool bCanceled = false; bool bImportAll = false; // This is used to denote that the import dialog is opened from the Interchange Test Plan asset to configure the chosen Pipelines. bool bTestConfigDialog = false; bool bFilterOptions = false; bool bShowEssentials = false; bool bShowSettings = false; bool bShowCards = true; FName CurrentStackName = NAME_None; TObjectPtr CurrentSelectedPipeline = nullptr; TWeakPtr CurrentSelectedPipelineItem = nullptr; };