// Copyright Epic Games, Inc. All Rights Reserved. #include "InputCustomizations.h" #include "ActionMappingDetails.h" #include "DetailCategoryBuilder.h" #include "DetailLayoutBuilder.h" #include "EnhancedActionKeyMapping.h" #include "IDetailChildrenBuilder.h" #include "InputMappingContext.h" #include "KeyStructCustomization.h" #include "PropertyCustomizationHelpers.h" #define LOCTEXT_NAMESPACE "InputCustomization" TSharedRef FInputContextDetails::MakeInstance() { return MakeShareable(new FInputContextDetails); } void FInputContextDetails::CustomizeDetails(class IDetailLayoutBuilder& DetailBuilder) { // Custom Action Mappings const TSharedPtr ActionMappingsPropertyHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UInputMappingContext, Mappings)); ActionMappingsPropertyHandle->MarkHiddenByCustomization(); IDetailCategoryBuilder& MappingsDetailCategoryBuilder = DetailBuilder.EditCategory(ActionMappingsPropertyHandle->GetDefaultCategoryName()); const TSharedRef ActionMappingsBuilder = MakeShareable(new FActionMappingsNodeBuilderEx(&DetailBuilder, ActionMappingsPropertyHandle)); MappingsDetailCategoryBuilder.AddCustomBuilder(ActionMappingsBuilder); } void FEnhancedActionMappingCustomization::CustomizeHeader(TSharedRef PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) { MappingPropertyHandle = PropertyHandle; // Grab the FKey property TSharedPtr KeyHandle = PropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FEnhancedActionKeyMapping, Key)); TSharedRef RemoveButton = PropertyCustomizationHelpers::MakeDeleteButton(FSimpleDelegate::CreateSP(this, &FEnhancedActionMappingCustomization::RemoveMappingButton_OnClick), LOCTEXT("RemoveMappingToolTip", "Remove Mapping")); // Create a new instance of the key customization. KeyStructInstance = FKeyStructCustomization::MakeInstance(); // TODO: Use FDetailArrayBuilder? // Pass our header row into the key struct customizeheader method so it populates our row with the key struct header StaticCastSharedPtr(KeyStructInstance)->CustomizeHeaderOnlyWithButton(KeyHandle.ToSharedRef(), HeaderRow, CustomizationUtils, RemoveButton); } void FEnhancedActionMappingCustomization::CustomizeChildren(TSharedRef PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils) { TSharedPtr TriggersHandle = PropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FEnhancedActionKeyMapping, Triggers)); TSharedPtr ModifiersHandle = PropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FEnhancedActionKeyMapping, Modifiers)); TSharedPtr IsPlayerMappableHandle = PropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FEnhancedActionKeyMapping, bIsPlayerMappable)); TSharedPtr PlayerBindingOptions = PropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FEnhancedActionKeyMapping, PlayerMappableOptions)); // TODO: ResetToDefault needs to be disabled for arrays ChildBuilder.AddProperty(TriggersHandle.ToSharedRef()); ChildBuilder.AddProperty(ModifiersHandle.ToSharedRef()); ChildBuilder.AddProperty(IsPlayerMappableHandle.ToSharedRef()); ChildBuilder.AddProperty(PlayerBindingOptions.ToSharedRef()); } void FEnhancedActionMappingCustomization::RemoveMappingButton_OnClick() const { if (MappingPropertyHandle->IsValidHandle()) { const TSharedPtr ParentHandle = MappingPropertyHandle->GetParentHandle(); const TSharedPtr ParentArrayHandle = ParentHandle->AsArray(); ParentArrayHandle->DeleteItem(MappingPropertyHandle->GetIndexInArray()); } } #undef LOCTEXT_NAMESPACE