UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
HittestGrid.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"
7#include "Layout/SlateRect.h"
9#include "Layout/Clipping.h"
10#include "Input/Events.h"
12#include "Widgets/SWidget.h"
13
16
28
30{
31 friend struct FNavigationMethod;
33 friend struct FNavigationRouting;
34
35public:
36
38
44
54
57
59 void SetUserIndex(int32 UserIndex) { CurrentUserIndex = UserIndex; }
60
62 void SetCullingRect(const FSlateRect& InCullingRect) { CullingRect = InCullingRect; }
63
65 void SetOwner(const SWidget* InOwner) { check(Owner == nullptr || Owner == InOwner); Owner = InOwner; }
66
68 int32 GetUserIndex() const { return CurrentUserIndex; }
69
78 SLATECORE_API TSharedPtr<SWidget> FindNextFocusableWidget(const FArrangedWidget& StartingWidget, const EUINavigation Direction, const FNavigationReply& NavigationReply, const FArrangedWidget& RuleWidget, int32 UserIndex);
79
82 UE::Slate::FDeprecateVector2DResult GetGridWindowOrigin() const { return GridWindowOrigin; }
83
86
88 SLATECORE_API bool IsValidCellCoord(const FIntPoint& CellCoord) const;
89 SLATECORE_API bool IsValidCellCoord(const int32 XCoord, const int32 YCoord) const;
90
91 const FVector2f& GetCellSize() const { return CellSize; }
92
94 SLATECORE_API void Clear();
95
98
101
104
106 SLATECORE_API bool ContainsWidget(const SWidget* InWidget) const;
107
113
116
119
137
138#if WITH_SLATE_DEBUGGING
141
142 SLATECORE_API void LogGrid() const;
143
144 enum class EDisplayGridFlags
145 {
146 None = 0,
147 HideDisabledWidgets = 1 << 0, // Hide hit box for widgets that have IsEnabled false
148 HideUnsupportedKeyboardFocusWidgets = 1 << 1, // Hide hit box for widgets that have SupportsKeyboardFocus false
149 UseFocusBrush = 1 << 2,
150 };
151 SLATECORE_API void DisplayGrid(int32 InLayer, const FGeometry& AllottedGeometry, FSlateWindowElementList& WindowElementList, EDisplayGridFlags DisplayFlags = EDisplayGridFlags::UseFocusBrush) const;
152
153 SLATECORE_API void DisplayNavigation(int32 InLayer, const FGeometry& AllottedGeometry, FSlateWindowElementList& WindowElementList);
154
155 struct FWidgetSortData
156 {
157 const TWeakPtr<SWidget> WeakWidget;
158 int64 PrimarySort;
160 };
162#endif
163
164private:
168 struct FWidgetData
169 {
171 : WeakWidget(InWidget)
172 , UpperLeftCell(InUpperLeftCell)
173 , LowerRightCell(InLowerRightCell)
174 , PrimarySort(InPrimarySort)
175 , SecondarySort(InSecondarySort)
176 , UserIndex(InUserIndex)
177 {}
178 TWeakPtr<SWidget> WeakWidget;
180 FIntPoint UpperLeftCell;
181 FIntPoint LowerRightCell;
182 int64 PrimarySort;
184 int32 UserIndex;
185
186 TSharedPtr<SWidget> GetWidget() const { return WeakWidget.Pin(); }
187 };
188
189 struct FWidgetIndex
190 {
191 FWidgetIndex()
192 : Grid(nullptr)
193 , WidgetIndex(INDEX_NONE)
194 {}
195 FWidgetIndex(const FHittestGrid* InHittestGrid, int32 InIndex)
197 , WidgetIndex(InIndex)
198 {}
199 bool IsValid() const { return Grid != nullptr && Grid->WidgetArray.IsValidIndex(WidgetIndex); }
200 const FWidgetData& GetWidgetData() const;
201 const FSlateRect& GetCullingRect() const { return Grid->CullingRect; }
202 const FHittestGrid* GetGrid() const { return Grid; }
203
204 private:
205 const FHittestGrid* Grid;
206 int32 WidgetIndex;
207 };
208
209 struct FIndexAndDistance : FWidgetIndex
210 {
212 : FWidgetIndex()
213 , DistanceSqToWidget(0)
214 {}
215 FIndexAndDistance(FWidgetIndex WidgetIndex, float InDistanceSq)
216 : FWidgetIndex(WidgetIndex)
217 , DistanceSqToWidget(InDistanceSq)
218 {}
219 float GetDistanceSqToWidget() const { return DistanceSqToWidget; }
220
221 private:
222 float DistanceSqToWidget;
223 };
224
225 struct FGridTestingParams;
226
232 struct FCell
233 {
234 public:
235 FCell() = default;
236
237 void AddIndex(int32 WidgetIndex);
238 void RemoveIndex(int32 WidgetIndex);
239 void Reset();
240
241 const TArray<int32>& GetWidgetIndexes() const { return WidgetIndexes; }
242
243 private:
244 TArray<int32> WidgetIndexes;
245 };
246
247 struct FAppendedGridData
248 {
249 FAppendedGridData(const SWidget* InCachedOwner, const TWeakPtr<const FHittestGrid>& InGrid)
250 : CachedOwner(InCachedOwner), Grid(InGrid)
251 { }
252 const SWidget* CachedOwner; // Cached owner of the grid
254 };
255
256 //~ Helper functions
257 SLATECORE_API void ClearInternal(int32 TotalCells);
258
260 SLATECORE_API FIndexAndDistance GetHitIndexFromCellIndex(const FGridTestingParams& Params) const;
261
263 SLATECORE_API bool IsDescendantOf(const SWidget* Parent, const FWidgetData& ChildData) const;
264
266 template<typename TCompareFunc, typename TSourceSideFunc, typename TDestSideFunc>
267 TSharedPtr<SWidget> FindFocusableWidget(const FSlateRect WidgetRect, const FSlateRect SweptRect, int32 AxisIndex, int32 Increment, const EUINavigation Direction, const FNavigationReply& NavigationReply, TCompareFunc CompareFunc, TSourceSideFunc SourceSideFunc, TDestSideFunc DestSideFunc, int32 UserIndex, TArray<FDebuggingFindNextFocusableWidgetArgs::FWidgetResult>* IntermediatedResultPtr, TSet<TSharedPtr<SWidget>>* DisabledDestinations) const;
268
271
273 FORCEINLINE FCell& CellAt(const int32 X, const int32 Y)
274 {
275 checkfSlow((Y*NumCells.X + X) < Cells.Num(), TEXT("HitTestGrid CellAt() failed: X= %d Y= %d NumCells.X= %d NumCells.Y= %d Cells.Num()= %d"), X, Y, NumCells.X, NumCells.Y, Cells.Num());
276 return Cells[Y*NumCells.X + X];
277 }
278
280 FORCEINLINE const FCell& CellAt( const int32 X, const int32 Y ) const
281 {
282 checkfSlow((Y*NumCells.X + X) < Cells.Num(), TEXT("HitTestGrid CellAt() failed: X= %d Y= %d NumCells.X= %d NumCells.Y= %d Cells.Num()= %d"), X, Y, NumCells.X, NumCells.Y, Cells.Num());
283 return Cells[Y*NumCells.X + X];
284 }
285
287 SLATECORE_API bool CanBeAppended(const FHittestGrid* OtherGrid) const;
288
290 SLATECORE_API bool SameSize(const FHittestGrid* OtherGrid) const;
291
292 using FCollapsedHittestGridArray = TArray<const FHittestGrid*, TInlineAllocator<16>>;
294 SLATECORE_API void GetCollapsedHittestGrid(FCollapsedHittestGridArray& OutResult) const;
295
296 using FCollapsedWidgetsArray = TArray<FWidgetIndex, TInlineAllocator<100>>;
298 SLATECORE_API void GetCollapsedWidgets(FCollapsedWidgetsArray& Out, const int32 X, const int32 Y) const;
299
301 SLATECORE_API void RemoveStaleAppendedHittestGrid();
302
303 static constexpr bool IsCompatibleUserIndex(int32 RequestedUserIndex, int32 TestUserIndex)
304 {
305 // INDEX_NONE means the user index is compatible with all
307 }
308
309 TInstancedStruct<FNavigationMethod> GetNavigationMethod(const FArrangedWidget& StartingWidget);
310 TSharedPtr<SWidget> FindNextFocusableWidgetDefault(const FArrangedWidget& StartingWidget, const EUINavigation Direction, const FNavigationReply& NavigationReply, const FArrangedWidget& RuleWidget, int32 UserIndex);
311 TSharedPtr<SWidget> FindNextFocusableWidgetExperimental(const FArrangedWidget& StartingWidget, const EUINavigation Direction, const FNavigationReply& NavigationReply, const FArrangedWidget& RuleWidget, int32 UserIndex);
312
313private:
316
318 TSparseArray<FWidgetData> WidgetArray;
319
321 TArray<FCell> Cells;
322
324 TArray<FAppendedGridData> AppendedGridArray;
325
327 const SWidget* Owner;
328
330 FSlateRect CullingRect;
331
333 FIntPoint NumCells;
334
336 FVector2f GridOrigin;
337
339 FVector2f GridWindowOrigin;
340
342 FVector2f GridSize;
343
345 int32 CurrentUserIndex;
346
348 static const FVector2f CellSize;
349
350#if WITH_SLATE_DEBUGGING
353#endif
354};
355
356#if WITH_SLATE_DEBUGGING
357ENUM_CLASS_FLAGS(FHittestGrid::EDisplayGridFlags);
358#endif
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define checkfSlow(expr, format,...)
Definition AssertionMacros.h:333
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
#define DECLARE_MULTICAST_DELEGATE_TwoParams(DelegateName, Param1Type, Param2Type)
Definition DelegateCombinations.h:58
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
#define X(Name, Desc)
Definition FormatStringSan.h:47
UE_FORCEINLINE_HINT bool IsValid(const UObject *Test)
Definition Object.h:1875
EUINavigation
Definition SlateEnums.h:99
Definition ArrangedChildren.h:15
Definition ArrangedWidget.h:18
Definition HittestGrid.h:30
UE::Slate::FDeprecateVector2DResult GetGridWindowOrigin() const
Definition HittestGrid.h:82
SLATECORE_API bool IsValidCellCoord(const FIntPoint &CellCoord) const
Definition HittestGrid.cpp:720
int32 GetUserIndex() const
Definition HittestGrid.h:68
UE::Slate::FDeprecateVector2DResult GetGridSize() const
Definition HittestGrid.h:80
SLATECORE_API FHittestGrid()
Definition HittestGrid.cpp:163
SLATECORE_API FSlateRect GetWidgetRenderBoundingRect(const TSharedPtr< SWidget > &Widget) const
Definition HittestGrid.cpp:702
SLATECORE_API TArray< FWidgetAndPointer > GetBubblePath(UE::Slate::FDeprecateVector2DParameter DesktopSpaceCoordinate, float CursorRadius, bool bIgnoreEnabledStatus, int32 UserIndex=INDEX_NONE)
Definition HittestGrid.cpp:180
SLATECORE_API bool SetHittestArea(const UE::Slate::FDeprecateVector2DParameter &HittestPositionInDesktop, const UE::Slate::FDeprecateVector2DParameter &HittestDimensions, const UE::Slate::FDeprecateVector2DParameter &HitestOffsetInWindow=FVector2f::ZeroVector)
Definition HittestGrid.cpp:254
SLATECORE_API void Clear()
Definition HittestGrid.cpp:286
SLATECORE_API void InsertCustomHitTestPath(const SWidget *InWidget, const TSharedRef< ICustomHitTestPath > &CustomHitTestPath)
Definition HittestGrid.cpp:919
const FVector2f & GetCellSize() const
Definition HittestGrid.h:91
void SetUserIndex(int32 UserIndex)
Definition HittestGrid.h:59
SLATECORE_API void AddWidget(const SWidget *InWidget, int32 InBatchPriorityGroup, int32 InLayerId, FSlateInvalidationWidgetSortOrder InSecondarySort)
Definition HittestGrid.cpp:814
void SetOwner(const SWidget *InOwner)
Definition HittestGrid.h:65
SLATECORE_API bool ContainsWidget(const SWidget *InWidget) const
Definition HittestGrid.cpp:914
SLATECORE_API void RemoveWidget(const SWidget *InWidget)
Definition HittestGrid.cpp:875
void SetCullingRect(const FSlateRect &InCullingRect)
Definition HittestGrid.h:62
SLATECORE_API void AddGrid(const TSharedRef< const FHittestGrid > &OtherGrid)
Definition HittestGrid.cpp:730
UE::Slate::FDeprecateVector2DResult GetGridOrigin() const
Definition HittestGrid.h:81
SLATECORE_API void UpdateWidget(const SWidget *InWidget, FSlateInvalidationWidgetSortOrder InSecondarySort)
Definition HittestGrid.cpp:905
SLATECORE_API void RemoveGrid(const TSharedRef< const FHittestGrid > &OtherGrid)
Definition HittestGrid.cpp:771
SLATECORE_API TSharedPtr< SWidget > FindNextFocusableWidget(const FArrangedWidget &StartingWidget, const EUINavigation Direction, const FNavigationReply &NavigationReply, const FArrangedWidget &RuleWidget, int32 UserIndex)
Definition HittestGrid.cpp:306
Definition NavigationReply.h:43
Definition UnrealTemplate.h:321
Definition SlateRect.h:26
Definition DrawElements.h:220
Definition Text.h:385
Definition HittestGrid.h:18
virtual ~ICustomHitTestPath()
Definition HittestGrid.h:20
virtual void ArrangeCustomHitTestChildren(FArrangedChildren &ArrangedChildren) const =0
virtual TArray< FWidgetAndPointer > GetBubblePathAndVirtualCursors(const FGeometry &InGeometry, FVector2D DesktopSpaceCoordinate, bool bIgnoreEnabledStatus) const =0
virtual TOptional< FVirtualPointerPosition > TranslateMouseCoordinateForCustomHitTestChild(const SWidget &ChildWidget, const FGeometry &MyGeometry, const FVector2D ScreenSpaceMouseCoordinate, const FVector2D LastScreenSpaceMouseCoordinate) const =0
Definition SWidget.h:165
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition SparseArray.h:524
Definition SharedPointer.h:1295
UE_FORCEINLINE_HINT TSharedPtr< ObjectType, Mode > Pin() const &
Definition SharedPointer.h:1512
@ Grid
Definition ReporterGraph.h:20
FDeprecateSlateVector2D FDeprecateVector2DResult
Definition SlateVector2.h:469
Definition Geometry.h:40
FWidgetResult(const TSharedPtr< const SWidget > &InWidget, FText InResult)
Definition HittestGrid.h:126
const TSharedPtr< const SWidget > Widget
Definition HittestGrid.h:124
const FArrangedWidget RuleWidget
Definition HittestGrid.h:132
const int32 UserIndex
Definition HittestGrid.h:133
const FNavigationReply NavigationReply
Definition HittestGrid.h:131
TArray< FWidgetResult > IntermediateResults
Definition HittestGrid.h:135
const EUINavigation Direction
Definition HittestGrid.h:130
const FArrangedWidget StartingWidget
Definition HittestGrid.h:129
const TSharedPtr< const SWidget > Result
Definition HittestGrid.h:134
Definition BlendSpaceHelpers.cpp:11
Definition NavigationMethodOrthogonal.h:11
Definition NavigationMethod.h:12
Definition NavigationRouting.h:47
Definition SlateInvalidationWidgetSortOrder.h:17
Definition InstancedStruct.h:307
Definition Optional.h:131
Definition IntPoint.h:25
IntType Y
Definition IntPoint.h:37
IntType X
Definition IntPoint.h:34
static CORE_API const TVector2< float > ZeroVector
Definition Vector2D.h:63
Definition SlateVector2.h:485