EdGraphNode_ExtDependency.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. // Copyright 2017-2021 marynate. All Rights Reserved.
  2. #include "EdGraphNode_ExtDependency.h"
  3. #include "ExtAssetData.h"
  4. #include "ExtPackageUtils.h"
  5. #include "ExtContentBrowser.h"
  6. #include "GenericPlatform/GenericPlatformFile.h"
  7. #include "EdGraph/EdGraphPin.h"
  8. #include "HAL/PlatformFilemanager.h"
  9. #define LOCTEXT_NAMESPACE "ExtDependencyViewer"
  10. //////////////////////////////////////////////////////////////////////////
  11. // UEdGraphNode_ExtDependency
  12. UEdGraphNode_ExtDependency::UEdGraphNode_ExtDependency(const FObjectInitializer& ObjectInitializer)
  13. : Super(ObjectInitializer)
  14. {
  15. DependencyPin = NULL;
  16. ReferencerPin = NULL;
  17. bIsCollapsed = false;
  18. bIsPackage = false;
  19. bIsPrimaryAsset = false;
  20. bUsesThumbnail = false;
  21. bIsMissingOrInvalid = false;
  22. }
  23. void UEdGraphNode_ExtDependency::SetupReferenceNode(const FIntPoint& NodeLoc, const TArray<FExtAssetIdentifier>& NewIdentifiers, const FExtAssetData& InAssetData)
  24. {
  25. check(NewIdentifiers.Num() > 0);
  26. NodePosX = NodeLoc.X;
  27. NodePosY = NodeLoc.Y;
  28. Identifiers = NewIdentifiers;
  29. const FExtAssetIdentifier& First = NewIdentifiers[0];
  30. FString ShortPackageName = FPackageName::GetLongPackageAssetName(First.PackageName.ToString());
  31. bIsCollapsed = false;
  32. bIsPackage = true;
  33. FPrimaryAssetId PrimaryAssetID = NewIdentifiers[0].GetPrimaryAssetId();
  34. if (PrimaryAssetID.IsValid())
  35. {
  36. ShortPackageName = PrimaryAssetID.ToString();
  37. bIsPackage = false;
  38. bIsPrimaryAsset = true;
  39. }
  40. else if (NewIdentifiers[0].IsValue())
  41. {
  42. ShortPackageName = FString::Printf(TEXT("%s::%s"), *First.ObjectName.ToString(), *First.ValueName.ToString());
  43. bIsPackage = false;
  44. }
  45. if (NewIdentifiers.Num() == 1 )
  46. {
  47. if (bIsPackage)
  48. {
  49. NodeComment = First.PackageName.ToString();
  50. }
  51. NodeTitle = FText::FromString(ShortPackageName);
  52. }
  53. else
  54. {
  55. NodeComment = FText::Format(LOCTEXT("ReferenceNodeMultiplePackagesTitle", "{0} nodes"), FText::AsNumber(NewIdentifiers.Num())).ToString();
  56. NodeTitle = FText::Format(LOCTEXT("ReferenceNodeMultiplePackagesComment", "{0} and {1} others"), FText::FromString(ShortPackageName), FText::AsNumber(NewIdentifiers.Num() - 1));
  57. }
  58. CacheAssetData(InAssetData);
  59. AllocateDefaultPins();
  60. }
  61. void UEdGraphNode_ExtDependency::SetReferenceNodeCollapsed(const FIntPoint& NodeLoc, int32 InNumReferencesExceedingMax)
  62. {
  63. NodePosX = NodeLoc.X;
  64. NodePosY = NodeLoc.Y;
  65. Identifiers.Empty();
  66. bIsCollapsed = true;
  67. bUsesThumbnail = false;
  68. NodeComment = FText::Format(LOCTEXT("ReferenceNodeCollapsedMessage", "{0} other nodes"), FText::AsNumber(InNumReferencesExceedingMax)).ToString();
  69. NodeTitle = LOCTEXT("ReferenceNodeCollapsedTitle", "Collapsed nodes");
  70. CacheAssetData(FExtAssetData());
  71. AllocateDefaultPins();
  72. }
  73. void UEdGraphNode_ExtDependency::AddReferencer(UEdGraphNode_ExtDependency* ReferencerNode)
  74. {
  75. UEdGraphPin* ReferencerDependencyPin = ReferencerNode->GetDependencyPin();
  76. if ( ensure(ReferencerDependencyPin) )
  77. {
  78. ReferencerDependencyPin->bHidden = false;
  79. ReferencerPin->bHidden = false;
  80. ReferencerPin->MakeLinkTo(ReferencerDependencyPin);
  81. }
  82. }
  83. FExtAssetIdentifier UEdGraphNode_ExtDependency::GetIdentifier() const
  84. {
  85. if (Identifiers.Num() > 0)
  86. {
  87. return Identifiers[0];
  88. }
  89. return FExtAssetIdentifier();
  90. }
  91. void UEdGraphNode_ExtDependency::GetAllIdentifiers(TArray<FExtAssetIdentifier>& OutIdentifiers) const
  92. {
  93. OutIdentifiers.Append(Identifiers);
  94. }
  95. void UEdGraphNode_ExtDependency::GetAllPackageNames(TArray<FName>& OutPackageNames) const
  96. {
  97. for (const FExtAssetIdentifier& AssetId : Identifiers)
  98. {
  99. if (AssetId.IsPackage())
  100. {
  101. OutPackageNames.AddUnique(AssetId.PackageName);
  102. }
  103. }
  104. }
  105. UEdGraph_ExtDependencyViewer* UEdGraphNode_ExtDependency::GetDependencyViewerGraph() const
  106. {
  107. return Cast<UEdGraph_ExtDependencyViewer>( GetGraph() );
  108. }
  109. FText UEdGraphNode_ExtDependency::GetNodeTitle(ENodeTitleType::Type TitleType) const
  110. {
  111. return NodeTitle;
  112. }
  113. FLinearColor UEdGraphNode_ExtDependency::GetNodeTitleColor() const
  114. {
  115. if (bIsPrimaryAsset)
  116. {
  117. return FLinearColor(0.2f, 0.8f, 0.2f);
  118. }
  119. else if (bIsPackage)
  120. {
  121. return FLinearColor(0.4f, 0.62f, 1.0f);
  122. }
  123. else if (bIsCollapsed)
  124. {
  125. return FLinearColor(0.55f, 0.55f, 0.55f);
  126. }
  127. else
  128. {
  129. return FLinearColor(0.0f, 0.55f, 0.62f);
  130. }
  131. }
  132. FText UEdGraphNode_ExtDependency::GetTooltipText() const
  133. {
  134. FString TooltipString;
  135. for (const FExtAssetIdentifier& AssetId : Identifiers)
  136. {
  137. if (!TooltipString.IsEmpty())
  138. {
  139. TooltipString.Append(TEXT("\n"));
  140. }
  141. TooltipString.Append(AssetId.ToString());
  142. }
  143. return FText::FromString(TooltipString);
  144. }
  145. void UEdGraphNode_ExtDependency::AllocateDefaultPins()
  146. {
  147. ReferencerPin = CreatePin( EEdGraphPinDirection::EGPD_Input, NAME_None, NAME_None);
  148. DependencyPin = CreatePin( EEdGraphPinDirection::EGPD_Output, NAME_None, NAME_None);
  149. ReferencerPin->bHidden = true;
  150. DependencyPin->bHidden = true;
  151. }
  152. UObject* UEdGraphNode_ExtDependency::GetJumpTargetForDoubleClick() const
  153. {
  154. #if ECB_WIP_REF_VIEWER_JUMP
  155. if (Identifiers.Num() > 0 )
  156. {
  157. GetDependencyViewerGraph()->SetGraphRoot(Identifiers, FIntPoint(NodePosX, NodePosY));
  158. GetDependencyViewerGraph()->RebuildGraph();
  159. }
  160. #endif
  161. return NULL;
  162. }
  163. UEdGraphPin* UEdGraphNode_ExtDependency::GetDependencyPin()
  164. {
  165. return DependencyPin;
  166. }
  167. UEdGraphPin* UEdGraphNode_ExtDependency::GetReferencerPin()
  168. {
  169. return ReferencerPin;
  170. }
  171. void UEdGraphNode_ExtDependency::CacheAssetData(const FExtAssetData& AssetData)
  172. {
  173. CachedAssetData = AssetData;
  174. bUsesThumbnail = false;
  175. if ( AssetData.IsValid()/* && IsPackage()*/ )
  176. {
  177. bUsesThumbnail = true;
  178. bIsMissingOrInvalid = false;
  179. }
  180. else
  181. {
  182. if (Identifiers.Num() == 1 )
  183. {
  184. const FString PackageNameStr = Identifiers[0].PackageName.ToString();
  185. if ( FPackageName::IsValidLongPackageName(PackageNameStr, true) )
  186. {
  187. bool bIsMapPackage = false;
  188. const bool bIsScriptPackage = PackageNameStr.StartsWith(TEXT("/Script"));
  189. if (bIsScriptPackage)
  190. {
  191. CachedAssetData.AssetClass = FName(TEXT("Code"));
  192. bIsMissingOrInvalid = !FExtPackageUtils::DoesPackageExist(PackageNameStr);
  193. if (bIsMissingOrInvalid)
  194. {
  195. CachedAssetData.AssetClass = FName(TEXT("Code Missing"));
  196. }
  197. }
  198. else
  199. {
  200. const FString PotentiallyMapFilename = FPackageName::LongPackageNameToFilename(PackageNameStr, FPackageName::GetMapPackageExtension());
  201. bIsMapPackage = FPlatformFileManager::Get().GetPlatformFile().FileExists(*PotentiallyMapFilename);
  202. if ( bIsMapPackage )
  203. {
  204. CachedAssetData.AssetClass = FName(TEXT("World"));
  205. bIsMissingOrInvalid = !FExtPackageUtils::DoesPackageExist(PackageNameStr);
  206. if (bIsMissingOrInvalid)
  207. {
  208. CachedAssetData.AssetClass = FName(TEXT("Map Missing"));
  209. }
  210. }
  211. }
  212. if (!bIsScriptPackage && !bIsMapPackage)
  213. {
  214. CachedAssetData = FExtAssetData(Identifiers[0].PackageName);
  215. bUsesThumbnail = CachedAssetData.HasThumbnail();
  216. const FString PackageFileStr = CachedAssetData.PackageFilePath.ToString();
  217. if (CachedAssetData.IsUAsset())
  218. {
  219. bIsMissingOrInvalid = !FExtAssetValidator::ValidateDependency({ CachedAssetData });
  220. if (bIsMissingOrInvalid)
  221. {
  222. CachedAssetData.AssetClass = FName(*CachedAssetData.GetInvalidReason());
  223. }
  224. }
  225. else
  226. {
  227. bIsMissingOrInvalid = !FExtPackageUtils::DoesPackageExist(PackageNameStr);
  228. if (bIsMissingOrInvalid)
  229. {
  230. CachedAssetData.AssetClass = FName(TEXT("Package Missing"));
  231. }
  232. }
  233. }
  234. }
  235. }
  236. else
  237. {
  238. CachedAssetData = FExtAssetData();
  239. CachedAssetData.AssetClass = FName(TEXT("Multiple Nodes"));
  240. }
  241. }
  242. }
  243. FExtAssetData UEdGraphNode_ExtDependency::GetAssetData() const
  244. {
  245. return CachedAssetData;
  246. }
  247. bool UEdGraphNode_ExtDependency::UsesThumbnail() const
  248. {
  249. return bUsesThumbnail;
  250. }
  251. bool UEdGraphNode_ExtDependency::IsPackage() const
  252. {
  253. return bIsPackage;
  254. }
  255. bool UEdGraphNode_ExtDependency::IsCollapsed() const
  256. {
  257. return bIsCollapsed;
  258. }
  259. bool UEdGraphNode_ExtDependency::IsMissingOrInvalid() const
  260. {
  261. return bIsMissingOrInvalid;
  262. }
  263. #undef LOCTEXT_NAMESPACE