void SLargeAssetTypeTreeWidget::Populate(const TArray<FString>& InSelectedAssetTypeClassNames) { AssetCategories.Empty(); TMap<EAssetTypeCategories::Type, FLargeAssetTypeTreeItemPtr> CategoryMap; AddCategoriesToCategoryMap(CategoryMap); FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools")); TArray<FAssetTypeWeakPtr> AssetTypes; AssetToolsModule.Get().GetAssetTypeActionsList(AssetTypes); struct FOrderAssetTypesByNameAsc { // return true if A should appear before B, false otherwise bool operator()(const FAssetTypeWeakPtr& A, const FAssetTypeWeakPtr& B) const { return A.Pin()->GetName().CompareTo(B.Pin()->GetName()) < 0; } }; AssetTypes.Sort(FOrderAssetTypesByNameAsc()); // assign all the asset types to the corresponding category tree items for (const auto AssetTypeWeakPtr : AssetTypes) { TSharedPtr<IAssetType> AssetType = AssetTypeWeakPtr.Pin(); // for consistency ignore asset types that can't be filtered by in the content browser, // usually this is because the asset type is not fully supported if (AssetType.IsValid() && AssetType->CanFilter()) { TArray<FLargeAssetTypeTreeItemWeakPtr> AssetTypeItems; for (auto CategoryMapEntry : CategoryMap) { if (AssetType->GetCategories() & CategoryMapEntry.Key) { FLargeAssetTypeTreeItemPtr AssetTypeItem = MakeShareable( new FLargeAssetTypeTreeItem(*AssetType.Get(), CategoryMapEntry.Value) ); AssetTypeItems.Add(AssetTypeItem); CategoryMapEntry.Value->Children.Add(AssetTypeItem); } } if (AssetTypeItems.Num() == 1) { auto AssetTypeItem = AssetTypeItems[0].Pin(); AssetTypeItem->SetIsSelected( InSelectedAssetTypeClassNames.Contains(AssetTypeItem->AssetTypeClassName) ); } else if (AssetTypeItems.Num() > 1) { auto AssetTypeItem = AssetTypeItems[0].Pin(); FLargeAssetTypeTreeItem::CreateSharedState( AssetTypeItems, InSelectedAssetTypeClassNames.Contains(AssetTypeItem->AssetTypeClassName) ); } } } for (const auto CategoryMapEntry : CategoryMap) { AssetCategories.Add(CategoryMapEntry.Value); } TreeView->RequestTreeRefresh(); }