void FClassBrowseHelper::BuildClassGraph() { UClass* RootNodeClass = UBTNode::StaticClass(); TArray<TSharedPtr<FClassDataNode> > NodeList; RootNode.Reset(); // gather all native classes for (TObjectIterator<UClass> It; It; ++It) { UClass* TestClass = *It; if (TestClass->HasAnyClassFlags(CLASS_Native) && TestClass->IsChildOf(RootNodeClass)) { TSharedPtr<FClassDataNode> NewNode = MakeShareable(new FClassDataNode); NewNode->ParentClassName = TestClass->GetSuperClass()->GetName(); FClassData NewData(TestClass); NewNode->Data = NewData; if (TestClass == RootNodeClass) { RootNode = NewNode; } NodeList.Add(NewNode); } } // gather all blueprints FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")); TArray<FAssetData> BlueprintList; FARFilter Filter; Filter.ClassNames.Add(UBlueprint::StaticClass()->GetFName()); AssetRegistryModule.Get().GetAssets(Filter, BlueprintList); for (int32 i = 0; i < BlueprintList.Num(); i++) { TSharedPtr<FClassDataNode> NewNode = CreateClassDataNode(BlueprintList[i]); NodeList.Add(NewNode); } // build class tree AddClassGraphChildren(RootNode, NodeList); }
void FClassBrowseHelper::AddClassGraphChildren(TSharedPtr<FClassDataNode> Node, TArray<TSharedPtr<FClassDataNode> >& NodeList) { if (!Node.IsValid()) { return; } const FString NodeClassName = Node->Data.GetClassName(); for (int32 i = NodeList.Num() - 1; i >= 0; i--) { if (NodeList[i]->ParentClassName == NodeClassName) { TSharedPtr<FClassDataNode> MatchingNode = NodeList[i]; NodeList.RemoveAt(i); MatchingNode->ParentNode = Node; Node->SubNodes.Add(MatchingNode); AddClassGraphChildren(MatchingNode, NodeList); } } }
void FGraphNodeClassHelper::BuildClassGraph() { TArray<TSharedPtr<FGraphNodeClassNode> > NodeList; TArray<UClass*> HideParentList; RootNode.Reset(); // gather all native classes for (TObjectIterator<UClass> It; It; ++It) { UClass* TestClass = *It; if (TestClass->HasAnyClassFlags(CLASS_Native) && TestClass->IsChildOf(RootNodeClass)) { TSharedPtr<FGraphNodeClassNode> NewNode = MakeShareable(new FGraphNodeClassNode); NewNode->ParentClassName = TestClass->GetSuperClass()->GetName(); FString DeprecatedMessage = GetDeprecationMessage(TestClass); FGraphNodeClassData NewData(TestClass, DeprecatedMessage); NewData.bHideParent = IsHidingParentClass(TestClass); if (NewData.bHideParent) { HideParentList.Add(TestClass->GetSuperClass()); } NewData.bIsHidden = IsHidingClass(TestClass); NewNode->Data = NewData; if (TestClass == RootNodeClass) { RootNode = NewNode; } NodeList.Add(NewNode); } } // find all hidden parent classes for (int32 i = 0; i < NodeList.Num(); i++) { TSharedPtr<FGraphNodeClassNode> TestNode = NodeList[i]; if (HideParentList.Contains(TestNode->Data.GetClass())) { TestNode->Data.bIsHidden = true; } } // gather all blueprints FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")); TArray<FAssetData> BlueprintList; FARFilter Filter; Filter.ClassNames.Add(UBlueprint::StaticClass()->GetFName()); AssetRegistryModule.Get().GetAssets(Filter, BlueprintList); for (int32 i = 0; i < BlueprintList.Num(); i++) { TSharedPtr<FGraphNodeClassNode> NewNode = CreateClassDataNode(BlueprintList[i]); NodeList.Add(NewNode); } // build class tree AddClassGraphChildren(RootNode, NodeList); }