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();
}