UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DeclarativeSyntaxSupport.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 "Misc/Attribute.h"
7#include "Layout/Visibility.h"
8#include "Layout/Clipping.h"
15#include "Widgets/SNullWidget.h"
17#include "Widgets/SWidget.h"
18#include "Templates/Identity.h"
19
20class IToolTip;
21class SUserWidget;
22class SWidget;
23template<typename WidgetType> struct TSlateBaseNamedArgs;
24
37#define SNew( WidgetType, ... ) \
38 MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) <<= TYPENAME_OUTSIDE_TEMPLATE WidgetType::FArguments()
39
40
41#define SAssignNew( ExposeAs, WidgetType, ... ) \
42 MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) . Expose( ExposeAs ) <<= TYPENAME_OUTSIDE_TEMPLATE WidgetType::FArguments()
43
44#define SArgumentNew( InArgs, WidgetType, ... ) \
45 MakeTDecl<WidgetType>( #WidgetType, __FILE__, __LINE__, RequiredArgs::MakeRequiredArgs(__VA_ARGS__) ) <<= InArgs
46
47
63#define SLATE_BEGIN_ARGS( InWidgetType ) \
64 public: \
65 struct FArguments : public TSlateBaseNamedArgs<InWidgetType> \
66 { \
67 typedef FArguments WidgetArgsType; \
68 typedef InWidgetType WidgetType; \
69 FORCENOINLINE FArguments()
70
107#define SLATE_USER_ARGS( WidgetType ) \
108 public: \
109 static TSharedRef<WidgetType> New(); \
110 struct FArguments; \
111 struct FArguments : public TSlateBaseNamedArgs<WidgetType> \
112 { \
113 typedef FArguments WidgetArgsType; \
114 FORCENOINLINE FArguments()
115
116#define SLATE_END_ARGS() \
117 };
118
119
120#define SLATE_PRIVATE_ATTRIBUTE_VARIABLE( AttrType, AttrName ) \
121 TAttribute< AttrType > _##AttrName
122
123#define SLATE_PRIVATE_ATTRIBUTE_FUNCTION( AttrType, AttrName ) \
124 WidgetArgsType& AttrName( TAttribute< AttrType > InAttribute ) \
125 { \
126 _##AttrName = MoveTemp(InAttribute); \
127 return static_cast<WidgetArgsType*>(this)->Me(); \
128 } \
129 \
130 /* Bind attribute with delegate to a global function
131 * NOTE: We use a template here to avoid 'typename' issues when hosting attributes inside templated classes */ \
132 template< typename... VarTypes > \
133 WidgetArgsType& AttrName##_Static( TIdentity_T< typename TAttribute< AttrType >::FGetter::template TFuncPtr<VarTypes...> > InFunc, VarTypes... Vars ) \
134 { \
135 _##AttrName.BindStatic( InFunc, Vars... ); \
136 return static_cast<WidgetArgsType*>(this)->Me(); \
137 } \
138 \
139 /* Bind attribute with delegate to a lambda
140 * technically this works for any functor types, but lambdas are the primary use case */ \
141 WidgetArgsType& AttrName##_Lambda(TFunction< AttrType(void) >&& InFunctor) \
142 { \
143 _##AttrName.BindLambda(InFunctor); \
144 return static_cast<WidgetArgsType*>(this)->Me(); \
145 } \
146 \
147 /* Bind attribute with delegate to a raw C++ class method */ \
148 template< class UserClass, typename... VarTypes > \
149 WidgetArgsType& AttrName##_Raw( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
150 { \
151 _##AttrName.BindRaw( InUserObject, InFunc, Vars... ); \
152 return static_cast<WidgetArgsType*>(this)->Me(); \
153 } \
154 \
155 /* Bind attribute with delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \
156 template< class UserClass, typename... VarTypes > \
157 WidgetArgsType& AttrName( TSharedRef< UserClass > InUserObjectRef, typename TAttribute< AttrType >::FGetter::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
158 { \
159 _##AttrName.Bind( InUserObjectRef, InFunc, Vars... ); \
160 return static_cast<WidgetArgsType*>(this)->Me(); \
161 } \
162 \
163 /* Bind attribute with delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \
164 template< class UserClass, typename... VarTypes > \
165 WidgetArgsType& AttrName( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
166 { \
167 _##AttrName.Bind( InUserObject, InFunc, Vars... ); \
168 return static_cast<WidgetArgsType*>(this)->Me(); \
169 } \
170 \
171 /* Bind attribute with delegate to a UObject-based class method */ \
172 template< class UserClass, typename... VarTypes > \
173 WidgetArgsType& AttrName##_UObject( UserClass* InUserObject, typename TAttribute< AttrType >::FGetter::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
174 { \
175 _##AttrName.BindUObject( InUserObject, InFunc, Vars... ); \
176 return static_cast<WidgetArgsType*>(this)->Me(); \
177 } \
178
179#define SLATE_PRIVATE_ARGUMENT_VARIABLE( ArgType, ArgName ) \
180 ArgType _##ArgName
182
183#define SLATE_PRIVATE_ARGUMENT_FUNCTION( ArgType, ArgName ) \
184 WidgetArgsType& ArgName( ArgType InArg ) \
185 { \
186 _##ArgName = InArg; \
187 return static_cast<WidgetArgsType*>(this)->Me(); \
188 }
189
194#define SLATE_ATTRIBUTE( AttrType, AttrName ) \
195 SLATE_PRIVATE_ATTRIBUTE_VARIABLE( AttrType, AttrName ); \
196 SLATE_PRIVATE_ATTRIBUTE_FUNCTION( AttrType, AttrName )
197
201#define SLATE_ATTRIBUTE_DEPRECATED( AttrType, AttrName, DeprecationVersion, DeprecationMessage) \
202 SLATE_PRIVATE_ATTRIBUTE_VARIABLE( AttrType, AttrName ); \
203 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
204 SLATE_PRIVATE_ATTRIBUTE_FUNCTION( AttrType, AttrName )
205
210#define SLATE_ARGUMENT( ArgType, ArgName ) \
211 SLATE_PRIVATE_ARGUMENT_VARIABLE( ArgType, ArgName ); \
212 SLATE_PRIVATE_ARGUMENT_FUNCTION ( ArgType, ArgName )
213
217#define SLATE_ARGUMENT_DEPRECATED( ArgType, ArgName, DeprecationVersion, DeprecationMessage) \
218 SLATE_PRIVATE_ARGUMENT_VARIABLE( ArgType, ArgName ); \
219 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
220 SLATE_PRIVATE_ARGUMENT_FUNCTION ( ArgType, ArgName )
221
227#define SLATE_ARGUMENT_DEFAULT( ArgType, ArgName ) \
228 SLATE_PRIVATE_ARGUMENT_FUNCTION(ArgType, ArgName) \
229 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName)
230
231#define SLATE_PRIVATE_STYLE_ARGUMENT_VARIABLE( ArgType, ArgName ) \
232 const ArgType* _##ArgName; \
233
234#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_ARGTYPE_PTR( ArgType, ArgName ) \
235 WidgetArgsType& ArgName( const ArgType* InArg ) \
236 { \
237 _##ArgName = InArg; \
238 return static_cast<WidgetArgsType*>(this)->Me(); \
239 }
240#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_PTR( ArgType, ArgName ) \
241 WidgetArgsType& ArgName( const class USlateWidgetStyleAsset* const InSlateStyleAsset ) \
242 { \
243 _##ArgName = InSlateStyleAsset->GetStyleChecked< ArgType >(); \
244 return static_cast<WidgetArgsType*>(this)->Me(); \
245 }
246#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_WEAKPTR( ArgType, ArgName ) \
247 WidgetArgsType& ArgName( const TWeakObjectPtr< const class USlateWidgetStyleAsset >& InSlateStyleAsset ) \
248 { \
249 _##ArgName = InSlateStyleAsset.Get()->GetStyleChecked< ArgType >(); \
250 return static_cast<WidgetArgsType*>(this)->Me(); \
251 }
252#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_PTR( ArgType, ArgName ) \
253 WidgetArgsType& ArgName( const class ISlateStyle* InSlateStyle, const FName& StyleName, const ANSICHAR* Specifier = nullptr ) \
254 { \
255 check( InSlateStyle != nullptr ); \
256 _##ArgName = &InSlateStyle->GetWidgetStyle< ArgType >( StyleName, Specifier ); \
257 return static_cast<WidgetArgsType*>(this)->Me(); \
258 }
259#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_REF( ArgType, ArgName ) \
260 WidgetArgsType& ArgName( const class ISlateStyle& InSlateStyle, const FName& StyleName, const ANSICHAR* Specifier = nullptr ) \
261 { \
262 _##ArgName = &InSlateStyle.GetWidgetStyle< ArgType >( StyleName, Specifier ); \
263 return static_cast<WidgetArgsType*>(this)->Me(); \
264 }
265#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_WEAKPTR( ArgType, ArgName ) \
266 WidgetArgsType& ArgName( const TWeakObjectPtr< const class ISlateStyle >& InSlateStyle, const FName& StyleName, const ANSICHAR* Specifier = nullptr ) \
267 { \
268 _##ArgName = &InSlateStyle.Get()->GetWidgetStyle< ArgType >( StyleName, Specifier ); \
269 return static_cast<WidgetArgsType*>(this)->Me(); \
270 }
271#define SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_SHAREDPTR( ArgType, ArgName ) \
272 WidgetArgsType& ArgName( const TSharedPtr< const class ISlateStyle >& InSlateStyle, const FName& StyleName, const ANSICHAR* Specifier = nullptr ) \
273 { \
274 _##ArgName = &InSlateStyle->GetWidgetStyle< ArgType >( StyleName, Specifier ); \
275 return static_cast<WidgetArgsType*>(this)->Me(); \
276 }
277
282#define SLATE_STYLE_ARGUMENT( ArgType, ArgName ) \
283 SLATE_PRIVATE_STYLE_ARGUMENT_VARIABLE( ArgType, ArgName ); \
284 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_ARGTYPE_PTR( ArgType, ArgName ) \
285 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_PTR( ArgType, ArgName ) \
286 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_WEAKPTR( ArgType, ArgName ) \
287 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_PTR( ArgType, ArgName ) \
288 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_REF( ArgType, ArgName ) \
289 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_WEAKPTR( ArgType, ArgName ) \
290 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_SHAREDPTR( ArgType, ArgName )
291
295#define SLATE_STYLE_ARGUMENT_DEPRECATED( ArgType, ArgName, DeprecationVersion, DeprecationMessage) \
296 SLATE_PRIVATE_STYLE_ARGUMENT_VARIABLE( ArgType, ArgName ); \
297 PRAGMA_DISABLE_DEPRECATION_WARNINGS\
298 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
299 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_ARGTYPE_PTR( ArgType, ArgName ) \
300 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
301 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_PTR( ArgType, ArgName ) \
302 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
303 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_WIDGETSTYLE_WEAKPTR( ArgType, ArgName ) \
304 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
305 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_PTR( ArgType, ArgName ) \
306 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
307 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_REF( ArgType, ArgName ) \
308 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
309 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_WEAKPTR( ArgType, ArgName ) \
310 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
311 SLATE_PRIVATE_STYLE_ARGUMENT_FUNCTION_SLATESTYLE_SHAREDPTR( ArgType, ArgName )\
312 PRAGMA_ENABLE_DEPRECATION_WARNINGS
313
318#define SLATE_SUPPORTS_SLOT( SlotType ) \
319 UE_DEPRECATED(5.0, "SLATE_SUPPORTS_SLOT is deprecated. Use SLATE_SLOT_ARGUMENT") \
320 TArray< SlotType* > Slots; \
321 WidgetArgsType& operator + (SlotType& SlotToAdd) \
322 { \
323 Slots.Add( &SlotToAdd ); \
324 return static_cast<WidgetArgsType*>(this)->Me(); \
325 }
326
327
332#define SLATE_SUPPORTS_SLOT_WITH_ARGS( SlotType ) \
333 TArray< SlotType* > Slots; \
334 WidgetArgsType& operator + (const typename SlotType::FArguments& ArgumentsForNewSlot) \
335 { \
336 Slots.Add( new SlotType( ArgumentsForNewSlot ) ); \
337 return static_cast<WidgetArgsType*>(this)->Me(); \
338 }
340
341#define SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType ) \
342 { \
343 using WidgetArgsType = SlotType::FSlotArguments; \
344 using SlotParentType::FSlotArguments::FSlotArguments;
345
350#define SLATE_SLOT_ARGUMENT( SlotType, SlotName ) \
351 TArray<typename SlotType::FSlotArguments> _##SlotName; \
352 WidgetArgsType& operator + (typename SlotType::FSlotArguments& SlotToAdd) \
353 { \
354 _##SlotName.Add( MoveTemp(SlotToAdd) ); \
355 return static_cast<WidgetArgsType*>(this)->Me(); \
356 } \
357 WidgetArgsType& operator + (typename SlotType::FSlotArguments&& SlotToAdd) \
358 { \
359 _##SlotName.Add( MoveTemp(SlotToAdd) ); \
360 return static_cast<WidgetArgsType*>(this)->Me(); \
362
363#define SLATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType ) \
364 public: \
365 struct FSlotArguments : public SlotParentType::FSlotArguments \
366 SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType )
367
368#define SLATE_SLOT_BEGIN_ARGS_OneMixin( SlotType, SlotParentType, Mixin1 ) \
369 public: \
370 struct FSlotArguments : public SlotParentType::FSlotArguments, public Mixin1::FSlotArgumentsMixin \
371 SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType )
372
373#define SLATE_SLOT_BEGIN_ARGS_TwoMixins( SlotType, SlotParentType, Mixin1, Mixin2 ) \
374 public: \
375 struct FSlotArguments : public SlotParentType::FSlotArguments, public Mixin1::FSlotArgumentsMixin, public Mixin2::FSlotArgumentsMixin \
376 SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType )
377
378#define SLATE_SLOT_BEGIN_ARGS_ThreeMixins( SlotType, SlotParentType, Mixin1, Mixin2, Mixin3 ) \
379 public: \
380 struct FSlotArguments : public SlotParentType::FSlotArguments, public Mixin1::FSlotArgumentsMixin, public Mixin2::FSlotArgumentsMixin, public Mixin3::FSlotArgumentsMixin \
381 SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType )
382
383#define SLATE_SLOT_BEGIN_ARGS_FourMixins( SlotType, SlotParentType, Mixin1, Mixin2, Mixin3, Mixin4 ) \
384 public: \
385 struct FSlotArguments : public SlotParentType::FSlotArguments, public Mixin1::FSlotArgumentsMixin, public Mixin2::FSlotArgumentsMixin, public Mixin3::FSlotArgumentsMixin, public Mixin4::FSlotArgumentsMixin \
386 SLATE_PRIVATE_SLOT_BEGIN_ARGS( SlotType, SlotParentType )
387
388#define SLATE_SLOT_END_ARGS() \
389 };
390
401};
402
403
414template<class DeclarationType>
425 return OwnerDeclaration;
430};
431
432
439#define SLATE_NAMED_SLOT( DeclarationType, SlotName ) \
440 NamedSlotProperty< DeclarationType > SlotName() \
441 { \
442 return NamedSlotProperty< DeclarationType >( *this, _##SlotName ); \
443 } \
444 TAlwaysValidWidget _##SlotName; \
445
446#define SLATE_DEFAULT_SLOT( DeclarationType, SlotName ) \
447 SLATE_NAMED_SLOT(DeclarationType, SlotName) ; \
448 DeclarationType & operator[]( const TSharedRef<SWidget>& InChild ) \
449 { \
450 _##SlotName.Widget = InChild; \
451 return static_cast<WidgetArgsType*>(this)->Me(); \
452 }
453
454
460#define SLATE_EVENT( DelegateName, EventName ) \
461 WidgetArgsType& EventName( const DelegateName& InDelegate ) \
462 { \
463 _##EventName = InDelegate; \
464 return static_cast<WidgetArgsType*>(this)->Me(); \
465 } \
466 \
467 WidgetArgsType& EventName( DelegateName&& InDelegate ) \
468 { \
469 _##EventName = MoveTemp(InDelegate); \
470 return static_cast<WidgetArgsType*>(this)->Me(); \
471 } \
472 \
473 /* Set event delegate to a global function */ \
474 /* NOTE: We use a template here to avoid 'typename' issues when hosting attributes inside templated classes */ \
475 template< typename StaticFuncPtr, typename... VarTypes > \
476 WidgetArgsType& EventName##_Static( StaticFuncPtr InFunc, VarTypes... Vars ) \
477 { \
478 _##EventName.BindStatic( InFunc, Vars... ); \
479 return static_cast<WidgetArgsType*>(this)->Me(); \
480 } \
481 \
482 /* Set event delegate to a lambda
483 * technically this works for any functor types, but lambdas are the primary use case */ \
484 template<typename FunctorType, typename... VarTypes> \
485 WidgetArgsType& EventName##_Lambda(FunctorType&& InFunctor, VarTypes... Vars) \
486 { \
487 _##EventName.BindLambda( Forward<FunctorType>(InFunctor), Vars... ); \
488 return static_cast<WidgetArgsType*>(this)->Me(); \
489 } \
490 \
491 /* Set event delegate to a raw C++ class method */ \
492 template< class UserClass, typename... VarTypes > \
493 WidgetArgsType& EventName##_Raw( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
494 { \
495 _##EventName.BindRaw( InUserObject, InFunc, Vars... ); \
496 return static_cast<WidgetArgsType*>(this)->Me(); \
497 } \
498 template< class UserClass, typename... VarTypes > \
499 WidgetArgsType& EventName##_Raw( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
500 { \
501 _##EventName.BindRaw( InUserObject, InFunc, Vars... ); \
502 return static_cast<WidgetArgsType*>(this)->Me(); \
503 } \
504 \
505 /* Set event delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \
506 template< class UserClass, typename... VarTypes > \
507 WidgetArgsType& EventName( TSharedRef< UserClass > InUserObjectRef, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
508 { \
509 _##EventName.BindSP( InUserObjectRef, InFunc, Vars... ); \
510 return static_cast<WidgetArgsType*>(this)->Me(); \
511 } \
512 template< class UserClass, typename... VarTypes > \
513 WidgetArgsType& EventName( TSharedRef< UserClass > InUserObjectRef, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
514 { \
515 _##EventName.BindSP( InUserObjectRef, InFunc, Vars... ); \
516 return static_cast<WidgetArgsType*>(this)->Me(); \
517 } \
518 \
519 /* Set event delegate to a shared pointer-based class method. Slate mostly uses shared pointers so we use an overload for this type of binding. */ \
520 template< class UserClass, typename... VarTypes > \
521 WidgetArgsType& EventName( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
522 { \
523 _##EventName.BindSP( InUserObject, InFunc, Vars... ); \
524 return static_cast<WidgetArgsType*>(this)->Me(); \
525 } \
526 template< class UserClass, typename... VarTypes > \
527 WidgetArgsType& EventName( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
528 { \
529 _##EventName.BindSP( InUserObject, InFunc, Vars... ); \
530 return static_cast<WidgetArgsType*>(this)->Me(); \
531 } \
532 \
533 /* Set event delegate to a UObject-based class method */ \
534 template< class UserClass, typename... VarTypes > \
535 WidgetArgsType& EventName##_UObject( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
536 { \
537 _##EventName.BindUObject( InUserObject, InFunc, Vars... ); \
538 return static_cast<WidgetArgsType*>(this)->Me(); \
539 } \
540 template< class UserClass, typename... VarTypes > \
541 WidgetArgsType& EventName##_UObject( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
542 { \
543 _##EventName.BindUObject( InUserObject, InFunc, Vars... ); \
544 return static_cast<WidgetArgsType*>(this)->Me(); \
545 } \
547 DelegateName _##EventName; \
548
549#define SLATE_EVENT_DEPRECATED( DeprecationVersion, DeprecationMessage, DelegateName, EventName, UpgradedEventName, UpgradeFuncName) \
550 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
551 WidgetArgsType& EventName( const DelegateName& InDeprecatedDelegate ) \
552 { \
553 if (InDeprecatedDelegate.IsBound()) \
554 { \
555 _##UpgradedEventName = UpgradeFuncName(InDeprecatedDelegate); \
556 } \
557 return static_cast<WidgetArgsType*>(this)->Me(); \
558 } \
559 \
560 template <typename StaticFuncPtr, typename... VarTypes> \
561 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
562 WidgetArgsType& EventName##_Static( StaticFuncPtr InFunc, VarTypes... Vars ) \
563 { \
564 if (InFunc) \
565 { \
566 DelegateName DeprecatedDelegate = DelegateName::CreateStatic(InFunc, Vars...); \
567 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
568 } \
569 return static_cast<WidgetArgsType*>(this)->Me(); \
570 } \
571 \
572 template <typename FunctorType, typename... VarTypes> \
573 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
574 WidgetArgsType& EventName##_Lambda(FunctorType&& InFunctor, VarTypes... Vars) \
575 { \
576 DelegateName DeprecatedDelegate = DelegateName::CreateLambda(Forward<FunctorType>(InFunctor), Vars...); \
577 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
578 return static_cast<WidgetArgsType*>(this)->Me(); \
579 } \
580 \
581 template <typename UserClass, typename... VarTypes> \
582 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
583 WidgetArgsType& EventName##_Raw( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
584 { \
585 DelegateName DeprecatedDelegate = DelegateName::CreateRaw(InUserObject, InFunc, Vars...); \
586 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
587 return static_cast<WidgetArgsType*>(this)->Me(); \
588 } \
589 \
590 template <typename UserClass, typename... VarTypes> \
591 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
592 WidgetArgsType& EventName##_Raw( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
593 { \
594 DelegateName DeprecatedDelegate = DelegateName::CreateRaw(InUserObject, InFunc, Vars...); \
595 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
596 return static_cast<WidgetArgsType*>(this)->Me(); \
597 } \
598 \
599 template <typename UserClass, typename... VarTypes> \
600 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
601 WidgetArgsType& EventName( TSharedRef< UserClass > InUserObjectRef, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
602 { \
603 DelegateName DeprecatedDelegate = DelegateName::CreateSP(InUserObjectRef, InFunc, Vars...); \
604 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
605 return static_cast<WidgetArgsType*>(this)->Me(); \
606 } \
607 \
608 template <typename UserClass, typename... VarTypes> \
609 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
610 WidgetArgsType& EventName( TSharedRef< UserClass > InUserObjectRef, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
611 { \
612 DelegateName DeprecatedDelegate = DelegateName::CreateSP(InUserObjectRef, InFunc, Vars...); \
613 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
614 return static_cast<WidgetArgsType*>(this)->Me(); \
615 } \
616 \
617 template <typename UserClass, typename... VarTypes> \
618 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
619 WidgetArgsType& EventName( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
620 { \
621 DelegateName DeprecatedDelegate = DelegateName::CreateSP(InUserObject, InFunc, Vars...); \
622 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
623 return static_cast<WidgetArgsType*>(this)->Me(); \
624 } \
625 \
626 template <typename UserClass, typename... VarTypes> \
627 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
628 WidgetArgsType& EventName( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
629 { \
630 DelegateName DeprecatedDelegate = DelegateName::CreateSP(InUserObject, InFunc, Vars...); \
631 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
632 return static_cast<WidgetArgsType*>(this)->Me(); \
633 } \
634 \
635 template <typename UserClass, typename... VarTypes> \
636 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
637 WidgetArgsType& EventName##_UObject( UserClass* InUserObject, typename DelegateName::template TMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
638 { \
639 DelegateName DeprecatedDelegate = DelegateName::CreateUObject(InUserObject, InFunc, Vars...); \
640 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
641 return static_cast<WidgetArgsType*>(this)->Me(); \
642 } \
643 \
644 template <typename UserClass, typename... VarTypes> \
645 UE_DEPRECATED(DeprecationVersion, DeprecationMessage) \
646 WidgetArgsType& EventName##_UObject( UserClass* InUserObject, typename DelegateName::template TConstMethodPtr< UserClass, VarTypes... > InFunc, VarTypes... Vars ) \
647 { \
648 DelegateName DeprecatedDelegate = DelegateName::CreateUObject(InUserObject, InFunc, Vars...); \
649 _##UpgradedEventName = UpgradeFuncName(DeprecatedDelegate); \
650 return static_cast<WidgetArgsType*>(this)->Me(); \
651 } \
652
678};
679
682template<typename InWidgetType>
684{
685 typedef InWidgetType WidgetType;
686 typedef typename WidgetType::FArguments WidgetArgsType;
687
691 SLATE_PRIVATE_ATTRIBUTE_FUNCTION(bool, IsEnabled)
693 SLATE_PRIVATE_ARGUMENT_FUNCTION(bool, ForceVolatile)
697 SLATE_PRIVATE_ARGUMENT_FUNCTION(float, RenderOpacity)
699 SLATE_PRIVATE_ATTRIBUTE_FUNCTION(FVector2D, RenderTransformPivot)
706 {
707 return *(static_cast<WidgetArgsType*>(this));
714 return Me();
715 }
718 template<typename MetaDataType, typename Arg0Type>
720 {
722 return Me();
723 }
726 template<typename MetaDataType, typename Arg0Type, typename Arg1Type>
728 {
730 return Me();
732};
734namespace RequiredArgs
736 struct T0RequiredArgs
737 {
739 {
741
742 template<class WidgetType>
743 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
744 {
745 // YOUR WIDGET MUST IMPLEMENT void Construct(const FArguments& InArgs)
746 OnWidget->Construct(WithNamedArgs);
747 }
748 };
749
750 template<typename Arg0Type>
751 struct T1RequiredArgs
752 {
754 : Arg0(InArg0)
755 {
757
758 template<class WidgetType>
759 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
760 {
761 // YOUR WIDGET MUST IMPLEMENT void Construct(const FArguments& InArgs)
763 }
764
765 Arg0Type& Arg0;
766 };
767
768 template<typename Arg0Type, typename Arg1Type>
769 struct T2RequiredArgs
770 {
771 T2RequiredArgs(Arg0Type&& InArg0, Arg1Type&& InArg1)
772 : Arg0(InArg0)
773 , Arg1(InArg1)
774 {
776
777 template<class WidgetType>
778 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
779 {
780 // YOUR WIDGET MUST IMPLEMENT Construct(const FArguments& InArgs)
783
784 Arg0Type& Arg0;
785 Arg1Type& Arg1;
786 };
787
788 template<typename Arg0Type, typename Arg1Type, typename Arg2Type>
789 struct T3RequiredArgs
790 {
792 : Arg0(InArg0)
793 , Arg1(InArg1)
794 , Arg2(InArg2)
795 {
797
798 template<class WidgetType>
799 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
800 {
801 // YOUR WIDGET MUST IMPLEMENT Construct(const FArguments& InArgs)
805 Arg0Type& Arg0;
806 Arg1Type& Arg1;
807 Arg2Type& Arg2;
808 };
809
810 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type>
811 struct T4RequiredArgs
812 {
814 : Arg0(InArg0)
815 , Arg1(InArg1)
816 , Arg2(InArg2)
817 , Arg3(InArg3)
818 {
820
821 template<class WidgetType>
822 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
823 {
824 // YOUR WIDGET MUST IMPLEMENT Construct(const FArguments& InArgs)
829 Arg1Type& Arg1;
830 Arg2Type& Arg2;
831 Arg3Type& Arg3;
832 };
833
834 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type>
835 struct T5RequiredArgs
836 {
838 : Arg0(InArg0)
839 , Arg1(InArg1)
840 , Arg2(InArg2)
841 , Arg3(InArg3)
842 , Arg4(InArg4)
843 {
845
846 template<class WidgetType>
847 void CallConstruct(WidgetType* OnWidget, const typename WidgetType::FArguments& WithNamedArgs) const
848 {
849 // YOUR WIDGET MUST IMPLEMENT Construct(const FArguments& InArgs)
854 Arg1Type& Arg1;
855 Arg2Type& Arg2;
856 Arg3Type& Arg3;
858 };
859
860 FORCEINLINE T0RequiredArgs MakeRequiredArgs()
861 {
862 return T0RequiredArgs();
864
865 template<typename Arg0Type>
867 {
870
871 template<typename Arg0Type, typename Arg1Type>
873 {
876
877 template<typename Arg0Type, typename Arg1Type, typename Arg2Type>
879 {
882
883 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type>
885 {
888
889 template<typename Arg0Type, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Arg4Type>
891 {
893 }
894}
895
896
906template<class WidgetType, typename RequiredArgsPayloadType>
907struct TSlateDecl
908{
911 {
912 if constexpr (std::is_base_of_v<SUserWidget, WidgetType>)
913 {
919 _Widget = WidgetType::New();
920 }
921 else
922 {
925 }
926
927 _Widget->SetDebugInfo(InType, InFile, OnLine, sizeof(WidgetType));
928
929#if UE_SLATE_WITH_DYNAMIC_INVALIDATION
931#endif
932 }
933
938 template<class ExposeAsWidgetType>
940 {
941 // Can't move out _Widget here because operator<<= needs it
943 return MoveTemp(*this);
944 }
945
950 template<class ExposeAsWidgetType>
952 {
953 // Can't move out _Widget here because operator<<= needs it
955 return MoveTemp(*this);
956 }
957
962 template<class ExposeAsWidgetType>
964 {
965 // Can't move out _Widget here because operator<<= needs it
967 return MoveTemp(*this);
968 }
969
977 TSharedRef<WidgetType> operator<<=( const typename WidgetType::FArguments& InArgs ) &&
978 {
979 _Widget->SWidgetConstruct(InArgs);
980 _RequiredArgs.CallConstruct(_Widget.Get(), InArgs);
981 _Widget->CacheVolatility();
982 _Widget->bIsDeclarativeSyntaxConstructionCompleted = true;
983
986
989};
991
992template<typename WidgetType, typename RequiredArgsPayloadType>
994{
997}
#define FORCEINLINE
Definition AndroidPlatform.h:140
EWidgetClipping
Definition Clipping.h:20
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
TSlateDecl< WidgetType, RequiredArgsPayloadType > MakeTDecl(const ANSICHAR *InType, const ANSICHAR *InFile, int32 OnLine, RequiredArgsPayloadType &&InRequiredArgs)
Definition DeclarativeSyntaxSupport.h:990
#define SLATE_PRIVATE_ATTRIBUTE_FUNCTION(AttrType, AttrName)
Definition DeclarativeSyntaxSupport.h:123
#define SLATE_PRIVATE_ATTRIBUTE_VARIABLE(AttrType, AttrName)
Definition DeclarativeSyntaxSupport.h:120
#define SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName)
Definition DeclarativeSyntaxSupport.h:177
#define SLATE_PRIVATE_ARGUMENT_FUNCTION(ArgType, ArgName)
Definition DeclarativeSyntaxSupport.h:181
EFlowDirectionPreference
Definition FlowDirection.h:30
#define LLM_SCOPE_BYTAG(...)
Definition LowLevelMemTracker.h:1099
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
EWidgetPixelSnapping
Definition WidgetPixelSnapping.h:15
Definition NameTypes.h:617
Definition Text.h:385
Definition IToolTip.h:12
static SLATECORE_API TSharedRef< class SWidget > NullWidget
Definition SNullWidget.h:22
Definition SUserWidget.h:59
Definition SWidget.h:165
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT TWeakPtr< ObjectType, Mode > ToWeakPtr() const
Definition SharedPointer.h:1055
UE_FORCEINLINE_HINT ObjectType * Get() const
Definition SharedPointer.h:1065
TSharedRef< ObjectType, Mode > ToSharedRef() const &
Definition SharedPointer.h:1028
Definition SharedPointer.h:153
Definition SharedPointer.h:1295
Definition DeclarativeSyntaxSupport.h:732
FORCEINLINE T0RequiredArgs MakeRequiredArgs()
Definition DeclarativeSyntaxSupport.h:857
Definition Visibility.h:12
static SLATECORE_API const EVisibility Visible
Definition Visibility.h:14
Definition DeclarativeSyntaxSupport.h:654
TArray< TSharedRef< ISlateMetaData > > MetaData
Definition DeclarativeSyntaxSupport.h:674
SLATE_PRIVATE_ARGUMENT_VARIABLE(EWidgetClipping, Clipping)
SLATE_PRIVATE_ARGUMENT_VARIABLE(float, RenderOpacity)
SLATE_PRIVATE_ATTRIBUTE_VARIABLE(EVisibility, Visibility)
SLATE_PRIVATE_ARGUMENT_VARIABLE(EFlowDirectionPreference, FlowDirectionPreference)
SLATE_PRIVATE_ATTRIBUTE_VARIABLE(FText, AccessibleText)
FSlateBaseNamedArgs()=default
SLATE_PRIVATE_ATTRIBUTE_VARIABLE(bool, IsEnabled)
SLATE_PRIVATE_ARGUMENT_VARIABLE(FName, Tag)
Definition DeclarativeSyntaxSupport.h:414
DeclarationType & operator[](const TSharedRef< SWidget > &InChild)
Definition DeclarativeSyntaxSupport.h:420
TAlwaysValidWidget & SlotContent
Definition DeclarativeSyntaxSupport.h:427
DeclarationType & OwnerDeclaration
Definition DeclarativeSyntaxSupport.h:426
Definition DeclarativeSyntaxSupport.h:734
T0RequiredArgs()
Definition DeclarativeSyntaxSupport.h:735
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:740
Definition DeclarativeSyntaxSupport.h:749
Arg0Type & Arg0
Definition DeclarativeSyntaxSupport.h:762
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:756
Definition DeclarativeSyntaxSupport.h:767
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:775
Arg1Type & Arg1
Definition DeclarativeSyntaxSupport.h:782
Arg0Type & Arg0
Definition DeclarativeSyntaxSupport.h:781
Definition DeclarativeSyntaxSupport.h:787
Arg2Type & Arg2
Definition DeclarativeSyntaxSupport.h:804
Arg0Type & Arg0
Definition DeclarativeSyntaxSupport.h:802
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:796
Arg1Type & Arg1
Definition DeclarativeSyntaxSupport.h:803
Definition DeclarativeSyntaxSupport.h:809
Arg1Type & Arg1
Definition DeclarativeSyntaxSupport.h:826
Arg2Type & Arg2
Definition DeclarativeSyntaxSupport.h:827
Arg0Type & Arg0
Definition DeclarativeSyntaxSupport.h:825
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:819
Arg3Type & Arg3
Definition DeclarativeSyntaxSupport.h:828
Definition DeclarativeSyntaxSupport.h:833
Arg1Type & Arg1
Definition DeclarativeSyntaxSupport.h:851
void CallConstruct(WidgetType *OnWidget, const typename WidgetType::FArguments &WithNamedArgs) const
Definition DeclarativeSyntaxSupport.h:844
Arg3Type & Arg3
Definition DeclarativeSyntaxSupport.h:853
Arg2Type & Arg2
Definition DeclarativeSyntaxSupport.h:852
Arg0Type & Arg0
Definition DeclarativeSyntaxSupport.h:850
Arg4Type & Arg4
Definition DeclarativeSyntaxSupport.h:854
Definition DeclarativeSyntaxSupport.h:392
TAlwaysValidWidget()
Definition DeclarativeSyntaxSupport.h:393
TSharedRef< SWidget > Widget
Definition DeclarativeSyntaxSupport.h:398
Definition Optional.h:131
Definition DeclarativeSyntaxSupport.h:681
WidgetArgsType & Me()
Definition DeclarativeSyntaxSupport.h:702
InWidgetType WidgetType
Definition DeclarativeSyntaxSupport.h:682
WidgetArgsType & AddMetaData(TSharedRef< ISlateMetaData > InMetaData)
Definition DeclarativeSyntaxSupport.h:708
WidgetType::FArguments WidgetArgsType
Definition DeclarativeSyntaxSupport.h:683
Definition DeclarativeSyntaxSupport.h:905
TSharedRef< WidgetType > operator<<=(const typename WidgetType::FArguments &InArgs) &&
Definition DeclarativeSyntaxSupport.h:974
RequiredArgsPayloadType & _RequiredArgs
Definition DeclarativeSyntaxSupport.h:985
TSlateDecl && Expose(TSharedPtr< ExposeAsWidgetType > &OutVarToInit) &&
Definition DeclarativeSyntaxSupport.h:936
TSharedPtr< WidgetType > _Widget
Definition DeclarativeSyntaxSupport.h:984
static constexpr bool SupportsInvalidation()
Definition SWidget.h:71
static CORE_API const TVector2< double > ZeroVector
Definition Vector2D.h:63