UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SlateUser.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "SlateScope.h"
6#include "Layout/WidgetPath.h"
7#include "GestureDetector.h"
8
9class SWidget;
10class SWindow;
11class ICursor;
13class FMenuStack;
15
18{
19public:
21
22 inline int32 GetUserIndex() const { return UserIndex; }
23 inline int32 GetVirtualUserIndex() const { return VirtualUserIndex; }
24
27
28private:
30 int32 UserIndex;
31
33 int32 VirtualUserIndex;
34};
35
40class FSlateUser : public TSharedFromThis<FSlateUser>
41{
42public:
43 SLATE_API virtual ~FSlateUser();
44
45 inline int32 GetUserIndex() const { return UserIndex; }
46 inline FPlatformUserId GetPlatformUserId() const { return PlatformUser; }
47 inline bool IsVirtualUser() const { return !Cursor.IsValid(); }
48
53
56
59
62
63 SLATE_API bool HasAnyCapture() const;
64 SLATE_API bool HasCursorCapture() const;
65 SLATE_API bool HasCapture(uint32 PointerIndex) const;
66
70
73
76 SLATE_API void ReleaseCapture(uint32 PointerIndex);
77
81
84
88
90 SLATE_API bool IsCursorVisible() const;
91
96
99
102
106
110
113 const TMap<uint32, FWeakWidgetPath>& GetWidgetsUnderPointerLastEventByIndex() const { return WidgetsUnderPointerLastEventByIndex; }
114
115 TSharedPtr<FDragDropOperation> GetDragDropContent() const { return DragDropContent; }
116 SLATE_API bool IsDragDropping() const;
119
121 SLATE_API void CloseTooltip();
123
124 const FGestureDetector& GetGestureDetector() const { return GestureDetector; }
125
127 TSharedPtr<FNavigationConfig> GetUserNavigationConfig() const { return UserNavigationConfig; }
128
132
133 inline bool HasValidFocusPath() const { return WeakFocusPath.IsValid(); }
134 inline const FWeakWidgetPath& GetWeakFocusPath() const { return WeakFocusPath; }
135
137 {
138 if (!StrongFocusPath.IsValid())
139 {
140 StrongFocusPath = WeakFocusPath.ToWidgetPathRef();
141 }
142 return StrongFocusPath.ToSharedRef();
143 }
144
147
150
151 TSharedPtr<ICursor> GetCursor() const { return Cursor; }
153 SLATE_API void UnlockCursor();
154 SLATE_API void UpdateCursor();
156 void RequestCursorQuery() { bQueryCursorRequested = true; }
157 SLATE_API void QueryCursor();
159
161
162 SLATE_API void FinishFrame();
164
166
168 SLATE_API void NotifyPointerMoveBegin(const FPointerEvent& PointerEvent);
171 SLATE_API void UpdatePointerPosition(const FPointerEvent& PointerEvent);
172
174 SLATE_API FWidgetPath DetectDrag(const FPointerEvent& PointerEvent, float DragTriggerDistance);
175 SLATE_API bool IsDetectingDrag(uint32 PointerIndex) const;
177
180
181 int32 GetFocusVersion() const { return FocusVersion; }
182 void IncrementFocusVersion() { FocusVersion++; }
183
184 SLATE_API void UpdateTooltip(const FMenuStack& MenuStack, bool bCanSpawnNewTooltip);
187
188 FGestureDetector& GetGestureDetector() { return GestureDetector; }
189
190#if PLATFORM_MAC
191 // Unclear why from existing code, but Mac seems to need to cache & restore all mouse captor paths when activating the top level window
192 const TMap<uint32, FWeakWidgetPath> GetCaptorPathsByIndex() const { return PointerCaptorPathsByIndex; }
194#endif
195
196private:
198
200 SLATE_API void UpdatePointerPosition(uint32 PointerIndex, const FVector2f& Position);
201 SLATE_API void LockCursorInternal(const FWidgetPath& WidgetPath);
202 SLATE_API TSharedRef<SWindow> GetOrCreateTooltipWindow();
203
205 int32 UserIndex = INDEX_NONE;
206
209
211 TSharedPtr<ICursor> Cursor;
212
214 double LastCursorSignificantMoveTime = 0.0;
215
217 TSharedPtr<FNavigationConfig> UserNavigationConfig;
218
220 bool bCanDrawCursor = true;
221
223 bool bNeedQueryForVisibleCursor = true;
224
226 bool bQueryCursorRequested = false;
227
232 int32 NumPendingSyntheticCursorMoves = 0;
233
235 TWeakPtr<SWindow> CursorWindowPtr;
236 TWeakPtr<SWidget> CursorWidgetPtr;
237
239 FWeakWidgetPath WeakFocusPath;
240
242 mutable TSharedPtr<FWidgetPath> StrongFocusPath;
243
246
248 bool bShowFocus = false;
249
254 int32 FocusVersion = 0;
255
257 TMap<uint32, FVector2f> PointerPositionsByIndex;
258 TMap<uint32, FVector2f> PreviousPointerPositionsByIndex;
259
261 TMap<uint32, FWeakWidgetPath> PointerCaptorPathsByIndex;
262
263 struct FDragDetectionState
264 {
265 FDragDetectionState(const FWidgetPath& PathToWidget, int32 PointerIndex, FKey DragButton, const FVector2f& StartLocation)
266 : DetectDragForWidget(PathToWidget)
267 , DragStartLocation(StartLocation)
268 , TriggerButton(DragButton)
269 , PointerIndex(PointerIndex)
270 {
271 }
272
274 FWeakWidgetPath DetectDragForWidget;
275
276 FVector2f DragStartLocation = FVector2f::ZeroVector;
277 FKey TriggerButton = EKeys::Invalid;
278 int32 PointerIndex = INDEX_NONE;
279 };
280
282 TMap<uint32, FDragDetectionState> DragStatesByPointerIndex;
283
285 TSharedPtr<FDragDropOperation> DragDropContent;
286
288 TWeakPtr<SWindow> DragDropWindowPtr;
289
291 TMap<uint32, FWeakWidgetPath> WidgetsUnderPointerLastEventByIndex;
292
294 FWeakWidgetPath LockingWidgetPath;
295
297 FSlateRect LastComputedLockBounds;
298
300 TWeakPtr<SWindow> TooltipWindowPtr;
301
302 enum class ETooltipOffsetDirection : uint8
303 {
305 Down,
306 Right
307 };
308 struct FActiveTooltipInfo
309 {
310 void Reset();
311
313 TWeakPtr<IToolTip> Tooltip;
314
316 TWeakPtr<SWidget> TooltipVisualizer;
317
319 TWeakPtr<SWidget> SourceWidget;
320
322 FVector2f DesiredLocation = FVector2f::ZeroVector;
323
325 FVector2f DesiredSize = FVector2f::ZeroVector;
326
328 double SummonTime = 0.0;
329
334 ETooltipOffsetDirection OffsetDirection = ETooltipOffsetDirection::Undetermined;
335
337 bool WasInteractive = false;
338
340 bool HasBeenPositioned = false;
341 };
342 FActiveTooltipInfo ActiveTooltipInfo;
343
344 FGestureDetector GestureDetector;
345};
@ INDEX_NONE
Definition CoreMiscDefines.h:150
constexpr FPlatformUserId PLATFORMUSERID_NONE
Definition CoreMiscDefines.h:516
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
EFocusCause
Definition Events.h:25
#define SLATE_SCOPE
Definition SlateScope.h:13
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CursorReply.h:16
Definition DragAndDrop.h:21
Definition GestureDetector.h:18
Definition MenuStack.h:73
Definition NavigationConfig.h:61
Definition SlateRect.h:26
Definition SlateUser.h:41
SLATE_API bool HasFocusedDescendants(TSharedRef< const SWidget > Widget) const
Definition SlateUser.cpp:175
void OverrideCursor(const TSharedPtr< ICursor > InCursor)
Definition SlateUser.h:158
SLATE_API bool IsWidgetUnderPointer(TSharedPtr< const SWidget > Widget, uint32 PointerIndex) const
Definition SlateUser.cpp:464
SLATE_API TSharedPtr< SWidget > GetCursorCaptor() const
Definition SlateUser.cpp:370
SLATE_API void NotifyTouchStarted(const FPointerEvent &TouchEvent)
Definition SlateUser.cpp:1038
SLATE_API FWeakWidgetPath GetWeakCursorCapturePath() const
Definition SlateUser.cpp:345
SLATE_API void NotifyPointerMoveComplete(const FPointerEvent &PointerEvent, const FWidgetPath &WidgetsUnderPointer)
Definition SlateUser.cpp:1055
SLATE_API void SetDragDropContent(TSharedRef< FDragDropOperation > InDragDropContent)
Definition SlateUser.cpp:1207
SLATE_API FWidgetPath GetCaptorPath(uint32 PointerIndex, FWeakWidgetPath::EInterruptedPathHandling::Type InterruptedPathHandling=FWeakWidgetPath::EInterruptedPathHandling::Truncate, const FPointerEvent *PointerEvent=nullptr)
Definition SlateUser.cpp:330
SLATE_API FWidgetPath GetCursorCaptorPath(FWeakWidgetPath::EInterruptedPathHandling::Type InterruptedPathHandling=FWeakWidgetPath::EInterruptedPathHandling::Truncate, const FPointerEvent *PointerEvent=nullptr)
Definition SlateUser.cpp:325
TSharedPtr< FDragDropOperation > GetDragDropContent() const
Definition SlateUser.h:115
SLATE_API UE::Slate::FDeprecateVector2DResult GetPointerPosition(uint32 PointerIndex) const
Definition SlateUser.cpp:443
SLATE_API FWeakWidgetPath GetLastWidgetsUnderPointer(uint32 PointerIndex) const
Definition SlateUser.cpp:513
SLATE_API bool SetFocus(const TSharedRef< SWidget > &WidgetToFocus, EFocusCause ReasonFocusIsChanging=EFocusCause::SetDirectly)
Definition SlateUser.cpp:185
virtual SLATE_API ~FSlateUser()
Definition SlateUser.cpp:155
SLATE_API UE::Slate::FDeprecateVector2DResult GetPreviousPointerPosition(uint32 PointerIndex) const
Definition SlateUser.cpp:453
bool IsVirtualUser() const
Definition SlateUser.h:47
SLATE_API bool ShouldShowFocus(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:170
SLATE_API bool DoesWidgetHaveCursorCapture(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:223
TSharedPtr< FNavigationConfig > GetUserNavigationConfig() const
Definition SlateUser.h:127
SLATE_API void ProcessCursorReply(const FCursorReply &CursorReply)
Definition SlateUser.cpp:941
SLATE_API bool IsCursorVisible() const
Definition SlateUser.cpp:400
const FWeakWidgetPath & GetWeakFocusPath() const
Definition SlateUser.h:134
SLATE_API UE::Slate::FDeprecateVector2DResult GetPreviousCursorPosition() const
Definition SlateUser.cpp:438
SLATE_API bool IsTouchPointerActive(int32 TouchPointerIndex) const
Definition SlateUser.cpp:623
int32 GetFocusVersion() const
Definition SlateUser.h:181
SLATE_API TArray< TSharedRef< SWidget > > GetCaptorWidgets() const
Definition SlateUser.cpp:356
SLATE_API TSharedPtr< SWidget > GetFocusedWidget() const
Definition SlateUser.cpp:160
int32 GetUserIndex() const
Definition SlateUser.h:45
SLATE_API bool SetCursorCaptor(TSharedRef< const SWidget > Widget, const FWidgetPath &EventPath)
Definition SlateUser.cpp:234
SLATE_API void SetPointerPosition(uint32 PointerIndex, int32 PosX, int32 PosY)
Definition SlateUser.cpp:416
SLATE_API void QueueSyntheticCursorMove()
Definition SlateUser.cpp:688
SLATE_API void FinishFrame()
Definition SlateUser.cpp:754
SLATE_API bool IsWidgetUnderAnyPointer(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:470
SLATE_API void DrawWindowlessDragDropContent(const TSharedRef< SWindow > &WindowToDraw, FSlateWindowElementList &WindowElementList, int32 &MaxLayerId)
Definition SlateUser.cpp:628
SLATE_API bool DoesWidgetHaveAnyCapture(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:211
SLATE_API TSharedPtr< SWidget > GetPointerCaptor(uint32 PointerIndex) const
Definition SlateUser.cpp:375
SLATE_API bool SetPointerCaptor(uint32 PointerIndex, TSharedRef< const SWidget > Widget, const FWidgetPath &EventPath)
Definition SlateUser.cpp:239
SLATE_API void UpdatePointerPosition(const FPointerEvent &PointerEvent)
Definition SlateUser.cpp:1107
SLATE_API void NotifyPointerReleased(const FPointerEvent &PointerEvent, const FWidgetPath &WidgetsUnderCursor, TSharedPtr< FDragDropOperation > DroppedContent, bool bWasHandled)
Definition SlateUser.cpp:1147
FPlatformUserId GetPlatformUserId() const
Definition SlateUser.h:46
SLATE_API void UpdateTooltip(const FMenuStack &MenuStack, bool bCanSpawnNewTooltip)
Definition SlateUser.cpp:1218
void IncrementFocusVersion()
Definition SlateUser.h:182
SLATE_API FWeakWidgetPath GetLastWidgetsUnderCursor() const
Definition SlateUser.cpp:508
SLATE_API bool SynthesizeCursorMoveIfNeeded()
Definition SlateUser.cpp:704
void RequestCursorQuery()
Definition SlateUser.h:156
SLATE_API bool IsWidgetInFocusPath(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:180
bool HasValidFocusPath() const
Definition SlateUser.h:133
SLATE_API FWeakWidgetPath GetWeakCapturePath(uint32 PointerIndex) const
Definition SlateUser.cpp:350
SLATE_API bool IsWidgetDirectlyUnderCursor(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:485
SLATE_API void SetCursorVisibility(bool bDrawCursor)
Definition SlateUser.cpp:381
TSharedRef< FWidgetPath > GetFocusPath() const
Definition SlateUser.h:136
SLATE_API bool IsWidgetUnderCursor(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:459
SLATE_API bool IsWindowHousingInteractiveTooltip(const TSharedRef< const SWindow > &WindowToTest) const
Definition SlateUser.cpp:1530
SLATE_API void SetUserNavigationConfig(TSharedPtr< FNavigationConfig > InNavigationConfig)
Definition SlateUser.cpp:604
SLATE_API bool HasCursorCapture() const
Definition SlateUser.cpp:200
SLATE_API void NotifyWindowDestroyed(TSharedRef< SWindow > DestroyedWindow)
Definition SlateUser.cpp:759
SLATE_API bool IsWidgetDirectlyUnderAnyPointer(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:496
SLATE_API void ResetTooltipWindow()
Definition SlateUser.cpp:1521
FGestureDetector & GetGestureDetector()
Definition SlateUser.h:188
SLATE_API bool IsDetectingDrag(uint32 PointerIndex) const
Definition SlateUser.cpp:1142
SLATE_API void UnlockCursor()
Definition SlateUser.cpp:893
SLATE_API void SetCursorPosition(int32 PosX, int32 PosY)
Definition SlateUser.cpp:406
SLATE_API bool IsWidgetDirectlyUnderPointer(TSharedPtr< const SWidget > Widget, uint32 PointerIndex) const
Definition SlateUser.cpp:490
SLATE_API void StartDragDetection(const FWidgetPath &PathToWidget, int32 PointerIndex, FKey DragButton, UE::Slate::FDeprecateVector2DParameter StartLocation)
Definition SlateUser.cpp:1118
SLATE_API bool HasCapture(uint32 PointerIndex) const
Definition SlateUser.cpp:205
SLATE_API FWidgetPath DetectDrag(const FPointerEvent &PointerEvent, float DragTriggerDistance)
Definition SlateUser.cpp:1123
SLATE_API TArray< FWidgetPath > GetCaptorPaths()
Definition SlateUser.cpp:307
SLATE_API void UpdateCursor()
Definition SlateUser.cpp:902
const FGestureDetector & GetGestureDetector() const
Definition SlateUser.h:124
SLATE_API void SetFocusPath(const FWidgetPath &NewFocusPath, EFocusCause InFocusCause, bool bInShowFocus)
Definition SlateUser.cpp:746
SLATE_API void ShowTooltip(const TSharedRef< IToolTip > &InTooltip, const UE::Slate::FDeprecateVector2DParameter &InSpawnLocation)
Definition SlateUser.cpp:557
SLATE_API bool IsDragDroppingAffected(const FPointerEvent &InPointerEvent) const
Definition SlateUser.cpp:523
SLATE_API bool IsDragDropping() const
Definition SlateUser.cpp:518
SLATE_API bool DoesWidgetHaveCapture(TSharedPtr< const SWidget > Widget, uint32 PointerIndex) const
Definition SlateUser.cpp:228
SLATE_API void QueryCursor()
Definition SlateUser.cpp:767
SLATE_API void ResetDragDetection()
Definition SlateUser.cpp:1202
SLATE_API bool HasAnyCapture() const
Definition SlateUser.cpp:195
SLATE_API FVector2f GetTooltipPosition() const
Definition SlateUser.cpp:595
SLATE_API void ReleaseAllCapture()
Definition SlateUser.cpp:267
SLATE_API void LockCursor(const TSharedRef< SWidget > &Widget)
Definition SlateUser.cpp:879
SLATE_API void ReleaseCapture(uint32 PointerIndex)
Definition SlateUser.cpp:282
SLATE_API void NotifyPointerMoveBegin(const FPointerEvent &PointerEvent)
Definition SlateUser.cpp:1046
SLATE_API void CloseTooltip()
Definition SlateUser.cpp:583
SLATE_API void ClearFocus(EFocusCause ReasonFocusIsChanging=EFocusCause::SetDirectly)
Definition SlateUser.cpp:190
SLATE_API void ReleaseCursorCapture()
Definition SlateUser.cpp:277
SLATE_API void ResetDragDropContent()
Definition SlateUser.cpp:1213
SLATE_API TOptional< EFocusCause > HasFocus(TSharedPtr< const SWidget > Widget) const
Definition SlateUser.cpp:165
TSharedPtr< ICursor > GetCursor() const
Definition SlateUser.h:151
const TMap< uint32, FWeakWidgetPath > & GetWidgetsUnderPointerLastEventByIndex() const
Definition SlateUser.h:113
SLATE_API UE::Slate::FDeprecateVector2DResult GetCursorPosition() const
Definition SlateUser.cpp:433
SLATE_API void CancelDragDrop()
Definition SlateUser.cpp:528
SLATE_API void DrawCursor(const TSharedRef< SWindow > &WindowToDraw, FSlateWindowElementList &WindowElementList, int32 &MaxLayerId)
Definition SlateUser.cpp:659
SLATE_SCOPE TSharedPtr< ICursor > InCursor
Definition SlateUser.h:130
Definition SlateUser.h:18
int32 GetUserIndex() const
Definition SlateUser.h:22
virtual SLATE_API ~FSlateVirtualUserHandle()
Definition SlateUser.cpp:87
int32 GetVirtualUserIndex() const
Definition SlateUser.h:23
SLATE_SCOPE int32 InVirtualUserIndex
Definition SlateUser.h:26
Definition DrawElements.h:220
Definition WidgetPath.h:213
SLATECORE_API TSharedRef< FWidgetPath > ToWidgetPathRef(EInterruptedPathHandling::Type InterruptedPathHandling=EInterruptedPathHandling::Truncate, const FPointerEvent *PointerEvent=nullptr, const EVisibility VisibilityFilter=EVisibility::Visible) const
Definition WidgetPath.cpp:261
bool IsValid() const
Definition WidgetPath.h:287
Definition WidgetPath.h:51
Definition ICursor.h:70
Definition SWidget.h:165
Definition SWindow.h:243
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SharedPointer.h:1640
Definition SharedPointer.h:692
TSharedRef< ObjectType, Mode > ToSharedRef() const &
Definition SharedPointer.h:1028
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointer.h:1085
Definition SharedPointer.h:153
Definition SharedPointer.h:1295
@ Down
Definition SlateEnums.h:57
@ Right
Definition GenericApplication.h:428
FDeprecateSlateVector2D FDeprecateVector2DResult
Definition SlateVector2.h:469
static INPUTCORE_API const FKey Invalid
Definition InputCoreTypes.h:693
Definition InputCoreTypes.h:50
Definition CoreMiscDefines.h:470
Definition Events.h:695
@ Truncate
Definition WidgetPath.h:223
Definition Optional.h:131
static CORE_API const TVector2< float > ZeroVector
Definition Vector2D.h:63
Definition SlateVector2.h:485