// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Layout/Visibility.h" #include "WidgetBlueprintEditor.h" #include "IPropertyTypeCustomization.h" #include "StructUtils/InstancedStruct.h" #include "PropertyHandle.h" class IDetailChildrenBuilder; class IPropertyUtilities; class FWidgetNavigationCustomization : public IPropertyTypeCustomization { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(TSharedRef InEditor) { return MakeShareable(new FWidgetNavigationCustomization(InEditor)); } FWidgetNavigationCustomization(TSharedRef InEditor) : Editor(InEditor) { } virtual void CustomizeHeader(TSharedRef PropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) override; virtual void CustomizeChildren(TSharedRef PropertyHandle, class IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils) override; private: EUINavigationRule GetNavigationRule(TWeakPtr PropertyHandle, EUINavigation Nav) const; FText GetNavigationText(TWeakPtr PropertyHandle, EUINavigation Nav) const; void MakeNavRow(TWeakPtr PropertyHandle, IDetailChildrenBuilder& ChildBuilder, EUINavigation Nav, FText NavName); TSharedRef MakeNavMenu(TWeakPtr PropertyHandle, EUINavigation Nav); void HandleNavMenuEntryClicked(TWeakPtr PropertyHandle, EUINavigation Nav, EUINavigationRule Rule); TSharedRef OnGenerateWidgetList(TWeakPtr PropertyHandle, EUINavigation Nav); void HandleSelectedCustomNavigationFunction(FName SelectedFunction, TWeakPtr PropertyHandle, EUINavigation Nav); void HandleResetCustomNavigationFunction(TWeakPtr PropertyHandle, EUINavigation Nav); FText GetExplictWidget(TWeakPtr PropertyHandle, EUINavigation Nav) const; TOptional GetUniformNavigationTargetOrFunction(TWeakPtr PropertyHandle, EUINavigation Nav) const; void OnWidgetSelectedForExplicitNavigation(FName ExplictWidgetOrFunction, TWeakPtr PropertyHandle, EUINavigation Nav); EVisibility GetCustomWidgetFieldVisibility(TWeakPtr PropertyHandle, EUINavigation Nav) const; EVisibility GetExplictWidgetFieldVisibility(TWeakPtr PropertyHandle, EUINavigation Nav) const; void SetNav(UWidget* Widget, EUINavigation Nav, TOptional Rule, TOptional WidgetToFocus); bool DoesWidgetSupportRoutingPolicy(TWeakPtr PropertyHandle) const; EWidgetNavigationRoutingPolicy GetRoutingPolicy(TWeakPtr PropertyHandle) const; FText GetRoutingPolicyText(TWeakPtr PropertyHandle) const; TSharedRef MakeRoutingPolicyMenu(TWeakPtr PropertyHandle); void HandleRoutingPolicyMenuEntryClicked(TWeakPtr PropertyHandle, EWidgetNavigationRoutingPolicy Policy); void SetRoutingPolicy(UWidget* Widget, EWidgetNavigationRoutingPolicy Policy); void OnNavigationMethodPrePropertyChange(TWeakPtr PropertyHandle); void MakeNavigationMethodStructPicker(TWeakPtr PropertyHandle, IDetailChildrenBuilder& ChildBuilder); void HandleNavigationMethodStructPicked(TWeakPtr PropertyHandle, const UScriptStruct* InStruct); void SetNavigationMethodStruct(UWidget* Widget, const UScriptStruct* NavigationMethodStruct); private: TWeakPtr Editor; TSharedPtr PropertyUtilities; };