SExtAssetDiscoveryIndicator.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
  2. #include "SExtAssetDiscoveryIndicator.h"
  3. #include "ExtContentBrowserSingleton.h"
  4. #include "Widgets/SBoxPanel.h"
  5. #include "Widgets/Layout/SBorder.h"
  6. #include "Widgets/Notifications/SProgressBar.h"
  7. #include "Widgets/Text/STextBlock.h"
  8. #include "Widgets/Layout/SBox.h"
  9. #include "EditorStyleSet.h"
  10. #include "AssetRegistry/AssetRegistryModule.h"
  11. #define LOCTEXT_NAMESPACE "AssetDiscoveryIndicator"
  12. namespace AssetDiscoveryIndicatorConstants
  13. {
  14. static const FMargin Padding(4, 0);
  15. static const FMargin SubStatusTextPadding(2, 0, 4, 0);
  16. }
  17. SExtAssetDiscoveryIndicator::~SExtAssetDiscoveryIndicator()
  18. {
  19. if ( FModuleManager::Get().IsModuleLoaded(TEXT("AssetRegistry")) )
  20. {
  21. FExtAssetRegistry& AssetRegistry = FExtContentBrowserSingleton::GetAssetRegistry();
  22. AssetRegistry.OnAssetGatherProgressUpdated().RemoveAll( this );
  23. //AssetRegistryModule.Get().OnFilesLoaded().RemoveAll( this );
  24. }
  25. }
  26. void SExtAssetDiscoveryIndicator::Construct( const FArguments& InArgs )
  27. {
  28. FExtAssetRegistry& AssetRegistry = FExtContentBrowserSingleton::GetAssetRegistry();
  29. AssetRegistry.OnAssetGatherProgressUpdated().AddSP( this, &SExtAssetDiscoveryIndicator::OnAssetRegistryFileLoadProgress );
  30. //AssetRegistryModule.Get().OnFilesLoaded().AddSP( this, &SExtAssetDiscoveryIndicator::OnAssetRegistryFilesLoaded );
  31. ScaleMode = InArgs._ScaleMode;
  32. FadeAnimation = FCurveSequence();
  33. FadeAnimation.AddCurve(0.f, 4.f); // Add some space at the beginning to delay before fading in
  34. ScaleCurve = FadeAnimation.AddCurve(4.f, 0.75f);
  35. FadeCurve = FadeAnimation.AddCurve(4.75f, 0.75f);
  36. FadeAnimation.AddCurve(5.5f, 1.f); // Add some space at the end to cause a short delay before fading out
  37. MainStatusText = LOCTEXT("InitializingAssetDiscovery", "Initializing Asset Discovery");
  38. StatusTextWrapWidth = 0.0f;
  39. if (AssetRegistry.IsGatheringAssets() )
  40. {
  41. // Loading assets, marquee while discovering package files
  42. Progress = TOptional<float>();
  43. if ( InArgs._FadeIn )
  44. {
  45. FadeAnimation.Play( this->AsShared() );
  46. }
  47. else
  48. {
  49. FadeAnimation.JumpToEnd();
  50. }
  51. }
  52. else
  53. {
  54. // Already done loading assets, set to complete and don't play the complete animation
  55. Progress = 1.f;
  56. }
  57. ChildSlot
  58. [
  59. SNew(SVerticalBox)
  60. +SVerticalBox::Slot()
  61. .Padding(InArgs._Padding)
  62. .HAlign(HAlign_Center)
  63. [
  64. SNew(SBorder)
  65. .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder"))
  66. .Padding(0)
  67. //.BorderBackgroundColor(this, &SExtAssetDiscoveryIndicator::GetBorderBackgroundColor)
  68. //.ColorAndOpacity(this, &SExtAssetDiscoveryIndicator::GetIndicatorColorAndOpacity)
  69. .DesiredSizeScale(this, &SExtAssetDiscoveryIndicator::GetIndicatorDesiredSizeScale)
  70. .Visibility(this, &SExtAssetDiscoveryIndicator::GetIndicatorVisibility)
  71. .VAlign(VAlign_Center)
  72. [
  73. #if 0
  74. SNew(SVerticalBox)
  75. // Text
  76. +SVerticalBox::Slot()
  77. .AutoHeight()
  78. .Padding(AssetDiscoveryIndicatorConstants::Padding)
  79. [
  80. SNew(SVerticalBox)
  81. +SVerticalBox::Slot()
  82. .AutoHeight()
  83. [
  84. SNew(STextBlock)
  85. .Font(FAppStyle::GetFontStyle("AssetDiscoveryIndicator.MainStatusFont"))
  86. .Text(this, &SExtAssetDiscoveryIndicator::GetMainStatusText)
  87. .WrapTextAt(this, &SExtAssetDiscoveryIndicator::GetStatusTextWrapWidth)
  88. .Justification(ETextJustify::Center)
  89. ]
  90. +SVerticalBox::Slot()
  91. .AutoHeight()
  92. [
  93. SNew(SBox)
  94. .Padding(AssetDiscoveryIndicatorConstants::SubStatusTextPadding)
  95. .Visibility(this, &SExtAssetDiscoveryIndicator::GetSubStatusTextVisibility)
  96. [
  97. SNew(STextBlock)
  98. .Font(FAppStyle::GetFontStyle("AssetDiscoveryIndicator.SubStatusFont"))
  99. .Text(this, &SExtAssetDiscoveryIndicator::GetSubStatusText)
  100. .WrapTextAt(this, &SExtAssetDiscoveryIndicator::GetStatusTextWrapWidth)
  101. .Justification(ETextJustify::Center)
  102. ]
  103. ]
  104. ]
  105. // Progress bar
  106. +SVerticalBox::Slot()
  107. .AutoHeight()
  108. .Padding(AssetDiscoveryIndicatorConstants::Padding)
  109. [
  110. SNew(SProgressBar)
  111. .Percent(this, &SExtAssetDiscoveryIndicator::GetProgress)
  112. ]
  113. #endif
  114. SNew(SHorizontalBox)
  115. // Progress bar
  116. + SHorizontalBox::Slot()
  117. //.Padding(AssetDiscoveryIndicatorConstants::Padding)
  118. .Padding(AssetDiscoveryIndicatorConstants::Padding)
  119. [
  120. SNew(SBox)
  121. .Padding(0)
  122. .WidthOverride(100.f)
  123. .MinDesiredWidth(100.f)
  124. [
  125. SNew(SProgressBar)
  126. .Percent(this, &SExtAssetDiscoveryIndicator::GetProgress)
  127. ]
  128. ]
  129. // Text
  130. + SHorizontalBox::Slot()
  131. .AutoWidth()
  132. .Padding(AssetDiscoveryIndicatorConstants::Padding)
  133. [
  134. SNew(SBox)
  135. //.Padding(AssetDiscoveryIndicatorConstants::SubStatusTextPadding)
  136. .Padding(0)
  137. .Visibility(this, &SExtAssetDiscoveryIndicator::GetSubStatusTextVisibility)
  138. [
  139. SNew(STextBlock)
  140. .Font(FAppStyle::GetFontStyle("AssetDiscoveryIndicator.SubStatusFont"))
  141. .Text(this, &SExtAssetDiscoveryIndicator::GetSubStatusText)
  142. .WrapTextAt(this, &SExtAssetDiscoveryIndicator::GetStatusTextWrapWidth)
  143. .Justification(ETextJustify::Center)
  144. ]
  145. ]
  146. ]
  147. ]
  148. ];
  149. }
  150. void SExtAssetDiscoveryIndicator::Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime )
  151. {
  152. // Calculate the wrapping width based on our complete alloted width
  153. // We do this rather than auto-wrap because the size of the text changes, and auto-wrapping prevents the text block from being able to grow if the text shrinks
  154. StatusTextWrapWidth = AllottedGeometry.GetLocalSize().X - (AssetDiscoveryIndicatorConstants::Padding.Left + AssetDiscoveryIndicatorConstants::Padding.Right);
  155. }
  156. void SExtAssetDiscoveryIndicator::OnAssetRegistryFileLoadProgress(const FExtAssetRegistry::FAssetGatherProgressUpdateData& ProgressUpdateData)
  157. {
  158. if (ProgressUpdateData.bIsDiscoveringAssetFiles)
  159. {
  160. // Marquee while we're discovering asset files as we can't yet show an accurate percentage
  161. Progress = TOptional<float>();
  162. MainStatusText = LOCTEXT("DiscoveringAssetFiles", "Discovering Asset Files");
  163. SubStatusText = FText::Format(LOCTEXT("XFilesFoundFmt", "{0} files found"), FText::AsNumber(ProgressUpdateData.NumTotalAssets));
  164. }
  165. else
  166. {
  167. if (ProgressUpdateData.NumTotalAssets > 0)
  168. {
  169. Progress = ProgressUpdateData.NumAssetsProcessedByAssetRegistry / (float)ProgressUpdateData.NumTotalAssets;
  170. }
  171. else
  172. {
  173. Progress = 0.0f;
  174. }
  175. if (ProgressUpdateData.NumAssetsPendingDataLoad > 0)
  176. {
  177. MainStatusText = LOCTEXT("DiscoveringAssetData", "Discovering Asset Data");
  178. SubStatusText = FText::Format(LOCTEXT("XAssetsRemainingFmt", "{0} assets remaining"), FText::AsNumber(ProgressUpdateData.NumAssetsPendingDataLoad));
  179. }
  180. else
  181. {
  182. const int32 NumAssetsLeftToProcess = ProgressUpdateData.NumTotalAssets - ProgressUpdateData.NumAssetsProcessedByAssetRegistry;
  183. if (NumAssetsLeftToProcess == 0)
  184. {
  185. OnAssetRegistryFilesLoaded();
  186. }
  187. else
  188. {
  189. //if (FadeAnimation.IsAtStart())
  190. {
  191. FadeAnimation.JumpToEnd();
  192. }
  193. MainStatusText = LOCTEXT("ProcessingAssetData", "Processing Asset Data");
  194. SubStatusText = FText::Format(LOCTEXT("XAssetsRemainingFmt", "{0} assets remaining"), FText::AsNumber(NumAssetsLeftToProcess));
  195. }
  196. }
  197. }
  198. }
  199. void SExtAssetDiscoveryIndicator::OnAssetRegistryFilesLoaded()
  200. {
  201. if (!FadeAnimation.IsAtStart())
  202. {
  203. MainStatusText = LOCTEXT("FinishedAssetDiscovery", "Finished Asset Discovery");
  204. SubStatusText = FText::GetEmpty();
  205. if (FadeAnimation.IsPlaying())
  206. {
  207. if (FadeAnimation.IsForward())
  208. {
  209. // Still fading in - reverse so we fade back out
  210. FadeAnimation.Reverse();
  211. }
  212. else
  213. {
  214. // Do nothing - already fading out
  215. }
  216. }
  217. else
  218. {
  219. // Play the fade out animation
  220. FadeAnimation.PlayReverse(this->AsShared());
  221. }
  222. }
  223. }
  224. FText SExtAssetDiscoveryIndicator::GetMainStatusText() const
  225. {
  226. return MainStatusText;
  227. }
  228. FText SExtAssetDiscoveryIndicator::GetSubStatusText() const
  229. {
  230. return SubStatusText;
  231. }
  232. TOptional<float> SExtAssetDiscoveryIndicator::GetProgress() const
  233. {
  234. return Progress;
  235. }
  236. EVisibility SExtAssetDiscoveryIndicator::GetSubStatusTextVisibility() const
  237. {
  238. return (SubStatusText.IsEmpty()) ? EVisibility::Collapsed : EVisibility::Visible;
  239. }
  240. float SExtAssetDiscoveryIndicator::GetStatusTextWrapWidth() const
  241. {
  242. return StatusTextWrapWidth;
  243. }
  244. FSlateColor SExtAssetDiscoveryIndicator::GetBorderBackgroundColor() const
  245. {
  246. return FSlateColor(FLinearColor(1, 1, 1, 0.8f * FadeCurve.GetLerp()));
  247. }
  248. FLinearColor SExtAssetDiscoveryIndicator::GetIndicatorColorAndOpacity() const
  249. {
  250. return FLinearColor(1, 1, 1, FadeCurve.GetLerp());
  251. }
  252. FVector2D SExtAssetDiscoveryIndicator::GetIndicatorDesiredSizeScale() const
  253. {
  254. const float Lerp = ScaleCurve.GetLerp();
  255. switch (ScaleMode)
  256. {
  257. case EAssetDiscoveryIndicatorScaleMode::Scale_Horizontal: return FVector2D(Lerp, 1);
  258. case EAssetDiscoveryIndicatorScaleMode::Scale_Vertical: return FVector2D(1, Lerp);
  259. case EAssetDiscoveryIndicatorScaleMode::Scale_Both: return FVector2D(Lerp, Lerp);
  260. default:
  261. return FVector2D(1, 1);
  262. }
  263. }
  264. EVisibility SExtAssetDiscoveryIndicator::GetIndicatorVisibility() const
  265. {
  266. //return FadeAnimation.IsAtStart() ? EVisibility::Collapsed : EVisibility::HitTestInvisible;
  267. return FExtContentBrowserSingleton::GetAssetRegistry().IsGatheringAssets() ? EVisibility::HitTestInvisible : EVisibility::Collapsed;
  268. }
  269. #undef LOCTEXT_NAMESPACE