UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SlateAttributeMetaData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Algo/BinarySearch.h"
11
12#include <limits>
13
14class SWidget;
15
18{
21
22public:
24
28
29public:
31 static SLATECORE_API FSlateAttributeMetaData* FindMetaData(const SWidget& OwningWidget);
32
46
70 static SLATECORE_API void ApplyDelayedInvalidation(SWidget& OwningWidget);
71
72public:
74 {
75 return IndexOfAttribute(Attribute) != INDEX_NONE;
76 }
77
79 {
80 return Attributes.Num();
81 }
82
84 {
85 return AffectVisibilityCounter;
86 }
87
89 static SLATECORE_API TArray<FName> GetAttributeNames(const SWidget& OwningWidget);
90
96 friend const TCHAR* DebugSlateAttribute(const SWidget* Widget, int32 Index);
97
98private:
99 using ISlateAttributeContainer = SlateAttributePrivate::ISlateAttributeContainer;
100 using ESlateAttributeType = SlateAttributePrivate::ESlateAttributeType;
101 using ISlateAttributeGetter = SlateAttributePrivate::ISlateAttributeGetter;
102 static SLATECORE_API void RegisterAttribute(SWidget& OwningWidget, FSlateAttributeBase& Attribute, ESlateAttributeType AttributeType, TUniquePtr<ISlateAttributeGetter>&& Wrapper);
103 static SLATECORE_API void RegisterAttribute(ISlateAttributeContainer& OwningContainer, FSlateAttributeBase& Attribute, ESlateAttributeType AttributeType, TUniquePtr<ISlateAttributeGetter>&& Wrapper);
104 static SLATECORE_API bool UnregisterAttribute(SWidget& OwningWidget, const FSlateAttributeBase& Attribute);
105 static SLATECORE_API bool UnregisterAttribute(ISlateAttributeContainer& OwningContainer, const FSlateAttributeBase& Attribute);
106 static SLATECORE_API void InvalidateWidget(SWidget& OwningWidget, const FSlateAttributeBase& Attribute, ESlateAttributeType AttributeType, EInvalidateWidgetReason Reason);
107 static SLATECORE_API void InvalidateWidget(ISlateAttributeContainer& OwningContainer, const FSlateAttributeBase& Attribute, ESlateAttributeType AttributeType, EInvalidateWidgetReason Reason);
108 static SLATECORE_API void UpdateAttribute(SWidget& OwningWidget, FSlateAttributeBase& Attribute);
109 static SLATECORE_API bool IsAttributeBound(const SWidget& OwningWidget, const FSlateAttributeBase& Attribute);
110 static SLATECORE_API SlateAttributePrivate::ISlateAttributeGetter* GetAttributeGetter(const SWidget& OwningWidget, const FSlateAttributeBase& Attribute);
111 static SLATECORE_API FDelegateHandle GetAttributeGetterHandle(const SWidget& OwningWidget, const FSlateAttributeBase& Attribute);
112 static SLATECORE_API void MoveAttribute(const SWidget& OwningWidget, FSlateAttributeBase& NewAttribute, ESlateAttributeType AttributeType, const FSlateAttributeBase* PreviousAttribute);
113
114 //~ For Container
115 static SLATECORE_API void RemoveContainerWidget(SWidget& Widget, ISlateAttributeContainer& Container);
116 static SLATECORE_API void UpdateContainerSortOrder(SWidget& Widget, ISlateAttributeContainer& Container);
117
118
119private:
120 SLATECORE_API void RegisterMemberAttributeImpl(SWidget& OwningWidget, FSlateAttributeBase& Attribute, TUniquePtr<ISlateAttributeGetter>&& Getter);
121 SLATECORE_API void RegisterManagedAttributeImpl(SWidget& OwningWidget, FSlateAttributeBase& Attribute, TUniquePtr<ISlateAttributeGetter>&& Getter);
122 SLATECORE_API void RegisterContainAttributeImpl(ISlateAttributeContainer& OwningContainer, SWidget& OwningWidget, FSlateAttributeBase& Attribute, TUniquePtr<ISlateAttributeGetter>&& Getter);
123 SLATECORE_API bool UnregisterAttributeImpl(const FSlateAttributeBase& Attribute);
124 SLATECORE_API void RemoveMetaDataIfNeeded(SWidget& OwningWidget, bool bRemoved) const;
125 SLATECORE_API bool InvalidateWidgetAttribute(SWidget& OwningWidget, const FSlateAttributeBase& Attribute, EInvalidateWidgetReason Reason);
126 SLATECORE_API void UpdateAttributesImpl(SWidget& OwningWidget, EInvalidationPermission InvaldiationStyle, int32 StartIndex, int32 IndexNum);
127
128private:
129 int32 IndexOfAttribute(const FSlateAttributeBase& Attribute) const
130 {
132 return Attributes.IndexOfByPredicate([AttributePtr](const FGetterItem& Item) { return Item.Attribute == AttributePtr; });
133 }
134
135 struct FGetterItem
136 {
137 FGetterItem(const FGetterItem&) = delete;
138 FGetterItem(FGetterItem&&) = default;
139 FGetterItem& operator=(const FGetterItem&) = delete;
142 , Getter(MoveTemp(InGetter))
143 , CachedAttributeDescriptor(nullptr)
144 , SortOrder(InSortOrder)
145 , AttributeContainerOffset(0)
146 { }
149 , Getter(MoveTemp(InGetter))
150 , CachedAttributeDescriptor(InAttributeDescriptor)
151 , SortOrder(InSortOrder)
152 , AttributeContainerOffset(0)
153 { }
154
157 const FSlateAttributeDescriptor::FAttribute* CachedAttributeDescriptor;
158 uint32 SortOrder;
159 int32 AttributeContainerOffset; // to fit inside a 32b structure, save the offset of the AttributeContainer;
160
161 bool operator<(const FGetterItem& Other) const
162 {
163 // if in a container, the smaller container wins first, then the property SortOrder.
164 if (AttributeContainerOffset && Other.AttributeContainerOffset)
165 {
166 const SlateAttributePrivate::ISlateAttributeContainer* Container = GetAttributeContainer();
169 {
170 return SortOrder < Other.SortOrder;
171 }
172 else
173 {
174 return Container->GetContainerSortOrder() < OtherContainer->GetContainerSortOrder();
175 }
176 }
177 return SortOrder < Other.SortOrder;
178 }
179
181 FName GetAttributeName(const SWidget& OwningWidget) const;
182
184 const SlateAttributePrivate::ISlateAttributeContainer* GetAttributeContainer() const;
185 };
186 static_assert(sizeof(FGetterItem) <= 32, "The size of FGetterItem is bigger than expected.");
187
189 //~ There is a possibility that the widget has a CachedInvalidationReason and a parent become collapsed.
190 //~The invalidation will probably never get executed but
191 //~1. The widget is collapsed indirectly, so we do not care if it's invalidated.
192 //~2. The parent widget will clear this widget PersistentState.
194 uint8 AffectVisibilityCounter = 0;
195};
196
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
bool operator<(const FTextFormatString &LHS, const FTextFormatString &RHS)
Definition ITextFormatArgumentModifier.h:147
EInvalidateWidgetReason
Definition InvalidateWidgetReason.h:14
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IDelegateInstance.h:14
Definition NameTypes.h:617
Definition SlateAttributeMetaData.h:18
static SLATECORE_API void UpdateChildrenOnlyVisibilityAttributes(SWidget &OwningWidget, EInvalidationPermission InvalidationStyle, bool bRecursive)
Definition SlateAttributeMetaData.cpp:469
FSlateAttributeMetaData & operator=(const FSlateAttributeMetaData &)=delete
static SLATECORE_API void UpdateOnlyVisibilityAttributes(SWidget &OwningWidget, EInvalidationPermission InvalidationStyle)
Definition SlateAttributeMetaData.cpp:437
int32 GetRegisteredAttributeCount() const
Definition SlateAttributeMetaData.h:78
friend const TCHAR * DebugSlateAttribute(const SWidget *Widget, int32 Index)
Definition SlateAttributeMetaData.cpp:302
FSlateAttributeMetaData(const FSlateAttributeMetaData &)=delete
int32 GetRegisteredAffectVisibilityAttributeCount() const
Definition SlateAttributeMetaData.h:83
EInvalidationPermission
Definition SlateAttributeMetaData.h:34
static SLATECORE_API void UpdateAllAttributes(SWidget &OwningWidget, EInvalidationPermission InvalidationStyle)
Definition SlateAttributeMetaData.cpp:426
static SLATECORE_API TArray< FName > GetAttributeNames(const SWidget &OwningWidget)
Definition SlateAttributeMetaData.cpp:283
SLATE_METADATA_TYPE(FSlateAttributeMetaData, ISlateMetaData)
static SLATECORE_API FSlateAttributeMetaData * FindMetaData(const SWidget &OwningWidget)
Definition SlateAttributeMetaData.cpp:81
static SLATECORE_API void ApplyDelayedInvalidation(SWidget &OwningWidget)
Definition SlateAttributeMetaData.cpp:484
static SLATECORE_API void UpdateExceptVisibilityAttributes(SWidget &OwningWidget, EInvalidationPermission InvalidationStyle)
Definition SlateAttributeMetaData.cpp:453
bool IsBound(const FSlateAttributeBase &Attribute) const
Definition SlateAttributeMetaData.h:73
FSlateAttributeMetaData()=default
Definition ISlateMetaData.h:11
Definition SWidget.h:165
Definition SlateAttributeDefinition.inl:43
virtual uint32 GetContainerSortOrder() const =0
Definition SlateAttributeDefinition.inl:57
Definition Array.h:670
Definition UniquePtr.h:107
ESlateAttributeType
Definition SlateAttributeDefinition.inl:27
U16 Index
Definition radfft.cpp:71
Definition SlateAttribute.h:181
Definition SlateAttributeDescriptor.h:151
Definition SlateAttributeDefinition.inl:84