18 template<
typename ContainerType,
typename InObjectType,
typename InInval
idationReasonPredicate,
typename InComparePredicateType, ESlateAttributeType InAttributeType>
22 template<
typename AttributeMemberType>
33 static_assert(std::is_same<ContainerType, SWidget>::value || std::is_same<ContainerType, ISlateAttributeContainer>::value,
"The SlateAttribute container is not supported.");
43#if UE_SLATE_WITH_MEMBER_ATTRIBUTE_DEBUGGING
45 TEXT(
"The Owning Widget is not the same as used at construction. This will cause bad memory access."));
49 void VerifyOwningWidget(
const ISlateAttributeContainer&
Widget)
const
53 void VerifyNan()
const
55#if UE_SLATE_WITH_ATTRIBUTE_NAN_DIAGNOSTIC
56 if constexpr (std::is_same<float, InObjectType>::value)
58 ensureMsgf(FMath::IsFinite(
Value),
TEXT(
"Value contains a NaN. Initialize your float properly"));
60 else if constexpr (std::is_same<double, InObjectType>::value)
62 ensureMsgf(FMath::IsFinite(
Value),
TEXT(
"Value contains a NaN. Initialize your double properly"));
64 else if constexpr (std::is_same<FVector2f, InObjectType>::value)
66 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector2f properly (see FVector2f::EForceInit)"));
68 else if constexpr (std::is_same<FVector2d, InObjectType>::value)
70 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector2d properly (see FVector2d::EForceInit)"));
72 else if constexpr (std::is_same<FVector3f, InObjectType>::value)
74 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector3f properly (see FVector3f::EForceInit)"));
76 else if constexpr (std::is_same<FVector3d, InObjectType>::value)
78 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector3d properly (see FVector3d::EForceInit)"));
80 else if constexpr (std::is_same<FVector4f, InObjectType>::value)
82 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector4f properly"));
84 else if constexpr (std::is_same<FVector4d, InObjectType>::value)
86 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FVector4d properly"));
88 else if constexpr (std::is_same<FLinearColor, InObjectType>::value)
92 else if constexpr (std::is_same<FRotator, InObjectType>::value)
94 ensureMsgf(!
Value.ContainsNaN(),
TEXT(
"Value contains a NaN. Initialize your FRotator properly (see FRotator::EForceInit)"));
100#if UE_SLATE_WITH_MEMBER_ATTRIBUTE_DEBUGGING
161 :
Value(InitialValue)
167 if (Getter.IsBound())
169 ConstructWrapper(
Widget, Getter);
180 if (Getter.IsBound())
182 ConstructWrapper(
Widget, Getter);
187 :
Value(InitialValue)
193 if (Getter.IsBound())
206 if (Getter.IsBound())
248 VerifyOwningWidget(
Widget);
259 VerifyOwningWidget(
Widget);
277 VerifyOwningWidget(
Widget);
297 VerifyOwningWidget(
Widget);
298 if (Getter.IsBound())
300 AssignBinding(
Widget, Getter);
315 VerifyOwningWidget(
Widget);
316 if (Getter.IsBound())
352 VerifyOwningWidget(
Widget);
370 VerifyOwningWidget(
Widget);
388 VerifyOwningWidget(
Widget);
405 VerifyOwningWidget(
Widget);
422 VerifyOwningWidget(
Widget);
439 VerifyOwningWidget(
Widget);
460 VerifyOwningWidget(
Widget);
478 VerifyOwningWidget(
Widget);
485 VerifyOwningWidget(
Widget);
502 VerifyOwningWidget(
Widget);
537 ConstructWrapper(
Widget, Getter, Actions);
555 template<
typename SlateAttributeType>
556 class FSlateAttributeGetterWrapper final :
public ISlateAttributeGetter
559 using ObjectType =
typename SlateAttributeType::ObjectType;
561 using FComparePredicate =
typename SlateAttributeType::FComparePredicate;
563 FSlateAttributeGetterWrapper() =
delete;
564 FSlateAttributeGetterWrapper(
const FSlateAttributeGetterWrapper&) =
delete;
565 FSlateAttributeGetterWrapper& operator= (
const FSlateAttributeGetterWrapper&) =
delete;
566 virtual ~FSlateAttributeGetterWrapper() =
default;
580 virtual FUpdateAttributeResult UpdateAttribute(
const SWidget&
Widget)
override
582 if (Getter.IsBound())
584 ObjectType NewValue = Getter.Execute();
594 return FUpdateAttributeResult();
609 return Getter.GetHandle();
612 const FGetter& GetDelegate()
const
639#if UE_SLATE_WITH_MEMBER_ATTRIBUTE_DEBUGGING
bool ContainsNaN(const TArray< FBoneTransform > &BoneTransforms)
Definition AnimNode_SkeletalControlBase.cpp:119
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
UE::Math::TVector4< double > FVector4
Definition MathFwd.h:49
ESlateAttributeBindAction
Definition SlateAttribute.h:168
#define UE_SLATE_WITH_MEMBER_ATTRIBUTE_DEBUGGING
Definition SlateAttribute.h:14
#define UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION
Definition SlateAttribute.h:176
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
if(Failed) console_printf("Failed.\n")
Definition IDelegateInstance.h:14
Definition SlateAttributeDefinition.inl:43
Definition SlateAttributeDefinition.inl:57
Definition Attribute.h:17
static TAttribute Create(const FGetter &InGetter)
Definition Attribute.h:101
Definition UniquePtr.h:107
Definition SlateAttribute.cpp:11
ESlateAttributeType
Definition SlateAttributeDefinition.inl:27
Definition SlateAttribute.h:181
Definition SlateAttributeDefinition.inl:84
SLATECORE_API FDelegateHandle ProtectedFindGetterHandle(const SWidget &Widget, ESlateAttributeType AttributeType) const
Definition SlateAttribute.cpp:134
SLATECORE_API void ProtectedRegisterAttribute(SWidget &Widget, ESlateAttributeType AttributeType, TUniquePtr< ISlateAttributeGetter > &&Wrapper)
Definition SlateAttribute.cpp:84
SLATECORE_API void ProtectedUpdateNow(SWidget &Widget, ESlateAttributeType AttributeType)
Definition SlateAttribute.cpp:148
SLATECORE_API ISlateAttributeGetter * ProtectedFindGetter(const SWidget &Widget, ESlateAttributeType AttributeType) const
Definition SlateAttribute.cpp:120
SLATECORE_API bool ProtectedIsBound(const SWidget &Widget, ESlateAttributeType AttributeType) const
Definition SlateAttribute.cpp:106
SLATECORE_API void ProtectedUnregisterAttribute(SWidget &Widget, ESlateAttributeType AttributeType) const
Definition SlateAttribute.cpp:76
SLATECORE_API void ProtectedInvalidateWidget(SWidget &Widget, ESlateAttributeType AttributeType, EInvalidateWidgetReason InvalidationReason) const
Definition SlateAttribute.cpp:92
Definition SlateAttributeBase.inl:20
static bool IdenticalTo(const ISlateAttributeContainer &Container, const ObjectType &Lhs, const ObjectType &Rhs)
Definition SlateAttributeBase.inl:38
const ObjectType & Get() const
Definition SlateAttributeBase.inl:240
bool Assign(ContainerType &Widget, TAttribute< ObjectType > &&OtherAttribute, ObjectType &&DefaultValue, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:437
TSlateAttributeBase(ObjectType &&InValue)
Definition SlateAttributeBase.inl:124
TAttribute< ObjectType > ToAttribute(const ContainerType &Widget) const
Definition SlateAttributeBase.inl:466
TSlateAttributeBase(SWidget &Widget, const FGetter &Getter, const ObjectType &InitialValue)
Definition SlateAttributeBase.inl:160
TSlateAttributeBase(SWidget &Widget, const TAttribute< ObjectType > &Attribute, const ObjectType &InitialValue)
Definition SlateAttributeBase.inl:212
TSlateAttributeBase(const ObjectType &InValue)
Definition SlateAttributeBase.inl:115
static EInvalidateWidgetReason GetInvalidationReason(const ISlateAttributeContainer &Container)
Definition SlateAttributeBase.inl:36
TSlateAttributeBase(SWidget &Widget, ObjectType &&InValue)
Definition SlateAttributeBase.inl:151
TSlateAttributeBase()
Definition SlateAttributeBase.inl:108
TSlateAttributeBase(SWidget &Widget)
Definition SlateAttributeBase.inl:133
bool Set(ContainerType &Widget, ObjectType &&NewValue)
Definition SlateAttributeBase.inl:275
bool Set(ContainerType &Widget, const ObjectType &NewValue)
Definition SlateAttributeBase.inl:257
bool Assign(ContainerType &Widget, TAttribute< ObjectType > &&OtherAttribute, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:368
TSlateAttributeBase(SWidget &Widget, FGetter &&Getter, const ObjectType &InitialValue)
Definition SlateAttributeBase.inl:186
static bool IdenticalTo(const SWidget &Widget, const ObjectType &Lhs, const ObjectType &Rhs)
Definition SlateAttributeBase.inl:37
static constexpr bool HasDefinedInvalidationReason
Definition SlateAttributeBase.inl:31
void Unbind(ContainerType &Widget)
Definition SlateAttributeBase.inl:458
bool Assign(ContainerType &Widget, const TAttribute< ObjectType > &OtherAttribute, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:350
InObjectType ObjectType
Definition SlateAttributeBase.inl:25
bool IdenticalTo(const ContainerType &Widget, const TAttribute< ObjectType > &Other) const
Definition SlateAttributeBase.inl:500
InInvalidationReasonPredicate FInvalidationReasonPredicate
Definition SlateAttributeBase.inl:26
void Bind(ContainerType &Widget, FGetter &&Getter)
Definition SlateAttributeBase.inl:313
TSlateAttributeBase(SWidget &Widget, TAttribute< ObjectType > &&Attribute, ObjectType &&InitialValue)
Definition SlateAttributeBase.inl:225
void Bind(WidgetType &Widget, typename FGetter::template TConstMethodPtr< WidgetType > MethodPtr)
Definition SlateAttributeBase.inl:332
TSlateAttributeBase(SWidget &Widget, FGetter &&Getter, ObjectType &&InitialValue)
Definition SlateAttributeBase.inl:199
bool Assign(ContainerType &Widget, const TAttribute< ObjectType > &OtherAttribute, const ObjectType &DefaultValue, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:386
TSlateAttributeBase(SWidget &Widget, const ObjectType &InValue)
Definition SlateAttributeBase.inl:142
void Bind(ContainerType &Widget, const FGetter &Getter)
Definition SlateAttributeBase.inl:295
bool IsBound(const ContainerType &Widget) const
Definition SlateAttributeBase.inl:476
bool Assign(ContainerType &Widget, TAttribute< ObjectType > &&OtherAttribute, const ObjectType &DefaultValue, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:403
static const ESlateAttributeType AttributeType
Definition SlateAttributeBase.inl:30
void UpdateNow(ContainerType &Widget)
Definition SlateAttributeBase.inl:246
bool IdenticalTo(const ContainerType &Widget, const TSlateAttributeBase &Other) const
Definition SlateAttributeBase.inl:483
bool Assign(ContainerType &Widget, const TAttribute< ObjectType > &OtherAttribute, ObjectType &&DefaultValue, ESlateAttributeBindAction Actions=UE_SLATE_WITH_ATTRIBUTE_DEFAULT_INITIALIZATION_ACTION)
Definition SlateAttributeBase.inl:420
typename TAttribute< ObjectType >::FGetter FGetter
Definition SlateAttributeBase.inl:27
InComparePredicateType FComparePredicate
Definition SlateAttributeBase.inl:28
TSlateAttributeBase(SWidget &Widget, const FGetter &Getter, ObjectType &&InitialValue)
Definition SlateAttributeBase.inl:173
static EInvalidateWidgetReason GetInvalidationReason(const SWidget &Widget)
Definition SlateAttributeBase.inl:35
Definition SlateAttributeMember.inl:88