void FReplaceVectorWithLinearColorBuilder::GeneratePropertyContent(const TSharedRef<IPropertyHandle>& Handle, IDetailChildrenBuilder& ChildrenBuilder) { // Add to the current builder, depending on the property type. uint32 NumChildren = 0; ensure(Handle->GetNumChildren(NumChildren) == FPropertyAccess::Success); bool bHasChildren = (NumChildren > 0); bool bIsArray = Handle->AsArray().IsValid(); if (bIsArray) { // Arrays need special handling and will create an array builder TSharedRef<FDetailArrayBuilder> ArrayBuilder = MakeShareable(new FDetailArrayBuilder(Handle)); ArrayBuilder->OnGenerateArrayElementWidget(FOnGenerateArrayElementWidget::CreateSP(this, &FReplaceVectorWithLinearColorBuilder::OnGenerateArrayElementWidget)); ChildrenBuilder.AddChildCustomBuilder(ArrayBuilder); } else if (bHasChildren) { // If there are children, we invoke a new instance of our custom builder for recursive handling // Note, if this is an FVector, it will be handled specially by the implementation of the IDetailCustomNodeBuilder interface. TSharedRef<FReplaceVectorWithLinearColorBuilder> StructBuilder = MakeShareable(new FReplaceVectorWithLinearColorBuilder(Handle)); ChildrenBuilder.AddChildCustomBuilder(StructBuilder); } else { // No children - just add the property. ChildrenBuilder.AddChildProperty(Handle); } }
void FRawDistributionVectorStructCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { // Determine from the metadata whether we should treat vectors as FLinearColors or not bool bTreatAsColor = StructPropertyHandle->HasMetaData("TreatAsColor"); uint32 NumChildren; ensure(StructPropertyHandle->GetNumChildren(NumChildren) == FPropertyAccess::Success); // Now recurse through all children, creating a custom builder for each which will either add the default property row, or // a property row exposing a FLinearColor type customization which maps directly to the elements of the original FVector. for (uint32 ChildIndex = 0; ChildIndex < NumChildren; ChildIndex++) { TSharedPtr<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex); check(ChildHandle.IsValid()); if (bTreatAsColor) { TSharedRef<FReplaceVectorWithLinearColorBuilder> CustomBuilder = MakeShareable(new FReplaceVectorWithLinearColorBuilder(ChildHandle.ToSharedRef())); StructBuilder.AddChildCustomBuilder(CustomBuilder); } else { StructBuilder.AddChildProperty(ChildHandle.ToSharedRef()); } } }
void FFormatTextLayout::GenerateChildContent( IDetailChildrenBuilder& ChildrenBuilder ) { Children.Empty(); for (int32 ArgIdx = 0; ArgIdx < TargetNode->GetArgumentCount(); ++ArgIdx) { TSharedRef<class FFormatTextArgumentLayout> ArgumentIndexLayout = MakeShareable(new FFormatTextArgumentLayout(TargetNode, ArgIdx) ); ChildrenBuilder.AddChildCustomBuilder(ArgumentIndexLayout); Children.Add(ArgumentIndexLayout); } }