void FLandscapeEditorStructCustomization_FGizmoImportLayer::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { TSharedRef<IPropertyHandle> PropertyHandle_LayerFilename = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FGizmoImportLayer, LayerFilename)).ToSharedRef(); ChildBuilder.AddChildProperty(PropertyHandle_LayerFilename) .CustomWidget() .NameContent() [ PropertyHandle_LayerFilename->CreatePropertyNameWidget() ] .ValueContent() .MinDesiredWidth(250.0f) .MaxDesiredWidth(0) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() [ PropertyHandle_LayerFilename->CreatePropertyValueWidget() ] + SHorizontalBox::Slot() .AutoWidth() //.Padding(0,0,12,0) // Line up with the other properties due to having no reset to default button [ SNew(SButton) .ContentPadding(FMargin(4, 0)) .Text(NSLOCTEXT("UnrealEd", "GenericOpenDialog", "...")) .OnClicked_Static(&FLandscapeEditorStructCustomization_FGizmoImportLayer::OnGizmoImportLayerFilenameButtonClicked, PropertyHandle_LayerFilename) ] ]; TSharedRef<IPropertyHandle> PropertyHandle_LayerName = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FGizmoImportLayer, LayerName)).ToSharedRef(); ChildBuilder.AddChildProperty(PropertyHandle_LayerName); }
void FSpriteDetailsCustomization::GenerateAdditionalTextureWidget(TSharedRef<IPropertyHandle> PropertyHandle, int32 ArrayIndex, IDetailChildrenBuilder& ChildrenBuilder) { IDetailPropertyRow& TextureRow = ChildrenBuilder.AddChildProperty(PropertyHandle); FText ExtraText; if (FText* pExtraText = AdditionalTextureLabels.Find(ArrayIndex)) { ExtraText = *pExtraText; } FNumberFormattingOptions NoCommas; NoCommas.UseGrouping = false; const FText SlotDesc = FText::Format(LOCTEXT("AdditionalTextureSlotIndex", "Slot #{0}"), FText::AsNumber(ArrayIndex, &NoCommas)); TextureRow.DisplayName(SlotDesc); TextureRow.ShowPropertyButtons(false); TextureRow.CustomWidget(false) .NameContent() [ CreateTextureNameWidget(PropertyHandle, ExtraText) ] .ValueContent() .MaxDesiredWidth(TOptional<float>()) [ PropertyHandle->CreatePropertyValueWidget() ]; }
void FMoviePlayerSettingsDetails::GenerateArrayElementWidget(TSharedRef<IPropertyHandle> PropertyHandle, int32 ArrayIndex, IDetailChildrenBuilder& ChildrenBuilder) { IDetailPropertyRow& FilePathRow = ChildrenBuilder.AddChildProperty( PropertyHandle ); { FilePathRow.CustomWidget(false) .NameContent() [ PropertyHandle->CreatePropertyNameWidget() ] .ValueContent() .MaxDesiredWidth(0.0f) .MinDesiredWidth(125.0f) [ SNew(SFilePathPicker) .BrowseButtonImage(FEditorStyle::GetBrush("PropertyWindow.Button_Ellipsis")) .BrowseButtonStyle(FEditorStyle::Get(), "HoverHintOnly") .BrowseButtonToolTip(LOCTEXT("FileButtonToolTipText", "Choose a file from this computer")) .BrowseDirectory(FEditorDirectories::Get().GetLastDirectory(ELastDirectory::GENERIC_OPEN)) .BrowseTitle(LOCTEXT("PropertyEditorTitle", "File picker...")) .FilePath(this, &FMoviePlayerSettingsDetails::HandleFilePathPickerFilePath, PropertyHandle) .FileTypeFilter(TEXT("MPEG-4 Movie (*.mp4)|*.mp4")) .OnPathPicked(this, &FMoviePlayerSettingsDetails::HandleFilePathPickerPathPicked, PropertyHandle) ]; } };
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 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 FDialogueContextMappingNodeBuilder::GenerateChildContent( IDetailChildrenBuilder& ChildrenBuilder ) { if( ContextMappingPropertyHandle->IsValidHandle() ) { const TSharedPtr<IPropertyHandle> SoundwavePropertyHandle = ContextMappingPropertyHandle->GetChildHandle("Soundwave"); ChildrenBuilder.AddChildProperty(SoundwavePropertyHandle.ToSharedRef()); } }
void FNiagaraEmitterPropertiesDetails::OnGenerateScalarConstantEntry(TSharedRef<IPropertyHandle> ElementProperty, int32 ElementIndex, IDetailChildrenBuilder& ChildrenBuilder) { TSharedPtr<IPropertyHandle> ValueProperty = ElementProperty->GetChildHandle(GET_MEMBER_NAME_CHECKED(FNiagaraConstants_Float, Value)); TSharedPtr<IPropertyHandle> NameProperty = ElementProperty->GetChildHandle(GET_MEMBER_NAME_CHECKED(FNiagaraConstants_Float, Name)); FName DisplayName; NameProperty->GetValue(DisplayName); //Don't display system constants if (UNiagaraComponent::GetSystemConstants().Find(FNiagaraVariableInfo(DisplayName, ENiagaraDataType::Scalar)) == INDEX_NONE) { ChildrenBuilder.AddChildProperty(ValueProperty.ToSharedRef()).DisplayName(FText::FromName(DisplayName)); } }
void FAbcCompressionSettingsCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { Settings = UAbcImportSettings::Get(); uint32 NumChildren; StructPropertyHandle->GetNumChildren(NumChildren); for (uint32 ChildIndex = 0; ChildIndex < NumChildren; ++ChildIndex) { TSharedRef<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef(); IDetailPropertyRow& Property = StructBuilder.AddChildProperty(ChildHandle); static const FName EditConditionName = "EnumCondition"; int32 EnumCondition = ChildHandle->GetINTMetaData(EditConditionName); Property.Visibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FAbcCompressionSettingsCustomization::ArePropertiesVisible, EnumCondition))); } }
void FAttributeBasedFloatDetails::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { uint32 NumChildrenProps = 0; StructPropertyHandle->GetNumChildren(NumChildrenProps); AttributeCalculationTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FAttributeBasedFloat, AttributeCalculationType)); const TSharedPtr<IPropertyHandle> FinalChannelHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FAttributeBasedFloat, FinalChannel)); if (ensure(FinalChannelHandle.IsValid()) && ensure(FinalChannelHandle->IsValidHandle()) && ensure(AttributeCalculationTypePropertyHandle.IsValid()) && ensure(AttributeCalculationTypePropertyHandle->IsValidHandle())) { for (uint32 ChildIdx = 0; ChildIdx < NumChildrenProps; ++ChildIdx) { TSharedPtr<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIdx); if (ChildHandle.IsValid() && ChildHandle->IsValidHandle()) { IDetailPropertyRow& NewPropRow = StructBuilder.AddChildProperty(ChildHandle.ToSharedRef()); if (ChildHandle->GetProperty() == FinalChannelHandle->GetProperty()) { NewPropRow.Visibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FAttributeBasedFloatDetails::GetFinalChannelVisibility))); } } } } }
void FCurveColorCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> InStructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { uint32 NumChildren = 0; StructPropertyHandle->GetNumChildren(NumChildren); for( uint32 ChildIndex = 0; ChildIndex < NumChildren; ++ChildIndex ) { TSharedPtr<IPropertyHandle> Child = StructPropertyHandle->GetChildHandle( ChildIndex ); if( Child->GetProperty()->GetName() == TEXT("ExternalCurve") ) { ExternalCurveHandle = Child; FSimpleDelegate OnCurveChangedDelegate = FSimpleDelegate::CreateSP( this, &FCurveColorCustomization::OnExternalCurveChanged, InStructPropertyHandle ); Child->SetOnPropertyValueChanged(OnCurveChangedDelegate); StructBuilder.AddChildContent(LOCTEXT("ExternalCurveLabel", "ExternalCurve")) .NameContent() [ Child->CreatePropertyNameWidget() ] .ValueContent() [ SNew(SVerticalBox) +SVerticalBox::Slot() .AutoHeight() [ SNew(SHorizontalBox) +SHorizontalBox::Slot() [ Child->CreatePropertyValueWidget() ] +SHorizontalBox::Slot() .AutoWidth() .VAlign(VAlign_Center) .Padding(1,0) [ SNew(SButton) .ButtonStyle( FEditorStyle::Get(), "NoBorder" ) .ContentPadding(1.f) .ToolTipText(LOCTEXT("ConvertInternalCurveTooltip", "Convert to Internal Color Curve")) .OnClicked(this, &FCurveColorCustomization::OnConvertButtonClicked) .IsEnabled(this, &FCurveColorCustomization::IsConvertButtonEnabled) [ SNew(SImage) .Image( FEditorStyle::GetBrush(TEXT("PropertyWindow.Button_Clear")) ) ] ] ] +SVerticalBox::Slot() .AutoHeight() [ SNew(SButton) .HAlign(HAlign_Center) .Text( LOCTEXT( "CreateAssetButton", "Create External Curve" ) ) .ToolTipText(LOCTEXT( "CreateAssetTooltip", "Create a new Color Curve asset from this curve") ) .OnClicked(this, &FCurveColorCustomization::OnCreateButtonClicked) .IsEnabled(this, &FCurveColorCustomization::IsCreateButtonEnabled) ] ]; } else { StructBuilder.AddChildProperty(Child.ToSharedRef()); } } }