// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Debugging/SlateDebugging.h" #if WITH_SLATE_DEBUGGING #include "Input/HittestGrid.h" #include "Input/Reply.h" #include "Styling/SlateColor.h" #include "Styling/SlateTypes.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/SWidget.h" #include "Widgets/SCompoundWidget.h" class SWidget; class SWindow; enum class ECheckBoxState : uint8; class ITableRow; template class SListView; class STableViewBase; namespace WidgetHittestGridInternal { struct FIntermediateResultNode; } typedef SListView> SWidgetHittestGridTree; /** * */ class SWidgetHittestGrid : public SCompoundWidget { public: DECLARE_DELEGATE_OneParam(FOnWidgetSelected, TSharedPtr); DECLARE_DELEGATE_OneParam(FOnVisualizeWidget, const FWidgetPath&); SLATE_BEGIN_ARGS(SWidgetHittestGrid) {} SLATE_EVENT(FOnWidgetSelected, OnWidgetSelected) SLATE_EVENT(FOnVisualizeWidget, OnVisualizeWidget) SLATE_END_ARGS() virtual ~SWidgetHittestGrid(); void Construct(const FArguments& InArgs, TSharedPtr InReflectorWidget); /** Stop listening to new events */ void SetPause(bool bNewPaused); private: void LoadSettings(); void SaveSettings(); TSharedRef ConstructNavigationDetail() const; void HandleDrawDebuggerVisual(const FPaintArgs& InArgs, const FGeometry& InAllottedGeometry, FSlateWindowElementList& InOutDrawElements, int32& InOutLayerId); void HandleFindNextFocusableWidget(const FHittestGrid* HittestGrid, const FHittestGrid::FDebuggingFindNextFocusableWidgetArgs& Info); FText GetDisplayButtonText() const; TSharedRef GetDisplayMenuContent(); void HandleDisplayButtonClicked(TWeakPtr Window); void HandleDisplayAllClicked(); bool HandleIsDisplayButtonChecked(TWeakPtr Window) const; bool HandleIsDisplayAllChecked() const { return bDisplayAllWindows; } TSharedRef GetFlagsMenuContent(); void HandleDisplayFlagsButtonClicked(FHittestGrid::EDisplayGridFlags Flag); bool HandleIsDisplayFlagsButtonChecked(FHittestGrid::EDisplayGridFlags Flag) const; void HandleVisualizeOnNavigationChanged(ECheckBoxState InCheck); ECheckBoxState HandleGetVisualizeOnNavigationChecked() const { return bVisualizeOnNavigation ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void HandleRejectWidgetReflectorChanged(ECheckBoxState InCheck); ECheckBoxState HandleGetRejectWidgetReflectorChecked() const { return bRejectWidgetReflectorEvent ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } FText GetNavigationFromText() const { return NavigationFrom; } FText GetNavigationResultText() const { return NavigationResult; } FText GetNavigationDirectionText() const { return NavigationDirection; } FText GetNavigationUserIndexText() const { return NavigationUserIndex; } FText GetNavigationRuleWidgetText() const { return NavigationRuleWidget; } FText GetNavigationBoundaryRuleText() const { return NavigationBoundaryRule; } void HandleNavigationNavigate(TWeakPtr WidgetToNavigate) const; TSharedRef HandleWidgetHittestGridGenerateRow(TSharedRef InReflectorNode, const TSharedRef& OwnerTable); void HandleWidgetHittestGridSelectionChanged(TSharedPtr, ESelectInfo::Type /*SelectInfo*/); private: FOnWidgetSelected OnWidgetSelected; FOnVisualizeWidget OnVisualizeWidget; TWeakPtr ReflectorWidget; FHittestGrid::EDisplayGridFlags DisplayGridFlags; TWeakPtr WindowToDisplay; bool bDisplayAllWindows; bool bVisualizeOnNavigation; bool bRejectWidgetReflectorEvent; TSharedPtr NavigationIntermediateResultTree; TArray> IntermediateResultNodesRoot; FText NavigationFrom; FText NavigationResult; FText NavigationDirection; FText NavigationUserIndex; FText NavigationRuleWidget; FText NavigationBoundaryRule; TWeakPtr NavigationFromWidget; TWeakPtr NavigationFromResult; TWeakPtr NavigationRuleWidgetWidget; }; #endif // WITH_SLATE_DEBUGGING