Files
UnrealEngine/Engine/Source/Editor/ContentBrowserData/Private/ContentBrowserDataDragDropOp.cpp
2025-05-18 13:04:45 +08:00

231 lines
6.7 KiB
C++

// 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> FContentBrowserDataDragDropOp::New(TArrayView<const FContentBrowserItem> InDraggedItems, FThumbnailOverrideParams InThumbnailOverrideParams)
{
TSharedRef<FContentBrowserDataDragDropOp> Operation = MakeShared<FContentBrowserDataDragDropOp>();
Operation->Init(MoveTemp(InDraggedItems));
Operation->FolderBrushName = InThumbnailOverrideParams.FolderBrushName;
Operation->FolderShadowBrushName = InThumbnailOverrideParams.FolderShadowBrushName;
Operation->FolderColorOverride = InThumbnailOverrideParams.FolderColorOverride;
if (Operation->ShouldOverrideThumbnailWidget())
{
const TSharedPtr<SWidget> CustomThumbnailWidget = Operation->GetFolderWidgetDragAndDrop();
if (CustomThumbnailWidget && CustomThumbnailWidget.IsValid())
{
Operation->SetCustomThumbnailWidget(CustomThumbnailWidget.ToSharedRef());
}
}
Operation->Construct();
return Operation;
}
TSharedRef<FContentBrowserDataDragDropOp> FContentBrowserDataDragDropOp::Legacy_New(TArrayView<const FAssetData> InAssetData, TArrayView<const FString> InAssetPaths, UActorFactory* InActorFactory)
{
TSharedRef<FContentBrowserDataDragDropOp> Operation = MakeShared<FContentBrowserDataDragDropOp>();
Operation->LegacyInit(InAssetData, InAssetPaths, InActorFactory);
Operation->Construct();
return Operation;
}
void FContentBrowserDataDragDropOp::Init(TArrayView<const FContentBrowserItem> InDraggedItems)
{
DraggedItems.Append(InDraggedItems.GetData(), InDraggedItems.Num());
TArray<FAssetData> DraggedAssets;
TArray<FString> 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<const FAssetData> InAssetData, TArrayView<const FString> InAssetPaths, UActorFactory* InActorFactory)
{
UContentBrowserDataSubsystem* ContentBrowserData = GEditor->GetEditorSubsystem<UContentBrowserDataSubsystem>();
for (const FAssetData& Asset : InAssetData)
{
TArray<FName, TInlineAllocator<2>> 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<FName, TInlineAllocator<2>> 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<FAssetData>(InAssetData), TArray<FString>(InAssetPaths), InActorFactory);
}
void FContentBrowserDataDragDropOp::InitThumbnail()
{
if (DraggedFiles.Num() > 0 && ThumbnailSize > 0)
{
// Create the thumbnail handle
AssetThumbnail = MakeShared<FAssetThumbnail>(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<SWidget> 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<SWidget> FContentBrowserDataDragDropOp::GetFolderWidgetDragAndDrop() const
{
const TSharedPtr<SWidget> 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()
]
];
}