// Copyright Epic Games, Inc. All Rights Reserved. #include "ContentBrowserDataDragDropOp.h" #include "AssetRegistry/AssetData.h" #include "AssetThumbnail.h" #include "Containers/ContainerAllocationPolicies.h" #include "ContentBrowserDataFilter.h" #include "ContentBrowserDataSubsystem.h" #include "Editor.h" #include "Editor/EditorEngine.h" #include "HAL/PlatformCrt.h" #include "Templates/UnrealTemplate.h" #include "ThumbnailRendering/ThumbnailManager.h" #include "Widgets/Layout/SBox.h" #include "UObject/NameTypes.h" class UActorFactory; TSharedRef FContentBrowserDataDragDropOp::New(TArrayView InDraggedItems, FThumbnailOverrideParams InThumbnailOverrideParams) { TSharedRef Operation = MakeShared(); Operation->Init(MoveTemp(InDraggedItems)); Operation->FolderBrushName = InThumbnailOverrideParams.FolderBrushName; Operation->FolderShadowBrushName = InThumbnailOverrideParams.FolderShadowBrushName; Operation->FolderColorOverride = InThumbnailOverrideParams.FolderColorOverride; if (Operation->ShouldOverrideThumbnailWidget()) { const TSharedPtr CustomThumbnailWidget = Operation->GetFolderWidgetDragAndDrop(); if (CustomThumbnailWidget && CustomThumbnailWidget.IsValid()) { Operation->SetCustomThumbnailWidget(CustomThumbnailWidget.ToSharedRef()); } } Operation->Construct(); return Operation; } TSharedRef FContentBrowserDataDragDropOp::Legacy_New(TArrayView InAssetData, TArrayView InAssetPaths, UActorFactory* InActorFactory) { TSharedRef Operation = MakeShared(); Operation->LegacyInit(InAssetData, InAssetPaths, InActorFactory); Operation->Construct(); return Operation; } void FContentBrowserDataDragDropOp::Init(TArrayView InDraggedItems) { DraggedItems.Append(InDraggedItems.GetData(), InDraggedItems.Num()); TArray DraggedAssets; TArray DraggedPackagePaths; for (const FContentBrowserItem& DraggedItem : DraggedItems) { if (DraggedItem.IsFile()) { DraggedFiles.Add(DraggedItem); FAssetData ItemAssetData; if (DraggedItem.Legacy_TryGetAssetData(ItemAssetData) && !ItemAssetData.IsRedirector()) { DraggedAssets.Add(MoveTemp(ItemAssetData)); } } if (DraggedItem.IsFolder()) { DraggedFolders.Add(DraggedItem); FName ItemPackagePath; if (DraggedItem.Legacy_TryGetPackagePath(ItemPackagePath)) { DraggedPackagePaths.Add(ItemPackagePath.ToString()); } } } FAssetDragDropOp::Init(MoveTemp(DraggedAssets), MoveTemp(DraggedPackagePaths), nullptr); } void FContentBrowserDataDragDropOp::LegacyInit(TArrayView InAssetData, TArrayView InAssetPaths, UActorFactory* InActorFactory) { UContentBrowserDataSubsystem* ContentBrowserData = GEditor->GetEditorSubsystem(); for (const FAssetData& Asset : InAssetData) { TArray> VirtualAssetPaths; ContentBrowserData->Legacy_TryConvertAssetDataToVirtualPaths(Asset, /*bUseFolderPaths*/false, [&VirtualAssetPaths](FName InPath) { VirtualAssetPaths.Add(InPath); return true; }); for (const FName& VirtualAssetPath : VirtualAssetPaths) { FContentBrowserItem AssetItem = ContentBrowserData->GetItemAtPath(VirtualAssetPath, EContentBrowserItemTypeFilter::IncludeFiles); if (AssetItem.IsValid()) { DraggedItems.Add(MoveTemp(AssetItem)); } } } for (const FString& Path : InAssetPaths) { TArray> VirtualFolderPaths; ContentBrowserData->Legacy_TryConvertPackagePathToVirtualPaths(*Path, [&VirtualFolderPaths](FName InPath) { VirtualFolderPaths.Add(InPath); return true; }); for (const FName& VirtualFolderPath : VirtualFolderPaths) { FContentBrowserItem FolderItem = ContentBrowserData->GetItemAtPath(VirtualFolderPath, EContentBrowserItemTypeFilter::IncludeFolders); if (FolderItem.IsValid()) { DraggedItems.Add(MoveTemp(FolderItem)); } } } FAssetDragDropOp::Init(TArray(InAssetData), TArray(InAssetPaths), InActorFactory); } void FContentBrowserDataDragDropOp::InitThumbnail() { if (DraggedFiles.Num() > 0 && ThumbnailSize > 0) { // Create the thumbnail handle AssetThumbnail = MakeShared(FAssetData(), ThumbnailSize, ThumbnailSize, UThumbnailManager::Get().GetSharedThumbnailPool()); if (DraggedFiles[0].UpdateThumbnail(*AssetThumbnail)) { // Request the texture then tick the pool once to render the thumbnail AssetThumbnail->GetViewportRenderTargetTexture(); } else { AssetThumbnail.Reset(); } } } bool FContentBrowserDataDragDropOp::HasFiles() const { return DraggedFiles.Num() > 0; } bool FContentBrowserDataDragDropOp::HasFolders() const { return DraggedFolders.Num() > 0; } int32 FContentBrowserDataDragDropOp::GetTotalCount() const { return DraggedItems.Num(); } FText FContentBrowserDataDragDropOp::GetFirstItemText() const { if (DraggedFiles.Num() > 0) { return DraggedFiles[0].GetDisplayName(); } if (DraggedFolders.Num() > 0) { return FText::FromName(DraggedFolders[0].GetVirtualPath()); } return FText::GetEmpty(); } bool FContentBrowserDataDragDropOp::ShouldOverrideThumbnailWidget() const { return HasFolders() && DraggedFiles.IsEmpty(); } TSharedPtr FContentBrowserDataDragDropOp::GetFolderWidget() const { const FSlateBrush* FolderBrush = FAppStyle::GetOptionalBrush(FolderBrushName, nullptr, FAppStyle::GetBrush("ContentBrowser.ListViewFolderIcon")); const FSlateBrush* FolderShadowBrush = FAppStyle::GetOptionalBrush(FolderShadowBrushName, nullptr , FAppStyle::GetBrush("ContentBrowser.FolderItem.DropShadow")); if (FolderBrush && FolderShadowBrush) { return SNew(SBorder) .BorderImage(FolderShadowBrush) .Padding(FMargin(0,0,2.0f,2.0f)) [ SNew(SImage) .Image(FAppStyle::GetBrush(FolderBrushName)) .ColorAndOpacity(FolderColorOverride) ]; } return nullptr; } TSharedPtr FContentBrowserDataDragDropOp::GetFolderWidgetDragAndDrop() const { const TSharedPtr FolderWidget = GetFolderWidget(); if (!FolderWidget || !FolderWidget.IsValid()) { return nullptr; } static const FMargin FolderBoxPadding = FMargin(3.f, 4.f, 1.f, 0.f); static constexpr float FolderSize = 60.f; return SNew(SBorder) .Padding(0.f) .BorderImage(FAppStyle::GetBrush("ContentBrowser.ThumbnailDragDropBackground")) .HAlign(HAlign_Center) .VAlign(VAlign_Center) [ SNew(SBox) .WidthOverride(FolderSize) .HeightOverride(FolderSize) .Padding(FolderBoxPadding) [ FolderWidget.ToSharedRef() ] ]; }