ExtAssetDragDropOp.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
  2. #include "ExtAssetDragDropOp.h"
  3. #include "ExtAssetThumbnail.h"
  4. #include "ExtContentBrowser.h"
  5. #include "Engine/Level.h"
  6. #include "ActorFactories/ActorFactory.h"
  7. #include "GameFramework/Actor.h"
  8. #include "Widgets/SOverlay.h"
  9. #include "Widgets/Layout/SBox.h"
  10. #include "ClassIconFinder.h"
  11. TSharedRef<FExtAssetDragDropOp> FExtAssetDragDropOp::New(const FExtAssetData& InAssetData, UActorFactory* ActorFactory)
  12. {
  13. TArray<FExtAssetData> AssetDataArray;
  14. AssetDataArray.Emplace(InAssetData);
  15. return New(MoveTemp(AssetDataArray), TArray<FString>(), ActorFactory);
  16. }
  17. TSharedRef<FExtAssetDragDropOp> FExtAssetDragDropOp::New(TArray<FExtAssetData> InAssetData, UActorFactory* ActorFactory)
  18. {
  19. return New(MoveTemp(InAssetData), TArray<FString>(), ActorFactory);
  20. }
  21. TSharedRef<FExtAssetDragDropOp> FExtAssetDragDropOp::New(FString InAssetPath)
  22. {
  23. TArray<FString> AssetPathsArray;
  24. AssetPathsArray.Emplace(MoveTemp(InAssetPath));
  25. return New(TArray<FExtAssetData>(), MoveTemp(AssetPathsArray), nullptr);
  26. }
  27. TSharedRef<FExtAssetDragDropOp> FExtAssetDragDropOp::New(TArray<FString> InAssetPaths)
  28. {
  29. return New(TArray<FExtAssetData>(), MoveTemp(InAssetPaths), nullptr);
  30. }
  31. TSharedRef<FExtAssetDragDropOp> FExtAssetDragDropOp::New(TArray<FExtAssetData> InAssetData, TArray<FString> InAssetPaths, UActorFactory* ActorFactory)
  32. {
  33. TSharedRef<FExtAssetDragDropOp> Operation = MakeShared<FExtAssetDragDropOp>();
  34. Operation->MouseCursor = EMouseCursor::GrabHandClosed;
  35. Operation->ThumbnailSize = 64;
  36. Operation->AssetData = MoveTemp(InAssetData);
  37. Operation->AssetPaths = MoveTemp(InAssetPaths);
  38. Operation->ActorFactory = ActorFactory;
  39. Operation->Init();
  40. Operation->Construct();
  41. return Operation;
  42. }
  43. FExtAssetDragDropOp::~FExtAssetDragDropOp()
  44. {
  45. ThumbnailPool.Reset();
  46. }
  47. TSharedPtr<SWidget> FExtAssetDragDropOp::GetDefaultDecorator() const
  48. {
  49. const int32 TotalCount = AssetData.Num() + AssetPaths.Num();
  50. TSharedPtr<SWidget> ThumbnailWidget;
  51. if (AssetThumbnail.IsValid())
  52. {
  53. ThumbnailWidget = AssetThumbnail->MakeThumbnailWidget();
  54. }
  55. else if (AssetPaths.Num() > 0)
  56. {
  57. ThumbnailWidget =
  58. SNew(SOverlay)
  59. +SOverlay::Slot()
  60. [
  61. SNew(SImage)
  62. .Image(FAppStyle::GetBrush("ContentBrowser.ListViewFolderIcon.Base"))
  63. .ColorAndOpacity(FLinearColor::Gray)
  64. ]
  65. +SOverlay::Slot()
  66. [
  67. SNew(SImage)
  68. .Image(FAppStyle::GetBrush("ContentBrowser.ListViewFolderIcon.Mask"))
  69. ];
  70. }
  71. else
  72. {
  73. ThumbnailWidget =
  74. SNew(SImage)
  75. .Image(FAppStyle::GetDefaultBrush());
  76. }
  77. const FSlateBrush* SubTypeBrush = FAppStyle::GetDefaultBrush();
  78. FLinearColor SubTypeColor = FLinearColor::White;
  79. if (AssetThumbnail.IsValid() && AssetPaths.Num() > 0)
  80. {
  81. SubTypeBrush = FAppStyle::GetBrush("ContentBrowser.AssetTreeFolderClosed");
  82. SubTypeColor = FLinearColor::Gray;
  83. }
  84. else if (ActorFactory.IsValid() && AssetData.Num() > 0)
  85. {
  86. #if ECB_LEGACY
  87. AActor* DefaultActor = ActorFactory->GetDefaultActor(AssetData[0]);
  88. SubTypeBrush = FClassIconFinder::FindIconForActor(DefaultActor);
  89. #endif
  90. }
  91. return
  92. SNew(SBorder)
  93. .BorderImage(FAppStyle::GetBrush("ContentBrowser.AssetDragDropTooltipBackground"))
  94. .Content()
  95. [
  96. SNew(SHorizontalBox)
  97. // Left slot is for the thumbnail
  98. +SHorizontalBox::Slot()
  99. .AutoWidth()
  100. .HAlign(HAlign_Left)
  101. [
  102. SNew(SBox)
  103. .WidthOverride(ThumbnailSize)
  104. .HeightOverride(ThumbnailSize)
  105. .Content()
  106. [
  107. SNew(SOverlay)
  108. +SOverlay::Slot()
  109. [
  110. ThumbnailWidget.ToSharedRef()
  111. ]
  112. +SOverlay::Slot()
  113. .HAlign(HAlign_Center)
  114. .VAlign(VAlign_Top)
  115. .Padding(FMargin(0, 4, 0, 0))
  116. [
  117. SNew(SBorder)
  118. .BorderImage(FAppStyle::GetBrush("Menu.Background"))
  119. .Visibility(TotalCount > 1 ? EVisibility::Visible : EVisibility::Collapsed)
  120. .Content()
  121. [
  122. SNew(STextBlock)
  123. .Text(FText::AsNumber(TotalCount))
  124. ]
  125. ]
  126. +SOverlay::Slot()
  127. .HAlign(HAlign_Right)
  128. .VAlign(VAlign_Bottom)
  129. .Padding(FMargin(4, 4))
  130. [
  131. SNew(SImage)
  132. .Image(SubTypeBrush)
  133. .Visibility(SubTypeBrush != FAppStyle::GetDefaultBrush() ? EVisibility::Visible : EVisibility::Collapsed)
  134. .ColorAndOpacity(SubTypeColor)
  135. ]
  136. ]
  137. ]
  138. // Right slot is for optional tooltip
  139. +SHorizontalBox::Slot()
  140. .AutoWidth()
  141. .VAlign(VAlign_Center)
  142. [
  143. SNew(SBox)
  144. .MinDesiredWidth(80)
  145. .Content()
  146. [
  147. SNew(SHorizontalBox)
  148. +SHorizontalBox::Slot()
  149. .AutoWidth()
  150. .Padding(3.0f)
  151. .VAlign(VAlign_Center)
  152. [
  153. SNew(SImage)
  154. .Image(this, &FExtAssetDragDropOp::GetIcon)
  155. ]
  156. +SHorizontalBox::Slot()
  157. .AutoWidth()
  158. .Padding(0,0,3,0)
  159. .VAlign(VAlign_Center)
  160. [
  161. SNew(STextBlock)
  162. .Text(this, &FExtAssetDragDropOp::GetDecoratorText)
  163. ]
  164. ]
  165. ]
  166. ];
  167. }
  168. FText FExtAssetDragDropOp::GetDecoratorText() const
  169. {
  170. if (CurrentHoverText.IsEmpty())
  171. {
  172. const int32 TotalCount = AssetData.Num() + AssetPaths.Num();
  173. if (TotalCount > 0)
  174. {
  175. const FText FirstItemText = AssetData.Num() > 0 ? FText::FromName(AssetData[0].AssetName) : FText::FromString(AssetPaths[0]);
  176. return (TotalCount == 1)
  177. ? FirstItemText
  178. : FText::Format(NSLOCTEXT("ContentBrowser", "AssetDragDropOpDescriptionMulti", "'{0}' and {1} {1}|plural(one=other,other=others)"), FirstItemText, TotalCount - 1);
  179. }
  180. }
  181. return CurrentHoverText;
  182. }
  183. void FExtAssetDragDropOp::Init()
  184. {
  185. if (AssetData.Num() > 0 && ThumbnailSize > 0)
  186. {
  187. #if ECB_LEGACY
  188. // Load all assets first so that there is no loading going on while attempting to drag
  189. // Can cause unsafe frame reentry
  190. for (FExtAssetData& Data : AssetData)
  191. {
  192. Data.GetAsset();
  193. }
  194. #endif
  195. // Create a thumbnail pool to hold the single thumbnail rendered
  196. ThumbnailPool = MakeShared<FExtAssetThumbnailPool>(1, /*InAreRealTileThumbnailsAllowed=*/false);
  197. // Create the thumbnail handle
  198. AssetThumbnail = MakeShared<FExtAssetThumbnail>(AssetData[0], ThumbnailSize, ThumbnailSize, ThumbnailPool);
  199. // Request the texture then tick the pool once to render the thumbnail
  200. AssetThumbnail->GetViewportRenderTargetTexture();
  201. ThumbnailPool->Tick(0);
  202. }
  203. }