Files
UnrealEngine/Engine/Source/Editor/PropertyEditor/Private/PropertyHandleImpl.h
2025-05-18 13:04:45 +08:00

828 lines
41 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/UnrealType.h"
#include "Widgets/SWidget.h"
#include "PropertyHandle.h"
#include "AssetRegistry/AssetData.h"
#include "PropertyNode.h"
class FNotifyHook;
class FPropertyRestriction;
class FObjectBaseAddress
{
public:
FObjectBaseAddress() = default;
FObjectBaseAddress(UObject* InObject, uint8* InStructAddress, uint8* InBaseAddress, bool bInIsStruct)
: Object(InObject)
, StructAddress(InStructAddress)
, BaseAddress(InBaseAddress)
, bIsStruct(bInIsStruct)
{}
/** Object associated with the value, or owner object when editing a struct. */
UObject* Object = nullptr;
/** Pointer to the object/struct instance that actually owns the value (may be pointing to sidecar data). */
uint8* StructAddress = nullptr;
/** Pointer to the base address of the value within StructAddress. */
uint8* BaseAddress = nullptr;
/** Editing a struct */
bool bIsStruct = false;
};
/**
* Encapsulates a property node (and property) and provides functionality to read and write to that node
*/
class FPropertyValueImpl
{
public:
/**
* Constructor
*
* @param InPropertyNode The property node containing information about the property to be edited
* @param NotifyHook Optional notify hook for pre/post edit change messages sent outside of objects being modified
*/
FPropertyValueImpl( TSharedPtr<FPropertyNode> InPropertyNode, FNotifyHook* InNotifyHook, TSharedPtr<IPropertyUtilities> InPropertyUtilities );
/**
* Recurse up to the next object node, adding all array indices into a map according to their property name
* @param ArrayIndexMap - for the current object, what properties use which array offsets
* @param InNode - node to start adding array offsets for. This function will move upward until it gets to an object node
*/
static void GenerateArrayIndexMapToObjectNode( TMap<FString,int32>& OutArrayIndexMap, FPropertyNode* PropertyNode );
/**
* Gets the value as a string formatted for multiple values in an array
*/
FString GetPropertyValueArray() const;
/**
* Enumerate the objects that need to be modified from the passed in property node
*
* @param InPropertyNode The property node to get objects from
* @param InObjectsToModifyCallback The function to call for each object
*/
typedef TFunctionRef<bool(const FObjectBaseAddress& /*ObjectToModify*/, const int32 /*ObjectIndex*/, const int32 /*NumObjects*/)> EnumerateObjectsToModifyFuncRef; /** Return true to continue enumeration */
void EnumerateObjectsToModify( FPropertyNode* InPropertyNode, const EnumerateObjectsToModifyFuncRef& InObjectsToModifyCallback ) const;
/**
* Gets the objects that need to be modified from the passed in property node
*
* @param ObjectsToModify The addresses of the objects to modify
* @param InPropertyNode The property node to get objects from
*/
void GetObjectsToModify( TArray<FObjectBaseAddress>& ObjectsToModify, FPropertyNode* InPropertyNode ) const;
/**
* Gets the union of values with the appropriate type for the property set
*
* @param OutAddress The location of the property value
* @return The result of the query
*/
FPropertyAccess::Result GetValueData( void*& OutAddress ) const;
/**
* Gets edit stack for this property
*
* @param OutStack Edit stack
* @return The result of the query
*/
FPropertyAccess::Result GetValueEditStack(FPropertyNodeEditStack& OutStack) const;
/**
* Given an address and a property type, get the actual value out
*
* @param Address The location of the property value
* @return The property value
*/
template<class TProperty>
typename TProperty::TCppType GetPropertyValue(void const* Address) const
{
TSharedPtr<FPropertyNode> PropertyNodePin = PropertyNode.Pin();
check(PropertyNodePin.IsValid());
return CastFieldChecked<TProperty>(PropertyNodePin->GetProperty())->GetPropertyValue(Address);
}
/**
* Given an address, get the actual UObject* value out
*
* @param Address The location of the property value
* @return The object property value
*/
UObject* GetObjectPropertyValue(void const* Address) const
{
TSharedPtr<FPropertyNode> PropertyNodePin = PropertyNode.Pin();
check(PropertyNodePin.IsValid());
return CastFieldChecked<FObjectPropertyBase>(PropertyNodePin->GetProperty())->GetObjectPropertyValue(Address);
}
/**
* The core functionality for setting values on a property
*
* @param The value formatted as a string
* @return The result of attempting to set the value
*/
FPropertyAccess::Result ImportText( const FString& InValue, EPropertyValueSetFlags::Type Flags );
FPropertyAccess::Result ImportText( const FString& InValue, FPropertyNode* PropertyNode, EPropertyValueSetFlags::Type Flags );
FPropertyAccess::Result ImportText( const TArray<FObjectBaseAddress>& InObjects, const TArray<FString>& InValues, FPropertyNode* PropertyNode, EPropertyValueSetFlags::Type Flags );
/**
* Enumerate the raw data of this property. (Each pointer can be cast to the property data type)
*
* @param InRawDataCallback The function to call for each data
*/
void EnumerateRawData( const IPropertyHandle::EnumerateRawDataFuncRef& InRawDataCallback );
void EnumerateConstRawData( const IPropertyHandle::EnumerateConstRawDataFuncRef& InRawDataCallback ) const;
/**
* Accesses the raw data of this property.
*
* @param RawData An array of raw data.
*/
void AccessRawData( TArray<void*>& RawData );
void AccessRawData( TArray<const void*>& RawData ) const;
/**
* Sets a delegate to call when the property value changes
*/
void SetOnPropertyValueChanged( const FSimpleDelegate& InOnPropertyValueChanged );
void SetOnPropertyValueChangedWithData(const TDelegate<void(const FPropertyChangedEvent&)>& InOnPropertyValueChanged);
/**
* Sets a delegate to call when the property value of a child changes
*/
void SetOnChildPropertyValueChanged( const FSimpleDelegate& InOnChildPropertyValueChanged );
void SetOnChildPropertyValueChangedWithData(const TDelegate<void(const FPropertyChangedEvent&)>& InOnChildPropertyValueChanged);
/**
* Sets a delegate to call when the property value is about to change
*/
void SetOnPropertyValuePreChange(const FSimpleDelegate& InOnPropertyValuePreChange);
/**
* Sets a delegate to call when the property value of a child is about to change
*/
void SetOnChildPropertyValuePreChange(const FSimpleDelegate& InOnChildPropertyValuePreChange);
/**
* Sets a delegate to call when a property is reset to default
*/
void SetOnPropertyResetToDefault(const FSimpleDelegate& InOnPropertyResetToDefault);
/**
* Sets a delegate to call when children of the property node must be rebuilt
*/
FDelegateHandle SetOnRebuildChildren( const FSimpleDelegate& InOnRebuildChildren );
/**
* Unregisters a delegate called when children of the property node must be rebuilt
*/
void UnregisterOnRebuildChildren(FDelegateHandle Handle);
/**
* Get the value of a property as a formatted string.
* Each FProperty has a specific string format that it sets
*
* @param OutValue The formatted string value to set
* @param PortFlags Determines how the property's value is accessed. Defaults to PPF_PropertyWindow
* @return The result of attempting to get the value
*/
FPropertyAccess::Result GetValueAsString( FString& OutString, EPropertyPortFlags PortFlags = PPF_PropertyWindow ) const;
/**
* Get the value of a property as a formatted string, possibly using an alternate form more suitable for display in the UI
*
* @param OutValue The formatted string value to set
* @param PortFlags Determines how the property's value is accessed.
* @return The result of attempting to get the value
*/
FPropertyAccess::Result GetValueAsDisplayString( FString& OutString, EPropertyPortFlags PortFlags ) const;
/**
* Get the value of a property as FText.
*
* @param OutValue The formatted text value to set
* @return The result of attempting to get the value
*/
FPropertyAccess::Result GetValueAsText( FText& OutText ) const;
/**
* Get the value of a property as FText, possibly using an alternate form more suitable for display in the UI
*
* @param OutValue The formatted text value to set
* @return The result of attempting to get the value
*/
FPropertyAccess::Result GetValueAsDisplayText( FText& OutText ) const;
/**
* Sets the value of a property formatted from a string.
* Each FProperty has a specific string format it requires
*
* @param InValue The formatted string value to set
* @return The result of attempting to set the value
*/
FPropertyAccess::Result SetValueAsString( const FString& InValue, EPropertyValueSetFlags::Type Flags );
/**
* Returns whether or not a property is of a specific subclass of FProperty
*
* @param ClassType The class type to check
* @param true if the property is a ClassType
*/
bool IsPropertyTypeOf( FFieldClass* ClassType ) const ;
/**
* @return The property node used by this value
*/
TSharedPtr<FPropertyNode> GetPropertyNode() const;
/**
* @return The number of children the property node has
*/
int32 GetNumChildren() const;
/**
* Gets a child node of the property node
*
* @param ChildName The name of the child to get
* @return The child property node or nullptr if it doesnt exist
*/
TSharedPtr<FPropertyNode> GetChildNode( FName ChildName, bool bRecurse = true ) const;
/**
* Gets a child node of the property node
*
* @param ChildIndex The child index where the child is stored
* @return The child property node or nullptr if it doesnt exist
*/
TSharedPtr<FPropertyNode> GetChildNode( int32 ChildIndex ) const ;
/**
* Gets a child of the property node that has the given array index
*
* @param ChildArrayIndex The array index we're searching for. This is not necessarily the same value as the index where the child is stored
* @param OutChildNode The child property node whose array index matches ChildArrayIndex, or nullptr if it could not be found
* @return True if a matching child property node was found, false otherwise
*/
bool GetChildNode(const int32 ChildArrayIndex, TSharedPtr<FPropertyNode>& OutChildNode) const;
/**
* Rests the value to its default value
*/
void ResetToDefault() ;
/**
* @return true if the property value differs from its default value
*/
bool DiffersFromDefault() const ;
/**
* @return true if the property is edit const and cannot be changed
*/
bool IsEditConst() const;
/**
* @return Whether or not the property is expanded
*/
bool IsExpanded() const;
/**
* Set the expanded flag
*/
void SetExpanded(bool bExpanded);
/**
* @return The label to use for displaying reset to default values
*/
FText GetResetToDefaultLabel() const;
/**
* Adds a child to the property node (container properties only)
* @return The logical index of the added child.
*/
int32 AddChild();
/**
* Removes all children from the property node (container properties only)
*/
void ClearChildren();
/**
* Inserts a child at Index (arrays only)
*/
void InsertChild( int32 Index );
/**
* Inserts a child at the index provided by the child node (arrays only)
*/
void InsertChild( TSharedPtr<FPropertyNode> ChildNodeToInsertAfter );
/**
* Duplicates the child at Index (containers only)
*/
void DuplicateChild( int32 Index );
/**
* Duplicates the provided child (containers only)
*/
void DuplicateChild( TSharedPtr<FPropertyNode> ChildNodeToDuplicate );
/**
* Deletes the child at Index (containers only)
*/
void DeleteChild( int32 Index );
/**
* Deletes the provided child (containers only)
*/
void DeleteChild( TSharedPtr<FPropertyNode> ChildNodeToDelete );
/**
* Swaps the children at FirstIndex and SecondIndex
*/
void SwapChildren( int32 FirstIndex, int32 SecondIndex );
/**
* Swaps the children provided children (containers only)
*/
void SwapChildren( TSharedPtr<FPropertyNode> FirstChildNode, TSharedPtr<FPropertyNode> SecondChildNode );
/**
* Moves the element at OriginalIndex to NewIndex
*/
void MoveElementTo(int32 OriginalIndex, int32 NewIndex);
/**
* @return true if the property node is valid
*/
bool HasValidPropertyNode() const;
/**
* @return The display name of the property
*/
FText GetDisplayName() const;
/** @return The notify hook being used */
FNotifyHook* GetNotifyHook() const { return NotifyHook; }
TSharedPtr<IPropertyUtilities> GetPropertyUtilities() const { return PropertyUtilities.Pin(); }
void ShowInvalidOperationError(const FText& ErrorText);
protected:
/** Property node used to access FProperty and address of object to change */
TWeakPtr<FPropertyNode> PropertyNode;
TWeakPtr<IPropertyUtilities> PropertyUtilities;
/** Notify hook to call when properties change */
FNotifyHook* NotifyHook;
/** Set true if a change was made with bFinished=false */
bool bInteractiveChangeInProgress;
private:
TWeakPtr<class SNotificationItem> InvalidOperationError;
};
#define DECLARE_PROPERTY_ACCESSOR( ValueType ) \
virtual FPropertyAccess::Result SetValue( ValueType const& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override; \
virtual FPropertyAccess::Result GetValue( ValueType& OutValue ) const override;
class FDetailCategoryImpl;
/**
* The base implementation of a property handle
*/
class FPropertyHandleBase : public IPropertyHandle
{
public:
FPropertyHandleBase( TSharedPtr<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
/** IPropertyHandle interface */
DECLARE_PROPERTY_ACCESSOR( bool )
DECLARE_PROPERTY_ACCESSOR( int8 )
DECLARE_PROPERTY_ACCESSOR( int16)
DECLARE_PROPERTY_ACCESSOR( int32 )
DECLARE_PROPERTY_ACCESSOR( int64 )
DECLARE_PROPERTY_ACCESSOR( uint8 )
DECLARE_PROPERTY_ACCESSOR( uint16 )
DECLARE_PROPERTY_ACCESSOR( uint32 )
DECLARE_PROPERTY_ACCESSOR( uint64 )
DECLARE_PROPERTY_ACCESSOR( float )
DECLARE_PROPERTY_ACCESSOR( double )
DECLARE_PROPERTY_ACCESSOR( FString )
DECLARE_PROPERTY_ACCESSOR( FText )
DECLARE_PROPERTY_ACCESSOR( FName )
DECLARE_PROPERTY_ACCESSOR( FVector )
DECLARE_PROPERTY_ACCESSOR( FVector2D )
DECLARE_PROPERTY_ACCESSOR( FVector4 )
DECLARE_PROPERTY_ACCESSOR( FQuat )
DECLARE_PROPERTY_ACCESSOR( FRotator )
DECLARE_PROPERTY_ACCESSOR( UObject* )
DECLARE_PROPERTY_ACCESSOR( const UObject* )
DECLARE_PROPERTY_ACCESSOR( FAssetData )
DECLARE_PROPERTY_ACCESSOR( FProperty* )
DECLARE_PROPERTY_ACCESSOR( const FProperty* )
virtual FPropertyAccess::Result GetValueData(void*& OutAddress) const override;
virtual FPropertyAccess::Result SetValue( const TCHAR* InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
/** IPropertyHandle interface */
virtual bool IsValidHandle() const override;
virtual bool IsSamePropertyNode(TSharedPtr<IPropertyHandle> OtherHandle) const override;
virtual FText GetPropertyDisplayName() const override;
virtual void SetPropertyDisplayName(FText InDisplayName) override;
virtual void ResetToDefault() override;
virtual bool DiffersFromDefault() const override;
virtual FText GetResetToDefaultLabel() const override;
virtual void MarkHiddenByCustomization() override;
virtual void MarkResetToDefaultCustomized(bool bCustomized = true) override;
virtual void ClearResetToDefaultCustomized() override;
virtual bool IsCustomized() const override;
virtual bool IsResetToDefaultCustomized() const override;
virtual FString GeneratePathToProperty() const override;
virtual TSharedRef<SWidget> CreatePropertyNameWidget( const FText& NameOverride, const FText& ToolTipOverride, bool bDisplayResetToDefault, bool bDisplayText, bool bDisplayThumbnail ) const override;
virtual TSharedRef<SWidget> CreatePropertyNameWidget(const FText& NameOverride, const FText& ToolTipOverride) const override;
virtual TSharedRef<SWidget> CreatePropertyValueWidget( bool bDisplayDefaultPropertyButtons = true ) const override;
virtual TSharedRef<SWidget> CreatePropertyValueWidgetWithCustomization( const IDetailsView* DetailsView ) override;
virtual TSharedRef<SWidget> CreateDefaultPropertyButtonWidgets() const override;
virtual void CreateDefaultPropertyCopyPasteActions(FUIAction& OutCopyAction, FUIAction& OutPasteAction) const override;
virtual bool IsEditConst() const override;
virtual bool IsEditable() const override;
virtual bool IsExpanded() const override;
virtual void SetExpanded(bool bExpanded) override;
virtual void SetOnPropertyValueChanged( const FSimpleDelegate& InOnPropertyValueChanged ) override;
virtual void SetOnPropertyValueChangedWithData(const TDelegate<void(const FPropertyChangedEvent&)>& InOnPropertyValueChanged) override;
virtual void SetOnChildPropertyValueChanged( const FSimpleDelegate& InOnPropertyValueChanged ) override;
virtual void SetOnChildPropertyValueChangedWithData( const TDelegate<void(const FPropertyChangedEvent&)>& InOnChildPropertyValueChanged ) override;
virtual void SetOnPropertyValuePreChange(const FSimpleDelegate& InOnPropertyValuePreChange) override;
virtual void SetOnChildPropertyValuePreChange(const FSimpleDelegate& InOnPropertyValuePreChange) override;
virtual void SetOnPropertyResetToDefault(const FSimpleDelegate& InOnPropertyResetToDefault) override;
virtual int32 GetIndexInArray() const override;
virtual FPropertyAccess::Result GetValueAsFormattedString( FString& OutValue, EPropertyPortFlags PortFlags = PPF_PropertyWindow ) const override;
virtual FPropertyAccess::Result GetValueAsDisplayString( FString& OutValue, EPropertyPortFlags PortFlags = PPF_PropertyWindow) const override;
virtual FPropertyAccess::Result GetValueAsFormattedText( FText& OutValue ) const override;
virtual FPropertyAccess::Result GetValueAsDisplayText( FText& OutValue ) const override;
virtual FPropertyAccess::Result SetValueFromFormattedString( const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual TSharedPtr<IPropertyHandle> GetChildHandle( uint32 ChildIndex ) const override;
virtual TSharedPtr<IPropertyHandle> GetChildHandle( FName ChildName, bool bRecurse = true ) const override;
virtual TSharedPtr<IPropertyHandle> GetParentHandle() const override;
virtual TSharedPtr<IPropertyHandle> GetKeyHandle() const override;
virtual void EnumerateRawData( const EnumerateRawDataFuncRef& InRawDataCallback ) override;
virtual void EnumerateConstRawData( const EnumerateConstRawDataFuncRef& InRawDataCallback ) const override;
virtual void AccessRawData( TArray<void*>& RawData ) override;
virtual void AccessRawData( TArray<const void*>& RawData ) const override;
virtual uint32 GetNumOuterObjects() const override;
virtual void GetOuterObjects(TArray<UObject*>& OuterObjects) const override;
virtual void GetOuterStructs( TArray<TSharedPtr<FStructOnScope>>& OutStructs ) const override;
virtual const UClass* GetOuterBaseClass() const override;
virtual void ReplaceOuterObjects(const TArray<UObject*>& OuterObjects) override;
virtual void GetOuterPackages(TArray<UPackage*>& OuterPackages) const override;
virtual FPropertyAccess::Result GetNumChildren( uint32& OutNumChildren ) const override;
virtual TSharedPtr<IPropertyHandleArray> AsArray() override { return nullptr; }
virtual TSharedPtr<IPropertyHandleSet> AsSet() override { return nullptr; }
virtual TSharedPtr<IPropertyHandleMap> AsMap() override { return nullptr; }
virtual TSharedPtr<IPropertyHandleOptional> AsOptional() override { return nullptr; }
virtual TSharedPtr<IPropertyHandleStruct> AsStruct() override { return nullptr; }
virtual const FFieldClass* GetPropertyClass() const override;
virtual FProperty* GetProperty() const override;
virtual FProperty* GetMetaDataProperty() const override;
virtual bool HasMetaData(const FName& Key) const override;
virtual const FString& GetMetaData(const FName& Key) const override;
virtual bool GetBoolMetaData(const FName& Key) const override;
virtual int32 GetIntMetaData(const FName& Key) const override;
virtual float GetFloatMetaData(const FName& Key) const override;
virtual double GetDoubleMetaData(const FName& Key) const override;
virtual UClass* GetClassMetaData(const FName& Key) const override;
virtual void SetInstanceMetaData(const FName& Key, const FString& Value) override;
virtual const FString* GetInstanceMetaData(const FName& Key) const override;
virtual const TMap<FName, FString>* GetInstanceMetaDataMap() const override;
virtual FText GetToolTipText() const override;
virtual void SetToolTipText(const FText& ToolTip) override;
virtual bool HasDocumentation() override { return false; }
virtual FString GetDocumentationLink() override { return FString(); }
virtual FString GetDocumentationExcerptName() override { return FString(); }
virtual uint8* GetValueBaseAddress( uint8* Base ) const override;
virtual int32 GetNumPerObjectValues() const override;
virtual FPropertyAccess::Result SetPerObjectValues( const TArray<FString>& InPerObjectValues, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetPerObjectValues( TArray<FString>& OutPerObjectValues ) const override;
virtual FPropertyAccess::Result SetPerObjectValue( const int32 ObjectIndex, const FString& ObjectValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetPerObjectValue( const int32 ObjectIndex, FString& OutObjectValue ) const override;
virtual bool GeneratePossibleValues(TArray< TSharedPtr<FString> >& OutOptionStrings, TArray< FText >& OutToolTips, TArray<bool>& OutRestrictedItems) override;
virtual bool GeneratePossibleValues(TArray<FString>& OutOptionStrings, TArray< FText >& OutToolTips, TArray<bool>& OutRestrictedItems, TArray<FText>* OutDisplayNames) override;
virtual FPropertyAccess::Result SetObjectValueFromSelection() override;
virtual void NotifyPreChange() override;
virtual void NotifyPostChange(EPropertyChangeType::Type ChangeType) override;
virtual void NotifyFinishedChangingProperties() override;
virtual void AddRestriction(TSharedRef<const FPropertyRestriction> Restriction) override;
virtual bool IsHidden(const FString& Value) const override;
virtual bool IsHidden(const FString& Value, TArray<FText>& OutReasons) const override;
virtual bool IsDisabled(const FString& Value) const override;
virtual bool IsDisabled(const FString& Value, TArray<FText>& OutReasons) const override;
virtual bool IsRestricted(const FString& Value) const override;
virtual bool IsRestricted(const FString& Value, TArray<FText>& OutReasons) const override;
virtual bool GenerateRestrictionToolTip(const FString& Value, FText& OutTooltip) const override;
virtual void SetIgnoreValidation(bool bInIgnore) override;
virtual TArray<TSharedPtr<IPropertyHandle>> AddChildStructure(TSharedRef<FStructOnScope> ChildStructure) override;
virtual TArray<TSharedPtr<IPropertyHandle>> AddChildStructure(TSharedRef<IStructureDataProvider> ChildStructProvider) override;
virtual void RemoveChildren() override;
virtual bool CanResetToDefault() const override;
virtual void ExecuteCustomResetToDefault(const FResetToDefaultOverride& InOnCustomResetToDefault) override;
virtual FName GetDefaultCategoryName() const override;
virtual FText GetDefaultCategoryText() const override;
virtual FStringView GetPropertyPath() const override;
virtual TSharedPtr<FPropertyPath> CreateFPropertyPath() const override;
virtual int32 GetArrayIndex() const override;
virtual void RequestRebuildChildren() override;
virtual bool IsFavorite() const override;
virtual bool IsCategoryHandle() const override;
PROPERTYEDITOR_API TSharedPtr<FPropertyNode> GetPropertyNode() const;
void OnCustomResetToDefault(const FResetToDefaultOverride& OnCustomResetToDefault);
private:
static void CopyValueToClipboard(TWeakPtr<FPropertyValueImpl> ImplementationWeak);
static void PasteValueFromClipboard(TWeakPtr<FPropertyValueImpl> ImplementationWeak);
protected:
TSharedPtr<FPropertyValueImpl> Implementation;
};
class FPropertyHandleInt : public FPropertyHandleBase
{
public:
FPropertyHandleInt( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue(int8& OutValue ) const override;
virtual FPropertyAccess::Result SetValue(const int8& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue(int16& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const int16& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(int32& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const int32& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(int64& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const int64& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(uint16& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const uint16& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(uint32& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const uint32& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(uint64& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const uint64& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
};
class FPropertyHandleFloat : public FPropertyHandleBase
{
public:
FPropertyHandleFloat( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( float& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const float& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
};
class FPropertyHandleDouble : public FPropertyHandleBase
{
public:
FPropertyHandleDouble( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( double& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const double& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
};
class FPropertyHandleBool : public FPropertyHandleBase
{
public:
FPropertyHandleBool( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( bool& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const bool& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
};
class FPropertyHandleByte : public FPropertyHandleBase
{
public:
FPropertyHandleByte( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( uint8& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const uint8& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
};
class FPropertyHandleString : public FPropertyHandleBase
{
public:
FPropertyHandleString( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook,TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( FString& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result SetValue( const TCHAR* InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( FName& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FName& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
};
class FPropertyHandleObject : public FPropertyHandleBase
{
public:
FPropertyHandleObject( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( UObject*& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( UObject* const& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( const UObject*& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const UObject* const& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( FAssetData& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FAssetData& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags, bool bSkipResolve);
virtual FPropertyAccess::Result SetObjectValueFromSelection() override;
};
// LWC_TODO: Replace with FPropertyHandleDouble once all types support it
class FPropertyHandleMixed : public FPropertyHandleBase
{
public:
FPropertyHandleMixed(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual FPropertyAccess::Result GetValue(float& OutValue) const override;
virtual FPropertyAccess::Result GetValue(double& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const float& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result SetValue(const double& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
};
class FPropertyHandleStruct : public FPropertyHandleBase, public IPropertyHandleStruct
{
public:
FPropertyHandleStruct(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual TSharedPtr<IPropertyHandleStruct> AsStruct() override;
virtual TSharedPtr<FStructOnScope> GetStructData() const override;
};
class FPropertyHandleVector : public FPropertyHandleStruct
{
public:
FPropertyHandleVector( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( FVector& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FVector& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( FVector2D& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FVector2D& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( FVector4& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FVector4& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue( FQuat& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FQuat& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result SetX(double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags);
virtual FPropertyAccess::Result SetY(double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags);
virtual FPropertyAccess::Result SetZ(double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags);
virtual FPropertyAccess::Result SetW(double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags);
private:
TArray< TSharedPtr<FPropertyHandleMixed> > VectorComponents;
};
class FPropertyHandleRotator : public FPropertyHandleStruct
{
public:
FPropertyHandleRotator( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result GetValue( FRotator& OutValue ) const override;
virtual FPropertyAccess::Result SetValue( const FRotator& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags ) override;
virtual FPropertyAccess::Result GetValue(FQuat& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const FQuat& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result SetRoll( double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags );
virtual FPropertyAccess::Result SetPitch( double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags );
virtual FPropertyAccess::Result SetYaw( double InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags );
private:
TSharedPtr<FPropertyHandleMixed> RollValue;
TSharedPtr<FPropertyHandleMixed> PitchValue;
TSharedPtr<FPropertyHandleMixed> YawValue;
};
class FPropertyHandleColor : public FPropertyHandleStruct
{
public:
FPropertyHandleColor( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
virtual FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
};
class FPropertyHandleArray : public FPropertyHandleBase, public IPropertyHandleArray
{
public:
FPropertyHandleArray( TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities );
static bool Supports( TSharedRef<FPropertyNode> PropertyNode );
/** IPropertyHandleArray interface */
virtual FPropertyHandleItemAddResult AddItem() override;
virtual FPropertyAccess::Result EmptyArray() override;
virtual FPropertyAccess::Result Insert( int32 Index ) override;
virtual FPropertyAccess::Result DuplicateItem( int32 Index ) override;
virtual FPropertyAccess::Result DeleteItem( int32 Index ) override;
virtual FPropertyAccess::Result SwapItems(int32 FirstIndex, int32 SecondIndex) override;
virtual FPropertyAccess::Result GetNumElements( uint32& OutNumItems ) const override;
virtual FDelegateHandle SetOnNumElementsChanged( const FSimpleDelegate& InOnNumElementsChanged ) override;
virtual void UnregisterOnNumElementsChanged(FDelegateHandle Handle) override;
virtual TSharedPtr<IPropertyHandleArray> AsArray() override;
virtual TSharedRef<IPropertyHandle> GetElement( int32 Index ) const override;
virtual FPropertyAccess::Result MoveElementTo(int32 OriginalIndex, int32 NewIndex) override;
virtual FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual bool IsEditable() const override;
};
class FPropertyHandleOptional : public FPropertyHandleBase, public IPropertyHandleOptional
{
public:
FPropertyHandleOptional(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
/** IPropertyHandleOptional interface */
virtual FPropertyAccess::Result GetOptionalValue(FProperty*& OutValue) override;
virtual FPropertyAccess::Result SetOptionalValue(FProperty* NewProperty, const UClass* NewObjectClass) override;
virtual FPropertyAccess::Result ClearOptionalValue() override;
virtual TSharedPtr<IPropertyHandleOptional> AsOptional() override;
virtual bool IsEditable() const override;
};
class FPropertyHandleText : public FPropertyHandleBase
{
public:
FPropertyHandleText(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook,TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual FPropertyAccess::Result GetValue(FText& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const FText& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result SetValue(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result SetValue(const TCHAR* InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
private:
FPropertyAccess::Result ImportFormattedTextString(const FString& InValue, EPropertyValueSetFlags::Type Flags);
};
class FPropertyHandleSet : public FPropertyHandleBase, public IPropertyHandleSet
{
public:
FPropertyHandleSet(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual TSharedPtr<IPropertyHandleSet> AsSet() override;
/** IPropertyHandleSet Interface */
virtual bool HasDefaultElement() override;
virtual FPropertyHandleItemAddResult AddItem() override;
virtual FPropertyAccess::Result Empty() override;
virtual FPropertyAccess::Result DeleteItem(int32 Index) override;
virtual FPropertyAccess::Result GetNumElements(uint32& OutNumElements) override;
virtual TSharedRef<IPropertyHandle> GetElement(int32 Index) const override;
virtual FPropertyAccess::Result SetValueFromFormattedString(const FString& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FDelegateHandle SetOnNumElementsChanged( const FSimpleDelegate& InOnNumElementsChanged ) override;
virtual void UnregisterOnNumElementsChanged(FDelegateHandle Handle) override;
virtual bool HasDocumentation() override { return true; }
virtual FString GetDocumentationLink() override { return FString("Engine/UI/LevelEditor/Details/Properties/Set/"); }
virtual FString GetDocumentationExcerptName() override { return FString("Sets"); }
virtual bool IsEditable() const override;
};
class FPropertyHandleMap : public FPropertyHandleBase, public IPropertyHandleMap
{
public:
FPropertyHandleMap(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual TSharedPtr<IPropertyHandleMap> AsMap() override;
/** IPropertyHandleMap Interface */
virtual bool HasDefaultKey() override;
virtual FPropertyHandleItemAddResult AddItem() override;
virtual FPropertyAccess::Result Empty() override;
virtual FPropertyAccess::Result DeleteItem(int32 Index) override;
virtual FPropertyAccess::Result GetNumElements(uint32& OutNumElements) override;
virtual TSharedRef<IPropertyHandle> GetElement(int32 Index) const override;
virtual FDelegateHandle SetOnNumElementsChanged( const FSimpleDelegate& InOnNumElementsChanged ) override;
virtual void UnregisterOnNumElementsChanged(FDelegateHandle Handle) override;
virtual bool HasDocumentation() override { return true; }
virtual FString GetDocumentationLink() override { return FString("Engine/UI/LevelEditor/Details/Properties/Map/"); }
virtual FString GetDocumentationExcerptName() override { return FString("Maps"); }
virtual bool IsEditable() const override;
private:
int32 AddItemWithKey(const FString& Value);
};
class FPropertyHandleFieldPath : public FPropertyHandleBase
{
public:
FPropertyHandleFieldPath(TSharedRef<FPropertyNode> PropertyNode, FNotifyHook* NotifyHook, TSharedPtr<IPropertyUtilities> PropertyUtilities);
static bool Supports(TSharedRef<FPropertyNode> PropertyNode);
virtual FPropertyAccess::Result GetValue(FProperty*& OutValue) const override;
virtual FPropertyAccess::Result SetValue(FProperty* const& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
virtual FPropertyAccess::Result GetValue(const FProperty*& OutValue) const override;
virtual FPropertyAccess::Result SetValue(const FProperty* const& InValue, EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::DefaultFlags) override;
};