// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Layout/Geometry.h" #include "SlateNavigationEventSimulator.h" class SWidget; class FWidgetPath; class FWidgetReflectorNodeBase; class FJsonValue; struct FNavigationSimulationWidgetInfo; struct FNavigationSimulationWidgetNodeItem; struct FNavigationSimulationWidgetNode; using FNavigationSimulationWidgetNodePtr = TSharedPtr; enum class ENavigationSimulationNodeType : uint8 { Live, Snapshot, }; struct FNavigationSimulationWidgetInfo { // Should be PTRINT but if the platform that produce the file is 64bits and the reader is not then we could have a issue using TPointerAsInt = uint64; FNavigationSimulationWidgetInfo() = default; explicit FNavigationSimulationWidgetInfo(const TSharedPtr& Widget); explicit FNavigationSimulationWidgetInfo(const FWidgetPath& WidgetPath); /** Is the widget set to null. */ bool IsWidgetExplicitlyNull() const { return WidgetPtr == 0; } TPointerAsInt WidgetPtr; TWeakPtr WidgetLive; FText WidgetTypeAndShortName; FGeometry WidgetGeometry; bool bHasGeometry; }; struct FNavigationSimulationWidgetNodeItem { FNavigationSimulationWidgetNodeItem() = default; explicit FNavigationSimulationWidgetNodeItem(const FSlateNavigationEventSimulator::FSimulationResult& Result); EUINavigation NavigationType; FNavigationSimulationWidgetInfo Destination; FNavigationSimulationWidgetInfo ReplyEventHandler; FNavigationSimulationWidgetInfo ReplyFocusRecipient; EUINavigationRule ReplyBoundaryRule; FSlateNavigationEventSimulator::ERoutedReason RoutedReason; FNavigationSimulationWidgetInfo WidgetThatShouldReceivedFocus; FNavigationSimulationWidgetInfo FocusedWidget; uint8 bIsDynamic : 1; uint8 bAlwaysHandleNavigationAttempt : 1; uint8 bCanFindWidgetForSetFocus : 1; uint8 bRoutedHandlerHasNavigationMeta : 1; uint8 bHandledByViewport : 1; void ResetLiveWidget(); }; struct FNavigationSimulationWidgetNode { FNavigationSimulationWidgetNode() = default; explicit FNavigationSimulationWidgetNode(ENavigationSimulationNodeType NodeType, const FWidgetPath& InNavigationSource); FNavigationSimulationWidgetInfo NavigationSource; TArray> Simulations; ENavigationSimulationNodeType NodeType; /** Save this node data as a JSON object */ static TSharedRef ToJson(const FNavigationSimulationWidgetNode& Node); /** Populate this node data from a JSON object */ static FNavigationSimulationWidgetNodePtr FromJson(const TSharedRef& RootJsonValue); }; struct FNavigationSimulationNodeUtils { static TArray BuildNavigationSimulationNodeListForLive(const TArray& SimulationResult); static TArray BuildNavigationSimulationNodeListForSnapshot(const TArray& SimulationResult); static TArray FindReflectorNodes(const TArray& Nodes, const TArray>& ToFind); static int32 IndexOfLiveWidget(const TArray& Nodes, const TSharedPtr& WidgetToFind); static int32 IndexOfSnapshotWidget(const TArray& Nodes, FNavigationSimulationWidgetInfo::TPointerAsInt WidgetToFind); };