// Copyright Epic Games, Inc. All Rights Reserved. #include "DetailCustomBuilderRow.h" #include "IDetailCustomNodeBuilder.h" #include "DetailCategoryBuilderImpl.h" #include "DetailItemNode.h" #include "CustomChildBuilder.h" FDetailCustomBuilderRow::FDetailCustomBuilderRow( TSharedRef CustomBuilder ) : CustomNodeBuilder( CustomBuilder ) { } TOptional FDetailCustomBuilderRow::GetCustomResetToDefault() const { if (HeaderRow.IsValid()) { return HeaderRow->GetCustomResetToDefault(); } return TOptional(); } void FDetailCustomBuilderRow::Tick( float DeltaTime ) { return CustomNodeBuilder->Tick( DeltaTime ); } bool FDetailCustomBuilderRow::RequiresTick() const { return CustomNodeBuilder->RequiresTick(); } bool FDetailCustomBuilderRow::HasColumns() const { return HeaderRow->HasColumns(); } bool FDetailCustomBuilderRow::ShowOnlyChildren() const { return !HeaderRow->HasAnyContent(); } void FDetailCustomBuilderRow::OnItemNodeInitialized( TSharedRef InTreeNode, TSharedRef InParentCategory, const TAttribute& InIsParentEnabled ) { ParentCategory = InParentCategory; IsParentEnabled = InIsParentEnabled; const bool bUpdateFilteredNodes = true; // Set a delegate on the interface that it will call to rebuild this nodes children CustomNodeBuilder->SetOnRebuildChildren(FSimpleDelegate::CreateSP(InTreeNode, &FDetailItemNode::GenerateChildren, bUpdateFilteredNodes)); CustomNodeBuilder->SetOnToggleExpansion(FOnToggleNodeExpansion::CreateSP(InTreeNode, &FDetailItemNode::SetExpansionState)); HeaderRow = MakeShared(); CustomNodeBuilder->GenerateHeaderRowContent(*HeaderRow); } FName FDetailCustomBuilderRow::GetCustomBuilderName() const { return CustomNodeBuilder->GetName(); } TSharedPtr FDetailCustomBuilderRow::GetPropertyHandle() const { return CustomNodeBuilder->GetPropertyHandle(); } void FDetailCustomBuilderRow::OnGenerateChildren( FDetailNodeList& OutChildren ) { ChildrenBuilder = MakeShared(ParentCategory.Pin().ToSharedRef()); CustomNodeBuilder->GenerateChildContent( *ChildrenBuilder ); const TArray< FDetailLayoutCustomization >& ChildRows = ChildrenBuilder->GetChildCustomizations(); for( int32 ChildIndex = 0; ChildIndex < ChildRows.Num(); ++ChildIndex ) { TSharedRef ChildNodeItem = MakeShareable( new FDetailItemNode( ChildRows[ChildIndex], ParentCategory.Pin().ToSharedRef(), IsParentEnabled ) ); ChildNodeItem->Initialize(); OutChildren.Add( ChildNodeItem ); } } bool FDetailCustomBuilderRow::IsInitiallyCollapsed() const { return CustomNodeBuilder->InitiallyCollapsed(); } TSharedPtr FDetailCustomBuilderRow::GetWidgetRow() const { return HeaderRow; } bool FDetailCustomBuilderRow::AreChildCustomizationsHidden() const { if (ChildrenBuilder && ChildrenBuilder->GetChildCustomizations().Num() > 0) { for (const FDetailLayoutCustomization& ChildCustomizations : ChildrenBuilder->GetChildCustomizations()) { if (!ChildCustomizations.IsHidden()) { return false; } } return true; } return false; }