// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "AdvancedPreviewScene.h" // IWYU pragma: keep #include "Tools/BaseAssetToolkit.h" #include "DragAndDrop/DecoratedDragDropOp.h" #include "EditorUndoClient.h" #include "Widgets/Views/STreeView.h" class FAdvancedPreviewScene; class FSpawnTabArgs; class FEditorViewportClient; class UAssetEditor; class IStructureDetailsView; class FSmartObjectViewModel; class USmartObjectDetailsWrapper; class USmartObjectDefinition; struct FSmartObjectDefinitionPreviewData; enum class EItemDropZone; struct FSmartObjectOutlinerItem; class SMARTOBJECTSEDITORMODULE_API FSmartObjectAssetToolkit : public FBaseAssetToolkit, public FSelfRegisteringEditorUndoClient, public FGCObject { public: explicit FSmartObjectAssetToolkit(UAssetEditor* InOwningAssetEditor); virtual ~FSmartObjectAssetToolkit(); virtual TSharedPtr CreateEditorViewportClient() const override; protected: virtual void PostInitAssetEditor() override; virtual void RegisterTabSpawners(const TSharedRef& TabManager) override; virtual void OnClose() override; virtual void SetEditingObject(class UObject* InObject) override; virtual void AddReferencedObjects(FReferenceCollector& Collector) override; virtual FString GetReferencerName() const override { return TEXT("FSmartObjectAssetToolkit"); } virtual void PostUndo(bool bSuccess) override; virtual void PostRedo(bool bSuccess) override; private: void OnParametersChanged(const USmartObjectDefinition& SmartObjectDefinition); void UpdatePreviewActor(); void UpdateCachedPreviewDataFromDefinition(); void UpdateItemList(); /** Callback to detect changes in number of slot to keep gizmos in sync. */ void OnPropertyChanged(UObject* ObjectBeingModified, FPropertyChangedEvent& PropertyChangedEvent); /** Creates a tab allowing the user to select a mesh or actor template to spawn in the preview scene. */ TSharedRef SpawnTab_PreviewSettings(const FSpawnTabArgs& Args); TSharedRef SpawnTab_Outliner(const FSpawnTabArgs& Args); TSharedRef SpawnTab_SelectionDetails(const FSpawnTabArgs& Args); TSharedRef SpawnTab_SceneViewport(const FSpawnTabArgs& Args); TSharedRef OnGenerateRow(TSharedPtr InItem, const TSharedRef& OwnerTable); void OnGetChildren(TSharedPtr InItem, TArray>& OutChildren) const; void OnOutlinerSelectionChanged(TSharedPtr SelectedItem, ESelectInfo::Type SelectType); TSharedPtr OnOutlinerContextMenu(); void HandleSelectionChanged(TConstArrayView Selection); void HandleSlotsChanged(USmartObjectDefinition* Definition); FReply OnOutlinerDragDetected(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) const; TOptional OnOutlinerCanAcceptDrop(const FDragDropEvent& DragDropEvent, EItemDropZone DropZone, const TSharedPtr TargetItem) const; FReply OnOutlinerAcceptDrop(const FDragDropEvent& DragDropEvent, EItemDropZone DropZone, const TSharedPtr TargetItem); void UpdateDetailsSelection(); FText GetOutlinerItemDescription(TSharedPtr Item) const; FSlateColor GetOutlinerItemColor(TSharedPtr Item) const; /** Additional Tab to select mesh/actor to add a 3D preview in the scene. */ static const FName PreviewSettingsTabID; static const FName OutlinerTabID; static const FName SceneViewportTabID; static const FName DetailsTabID; /** Scene in which the 3D preview of the asset lives. */ TUniquePtr AdvancedPreviewScene; /** Details view for the preview settings. */ TSharedPtr PreviewDetailsView; TSharedPtr CachedPreviewData; TSharedPtr>> ItemTreeWidget; TArray> ItemList; bool bUpdatingOutlinerSelection = false; bool bUpdatingViewSelection = false; TSharedPtr DetailsTab; TSharedPtr DetailsAssetView; /** Typed pointer to the custom ViewportClient created by the toolkit. */ mutable TSharedPtr SmartObjectViewportClient; TSharedPtr ViewModel; FDelegateHandle SelectionChangedHandle; FDelegateHandle SlotsChangedHandle; };