bool FDetailCategoryImpl::GenerateChildrenForSingleLayout( const FName RequiredGroupName, bool bDefaultLayout, bool bNeedsGroup, const FCustomizationList& LayoutList, FDetailNodeList& OutChildren, bool& bOutLastItemHasMultipleColumns )
{
	bool bGeneratedAnyChildren = false;
	if( LayoutList.Num() > 0 )
	{
		FDetailNodeList GeneratedChildren;
		GenerateNodesFromCustomizations( LayoutList, bDefaultLayout, GeneratedChildren, bOutLastItemHasMultipleColumns );

		if( GeneratedChildren.Num() > 0 )
		{
			bGeneratedAnyChildren = true;
			if( bNeedsGroup )
			{
				TSharedRef<IDetailTreeNode> GroupNode = MakeShareable( new FDetailCategoryGroupNode( GeneratedChildren, RequiredGroupName, *this ) );
				OutChildren.Add( GroupNode );
			}
			else
			{
				OutChildren.Append( GeneratedChildren );
			}
		}
	}

	return bGeneratedAnyChildren;
}
void SDetailsViewBase::UpdateFilteredDetails()
{
	RootTreeNodes.Reset();

	FDetailNodeList InitialRootNodeList;
	
	NumVisbleTopLevelObjectNodes = 0;
	FRootPropertyNodeList& RootPropertyNodes = GetRootNodes();

	CurrentFilter.bShowAllAdvanced = GetDefault<UEditorStyleSettings>()->bShowAllAdvancedDetails;

	for(int32 RootNodeIndex = 0; RootNodeIndex < RootPropertyNodes.Num(); ++RootNodeIndex)
	{
		TSharedPtr<FComplexPropertyNode>& RootPropertyNode = RootPropertyNodes[RootNodeIndex];
		if(RootPropertyNode.IsValid())
		{
			RootPropertyNode->FilterNodes(CurrentFilter.FilterStrings);
			RootPropertyNode->ProcessSeenFlags(true);

			for(int32 NodeIndex = 0; NodeIndex < ExternalRootPropertyNodes.Num(); ++NodeIndex)
			{
				TSharedPtr<FPropertyNode> PropertyNode = ExternalRootPropertyNodes[NodeIndex].Pin();

				if(PropertyNode.IsValid())
				{
					PropertyNode->FilterNodes(CurrentFilter.FilterStrings);
					PropertyNode->ProcessSeenFlags(true);
				}
			}

			TSharedPtr<FDetailLayoutBuilderImpl>& DetailLayout = DetailLayouts[RootNodeIndex].DetailLayout;
			if(DetailLayout.IsValid())
			{
				DetailLayout->FilterDetailLayout(CurrentFilter);
			}

			FDetailNodeList& LayoutRoots = DetailLayout->GetRootTreeNodes();
			if(LayoutRoots.Num() > 0)
			{
				// A top level object nodes has a non-filtered away root so add one to the total number we have
				++NumVisbleTopLevelObjectNodes;

				InitialRootNodeList.Append(LayoutRoots);
			}
		
		}
	}


	// for multiple top level object we need to do a secondary pass on top level object nodes after we have determined if there is any nodes visible at all.  If there are then we ask the details panel if it wants to show childen
	for(TSharedRef<class IDetailTreeNode> RootNode : InitialRootNodeList)
	{
		if(RootNode->ShouldShowOnlyChildren())
		{
			RootNode->GetChildren(RootTreeNodes);
		}
		else
		{
			RootTreeNodes.Add(RootNode);
		}
	}

	RefreshTree();
}