UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SlateAttributeDescriptor.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
7#include "CoreMinimal.h"
9#include "HAL/Platform.h"
11#include "Misc/Attribute.h"
13#include "UObject/NameTypes.h"
15#include "Templates/Identity.h"
16
17#include <type_traits>
18
20class SWidget;
21
23{
24 enum class ESlateAttributeType : uint8;
25}
26
27
32{
33public:
40 {
42
43 using Arg1Type = const class SWidget&;
44 // using "not checked" delegate to disable race detection. This delegate is used in a static (FSlateWidgetClassData) and will be destructed after the tls array used in the race detection code (which will result in a use after free).
46
47
52
55 : Reason(InReason)
56 , Getter()
57 {
58 }
59
60 template<typename... PayloadTypes>
66
67 template<typename LambdaType, typename... PayloadTypes>
73
74 bool IsBound() const
75 {
76 return Getter.IsBound();
77 }
78
80 {
81 return IsBound() ? Getter.Execute(Widget) : Reason;
82 }
83
84 private:
86 FGetter Getter;
87 };
88
89 // using "not checked" delegate to disable race detection. This delegate is used in a static (FSlateWidgetClassData) and will be destructed after the tls array used in the race detection code (which will result in a use after free).
91
102
103public:
104 struct FAttribute;
105 struct FContainer;
106 struct FContainerInitializer;
107 struct FInitializer;
108
110
112 static constexpr OffsetType DefaultSortOrder(OffsetType Offset) { return Offset * 100; }
113
114
117 {
119
120 public:
121 FContainer() = default;
122 FContainer(FName InName, OffsetType InOffset)
123 : Name(InName)
124 , Offset(InOffset)
125 {}
126
127 bool IsValid() const
128 {
129 return !Name.IsNone();
130 }
131
133 {
134 return Name;
135 }
136
138 {
139 return SortOrder;
140 }
141
142 private:
143 FName Name;
144 OffsetType Offset = 0;
145 uint32 SortOrder = 0;
146 };
147
148
151 {
155
156 public:
158 FAttribute(FName ContainerName, FName Name, OffsetType Offset, FInvalidateWidgetReasonAttribute Reason);
159
161 {
162 return Name;
163 }
164
166 {
167 return SortOrder;
168 }
169
171 {
172 return InvalidationReason.Get(Widget);
173 }
174
176 {
177 return AttributeType;
178 }
179
181 {
182 return bAffectVisibility;
183 }
184
186 {
187 OnValueChanged.ExecuteIfBound(Widget);
188 }
189
190 private:
191 FName Name;
192 OffsetType Offset;
193 FName Prerequisite;
194 FName ContainerName; // if the container IsNone, then the container is the SWidget itself.
195 uint32 SortOrder;
196 uint8 ContainerIndex;
197 FInvalidateWidgetReasonAttribute InvalidationReason;
198 FAttributeValueChangedDelegate OnValueChanged;
200 bool bAffectVisibility;
201 };
202
205 {
206 private:
210
211 public:
215
217 {
218 SLATECORE_API FAttributeEntry(FSlateAttributeDescriptor& Descriptor, FName ContainerName, int32 AttributeIndex);
219
226
235
236 private:
237 FSlateAttributeDescriptor& Descriptor;
238 FName ContainerName;
239 int32 AttributeIndex;
240 };
241
244
245 public:
250
253
254 private:
255 FSlateAttributeDescriptor& Descriptor;
256 FName ContainerName;
257 };
258
261 {
262 private:
266 FInitializer(const FInitializer&) = delete;
267 FInitializer& operator=(const FInitializer&) = delete;
268
269 public:
271
303
306
308
309 public:
314
317
319 SLATECORE_API void SetAffectVisibility(FName AttributeName, bool bAffectVisibility);
320
321 private:
322 FSlateAttributeDescriptor& Descriptor;
323 };
324
327 {
328 return Attributes.Num();
329 }
330
332 SLATECORE_API const FAttribute& GetAttributeAtIndex(int32 Index) const;
333
335 SLATECORE_API const FContainer* FindContainer(FName ContainerName) const;
336
338 SLATECORE_API const FAttribute* FindAttribute(FName AttributeName) const;
339
342
344 SLATECORE_API const FAttribute* FindContainedAttribute(FName ContainerName, OffsetType AttributeOffset) const;
345
347 SLATECORE_API int32 IndexOfContainer(FName AttributeName) const;
348
350 SLATECORE_API int32 IndexOfAttribute(FName AttributeName) const;
351
354
357
358private:
359 SLATECORE_API FAttribute* FindAttribute(FName AttributeName);
360
361 SLATECORE_API FContainerInitializer AddContainer(FName AttributeName, OffsetType Offset);
362 SLATECORE_API FInitializer::FAttributeEntry AddMemberAttribute(FName AttributeName, OffsetType Offset, FInvalidateWidgetReasonAttribute ReasonGetter);
363 SLATECORE_API FContainerInitializer::FAttributeEntry AddContainedAttribute(FName ContainerName, FName AttributeName, OffsetType Offset, FInvalidateWidgetReasonAttribute ReasonGetter);
364 SLATECORE_API void OverrideInvalidationReason(FName ContainerName, FName AttributeName, FInvalidateWidgetReasonAttribute ReasonGetter);
365 SLATECORE_API void OverrideOnValueChanged(FName ContainerName, FName AttributeName, ECallbackOverrideType OverrideType, FAttributeValueChangedDelegate Callback);
366 SLATECORE_API void SetPrerequisite(FName ContainerName, FAttribute& Attribute, FName Prerequisite);
367 SLATECORE_API void SetAffectVisibility(FAttribute& Attribute, bool bUpdate);
368
369private:
370 TArray<FAttribute> Attributes;
372};
373
380#define SLATE_ADD_MEMBER_ATTRIBUTE_DEFINITION_WITH_NAME(_Initializer, _Name, _Property, _Reason) \
381 static_assert(decltype(_Property)::AttributeType == SlateAttributePrivate::ESlateAttributeType::Member, "The SlateProperty is not a TSlateAttribute. Do not use SLATE_ADD_MEMBER_ATTRIBUTE_DEFINITION"); \
382 static_assert(!decltype(_Property)::HasDefinedInvalidationReason, "When implementing the SLATE_DECLARE_WIDGET pattern, use TSlateAttribute without the invalidation reason."); \
383 static_assert(!std::is_same<decltype(_Reason), EInvalidateWidgetReason>::value || FSlateAttributeBase::IsInvalidateWidgetReasonSupported(_Reason), "The invalidation is not supported by the SlateAttribute system."); \
384 _Initializer.AddMemberAttribute(_Name, STRUCT_OFFSET(PrivateThisType, _Property), FSlateAttributeDescriptor::FInvalidateWidgetReasonAttribute{_Reason})
385
386#define SLATE_ADD_MEMBER_ATTRIBUTE_DEFINITION(_Initializer, _Property, _Reason) \
387 SLATE_ADD_MEMBER_ATTRIBUTE_DEFINITION_WITH_NAME(_Initializer, GET_MEMBER_NAME_CHECKED(PrivateThisType, _Property), _Property, _Reason)
388
389#define SLATE_ADD_PANELCHILDREN_DEFINITION_WITH_NAME(_Initializer, _Name, _Container) \
390 _Initializer.AddContainer(_Name, STRUCT_OFFSET(PrivateThisType, _Container))
391
392#define SLATE_ADD_PANELCHILDREN_DEFINITION(_Initializer, _Container) \
393 SLATE_ADD_PANELCHILDREN_DEFINITION_WITH_NAME(_Initializer, GET_MEMBER_NAME_CHECKED(PrivateThisType, _Container), _Container)
394
395#define SLATE_ADD_SLOT_ATTRIBUTE_DEFINITION_WITH_NAME(_SlotType, _Initializer, _Name, _Property, _Reason) \
396 static_assert(decltype(_Property)::AttributeType == SlateAttributePrivate::ESlateAttributeType::Contained, "The SlateProperty is not a TSlateAttribute. Do not use SLATE_ADD_CONTAINED_ATTRIBUTE_DEFINITION"); \
397 static_assert(!decltype(_Property)::HasDefinedInvalidationReason, "When implementing the SLATE_DECLARE_WIDGET pattern, use TSlateSlotAttribute without the invalidation reason."); \
398 static_assert(!std::is_same<decltype(_Reason), EInvalidateWidgetReason>::value || FSlateAttributeBase::IsInvalidateWidgetReasonSupported(_Reason), "The invalidation is not supported by the SlateAttribute system."); \
399 \
400 _Initializer.AddContainedAttribute(_Name, ((SIZE_T)(&(((_SlotType*)(0x1000))->_Property)) - (SIZE_T)(static_cast<SlateAttributePrivate::ISlateAttributeContainer*>((_SlotType*)(0x1000)))), FSlateAttributeDescriptor::FInvalidateWidgetReasonAttribute{_Reason})
401
402#define SLATE_ADD_SLOT_ATTRIBUTE_DEFINITION(_SlotType, _Initializer, _Property, _Reason) \
403 SLATE_ADD_SLOT_ATTRIBUTE_DEFINITION_WITH_NAME(_SlotType, _Initializer, GET_MEMBER_NAME_CHECKED(_SlotType, _Property), _Property, _Reason)
404
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
typename TIdentity< T >::Type TIdentity_T
Definition Identity.h:24
EInvalidateWidgetReason
Definition InvalidateWidgetReason.h:14
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
FORCEINLINE bool IsNone() const
Definition NameTypes.h:827
Definition SlateAttributeDescriptor.h:32
SLATECORE_API const FAttribute & GetAttributeAtIndex(int32 Index) const
Definition SlateAttributeDescriptor.cpp:408
ECallbackOverrideType
Definition SlateAttributeDescriptor.h:94
TDelegate< void(SWidget &), FNotThreadSafeNotCheckedDelegateUserPolicy > FAttributeValueChangedDelegate
Definition SlateAttributeDescriptor.h:90
int32 GetAttributeNum() const
Definition SlateAttributeDescriptor.h:326
SLATECORE_API const FAttribute * FindMemberAttribute(OffsetType AttributeOffset) const
Definition SlateAttributeDescriptor.cpp:434
static constexpr OffsetType DefaultSortOrder(OffsetType Offset)
Definition SlateAttributeDescriptor.h:112
SLATECORE_API const FAttribute * FindContainedAttribute(FName ContainerName, OffsetType AttributeOffset) const
Definition SlateAttributeDescriptor.cpp:446
SLATECORE_API const FContainer * FindContainer(FName ContainerName) const
Definition SlateAttributeDescriptor.cpp:416
SLATECORE_API const FAttribute * FindAttribute(FName AttributeName) const
Definition SlateAttributeDescriptor.cpp:422
uint32 OffsetType
Definition SlateAttributeDescriptor.h:109
SLATECORE_API int32 IndexOfContainedAttribute(FName ContainerName, OffsetType AttributeOffset) const
Definition SlateAttributeDescriptor.cpp:483
SLATECORE_API int32 IndexOfContainer(FName AttributeName) const
Definition SlateAttributeDescriptor.cpp:459
SLATECORE_API int32 IndexOfMemberAttribute(OffsetType AttributeOffset) const
Definition SlateAttributeDescriptor.cpp:471
SLATECORE_API int32 IndexOfAttribute(FName AttributeName) const
Definition SlateAttributeDescriptor.cpp:465
Definition SlateControlledConstruction.h:49
Definition SWidget.h:165
Definition Array.h:670
Definition SlateAttribute.cpp:11
ESlateAttributeType
Definition SlateAttributeDefinition.inl:27
U16 Index
Definition radfft.cpp:71
Definition DelegateBase.h:179
Definition SlateAttributeDescriptor.h:151
friend FSlateAttributeDescriptor
Definition SlateAttributeDescriptor.h:152
void ExecuteOnValueChangedIfBound(SWidget &Widget) const
Definition SlateAttributeDescriptor.h:185
friend FInitializer
Definition SlateAttributeDescriptor.h:153
bool DoesAffectVisibility() const
Definition SlateAttributeDescriptor.h:180
uint32 GetSortOrder() const
Definition SlateAttributeDescriptor.h:165
friend FContainerInitializer
Definition SlateAttributeDescriptor.h:154
FName GetName() const
Definition SlateAttributeDescriptor.h:160
EInvalidateWidgetReason GetInvalidationReason(const SWidget &Widget) const
Definition SlateAttributeDescriptor.h:170
SlateAttributePrivate::ESlateAttributeType GetAttributeType() const
Definition SlateAttributeDescriptor.h:175
SLATECORE_API FAttributeEntry & OnValueChanged(FAttributeValueChangedDelegate Callback)
Definition SlateAttributeDescriptor.cpp:56
SLATECORE_API FAttributeEntry & UpdatePrerequisite(FName Prerequisite)
Definition SlateAttributeDescriptor.cpp:46
Definition SlateAttributeDescriptor.h:205
FContainerInitializer & operator=(const FContainerInitializer &)=delete
FContainerInitializer(const FContainerInitializer &)=delete
SLATECORE_API void OverrideOnValueChanged(FName AttributeName, ECallbackOverrideType OverrideType, FAttributeValueChangedDelegate Callback)
Definition SlateAttributeDescriptor.cpp:155
SLATECORE_API FAttributeEntry AddContainedAttribute(FName AttributeName, OffsetType Offset, const FInvalidateWidgetReasonAttribute &ReasonGetter)
Definition SlateAttributeDescriptor.cpp:131
SLATECORE_API void OverrideInvalidationReason(FName AttributeName, const FInvalidateWidgetReasonAttribute &Reason)
Definition SlateAttributeDescriptor.cpp:143
Definition SlateAttributeDescriptor.h:117
bool IsValid() const
Definition SlateAttributeDescriptor.h:127
FContainer(FName InName, OffsetType InOffset)
Definition SlateAttributeDescriptor.h:122
friend FInitializer
Definition SlateAttributeDescriptor.h:118
FName GetName() const
Definition SlateAttributeDescriptor.h:132
uint32 GetSortOrder() const
Definition SlateAttributeDescriptor.h:137
Definition SlateAttributeDescriptor.h:273
SLATECORE_API FAttributeEntry & UpdatePrerequisite(FName Prerequisite)
Definition SlateAttributeDescriptor.cpp:73
SLATECORE_API FAttributeEntry & AffectVisibility()
Definition SlateAttributeDescriptor.cpp:83
SLATECORE_API FAttributeEntry & OnValueChanged(FAttributeValueChangedDelegate Callback)
Definition SlateAttributeDescriptor.cpp:93
Definition SlateAttributeDescriptor.h:261
SLATECORE_API void OverrideOnValueChanged(FName AttributeName, ECallbackOverrideType OverrideType, FAttributeValueChangedDelegate Callback)
Definition SlateAttributeDescriptor.cpp:391
SLATECORE_API void OverrideInvalidationReason(FName AttributeName, const FInvalidateWidgetReasonAttribute &Reason)
Definition SlateAttributeDescriptor.cpp:379
SLATECORE_API FAttributeEntry AddMemberAttribute(FName AttributeName, OffsetType Offset, const FInvalidateWidgetReasonAttribute &ReasonGetter)
Definition SlateAttributeDescriptor.cpp:363
SLATECORE_API ~FInitializer()
Definition SlateAttributeDescriptor.cpp:175
SLATECORE_API void SetAffectVisibility(FName AttributeName, bool bAffectVisibility)
Definition SlateAttributeDescriptor.cpp:397
SLATECORE_API FContainerInitializer AddContainer(FName ContainerName, OffsetType Offset)
Definition SlateAttributeDescriptor.cpp:374
Definition SlateAttributeDescriptor.h:40
FInvalidateWidgetReasonAttribute(LambdaType &&InCallable, PayloadTypes &&... InputPayload)
Definition SlateAttributeDescriptor.h:68
FInvalidateWidgetReasonAttribute & operator=(const FInvalidateWidgetReasonAttribute &)=default
bool IsBound() const
Definition SlateAttributeDescriptor.h:74
const class SWidget & Arg1Type
Definition SlateAttributeDescriptor.h:43
FInvalidateWidgetReasonAttribute(const FInvalidateWidgetReasonAttribute &)=default
FInvalidateWidgetReasonAttribute(EInvalidateWidgetReason InReason)
Definition SlateAttributeDescriptor.h:54
FInvalidateWidgetReasonAttribute(FInvalidateWidgetReasonAttribute &&)=default
FInvalidateWidgetReasonAttribute & operator=(FInvalidateWidgetReasonAttribute &&)=default
TDelegate< EInvalidateWidgetReason(Arg1Type), FNotThreadSafeNotCheckedDelegateUserPolicy > FGetter
Definition SlateAttributeDescriptor.h:45
EInvalidateWidgetReason Get(const SWidget &Widget) const
Definition SlateAttributeDescriptor.h:79
friend FSlateAttributeDescriptor
Definition SlateAttributeDescriptor.h:41
FInvalidateWidgetReasonAttribute(TIdentity_T< typename FGetter::template TFuncPtr< PayloadTypes... > > InFuncPtr, PayloadTypes &&... InputPayload)
Definition SlateAttributeDescriptor.h:61