// Copyright Epic Games, Inc.All Rights Reserved. #pragma once #include "Containers/Array.h" #include "HAL/Platform.h" #include "IPropertyTypeCustomization.h" #include "Internationalization/Text.h" #include "Templates/SharedPointer.h" #include "UObject/NameTypes.h" namespace ESelectInfo { enum Type : int; } class IPropertyHandle; class IPropertyUtilities; class SWidget; class UBlackboardData; struct FValueOrBlackboardKeyBase; class BEHAVIORTREEEDITOR_API FValueOrBBKeyDetails : public IPropertyTypeCustomization { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; bool CanEditDefaultValue() const; protected: TSharedPtr StructProperty; TSharedPtr KeyProperty; TSharedPtr DefaultValueProperty; TSharedPtr CachedUtils; TArray MatchingKeys; virtual void ValidateData(); virtual TSharedRef CreateDefaultValueWidget(); void GetMatchingKeys(TArray& OutNames); bool HasAccessToBlackboard() const; TSharedRef OnGetKeyNames(); void OnKeyChanged(int32 Index); FText GetKeyDesc() const; const FValueOrBlackboardKeyBase* GetDataPtr() const; }; class FValueOrBBKeyDetails_Class : public FValueOrBBKeyDetails { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; protected: TSharedPtr BaseClassProperty; virtual void ValidateData() override; virtual TSharedRef CreateDefaultValueWidget() override; void OnBaseClassChanged(); void OnSetClass(const UClass* NewClass); const UClass* OnGetSelectedClass() const; void BrowseToClass() const; }; class FValueOrBBKeyDetails_Enum : public FValueOrBBKeyDetails { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; protected: TSharedPtr EnumTypeProperty; TSharedPtr NativeEnumTypeNameProperty; virtual void ValidateData() override; virtual TSharedRef CreateDefaultValueWidget() override; void OnEnumSelectionChanged(int32 NewValue, ESelectInfo::Type); void OnEnumTypeChanged(); void OnNativeEnumTypeNameChanged(); int32 GetEnumValue() const; bool CanEditEnumType() const; }; class FValueOrBBKeyDetails_Object : public FValueOrBBKeyDetails { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; protected: TSharedPtr BaseClassProperty; virtual void ValidateData() override; virtual TSharedRef CreateDefaultValueWidget() override; void OnBaseClassChanged(); void OnObjectChanged(const FAssetData& AssetData); FString OnGetObjectPath() const; void BrowseToObject() const; }; class FValueOrBBKeyDetails_Struct : public FValueOrBBKeyDetails { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; protected: TSharedPtr EditDefaultsOnlyProperty; }; class BEHAVIORTREEEDITOR_API FValueOrBBKeyDetails_WithChild : public FValueOrBBKeyDetails { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); virtual void CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; };