// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "BindableProperty.h" #include "Framework/Commands/UICommandList.h" #include "IRewindDebuggerTrackCreator.h" #include "RewindDebuggerCommands.h" #include "RewindDebuggerSettings.h" #include "SRewindDebuggerTimelines.h" #include "SRewindDebuggerTrackTree.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Widgets/Input/SSearchBox.h" #include "Widgets/SCompoundWidget.h" class FRewindDebuggerModule; class SCheckBox; class SDockTab; class SSearchBox; class SRewindDebugger : public SCompoundWidget { typedef TBindablePropertyInitializer DebugTargetInitializer; public: DECLARE_DELEGATE_TwoParams(FOnScrubPositionChanged, double, bool) DECLARE_DELEGATE_OneParam(FOnViewRangeChanged, const TRange&) DECLARE_DELEGATE_OneParam(FOnDebugTargetChanged, TSharedPtr) DECLARE_DELEGATE_OneParam(FOnTrackDoubleClicked, TSharedPtr) DECLARE_DELEGATE_OneParam(FOnTrackSelectionChanged, TSharedPtr) DECLARE_DELEGATE_RetVal(TSharedPtr, FBuildTrackContextMenu) SLATE_BEGIN_ARGS(SRewindDebugger) {} SLATE_ARGUMENT(TArray< TSharedPtr< RewindDebugger::FRewindDebuggerTrack > >*, Tracks); SLATE_ARGUMENT(DebugTargetInitializer, DebuggedObjectName); SLATE_ARGUMENT(TBindablePropertyInitializer, TraceTime); SLATE_ARGUMENT(TBindablePropertyInitializer, RecordingDuration); SLATE_ATTRIBUTE(TArrayView, TrackTypes); SLATE_ATTRIBUTE(double, ScrubTime); SLATE_ATTRIBUTE(bool, IsPIESimulating); SLATE_EVENT(FOnScrubPositionChanged, OnScrubPositionChanged); SLATE_EVENT(FOnViewRangeChanged, OnViewRangeChanged); SLATE_EVENT(FBuildTrackContextMenu, BuildTrackContextMenu); SLATE_EVENT(FOnTrackDoubleClicked, OnTrackDoubleClicked); SLATE_EVENT(FOnTrackSelectionChanged, OnTrackSelectionChanged); SLATE_END_ARGS() /** * Constructs the widget. * * @param InArgs The Slate argument list. * @param CommandList The command list to use. * @param ConstructUnderMajorTab The major tab which will contain the session front-end. * @param ConstructUnderWindow The window in which this widget is being constructed. */ void Construct(const FArguments& InArgs, TSharedRef CommandList, const TSharedRef& ConstructUnderMajorTab, const TSharedPtr& ConstructUnderWindow); SRewindDebugger(); void TrackCursor(bool bReverse); void RefreshTracks(); private: void SetViewRange(TRange NewRange); void ToggleHideTrackType(const FName& TrackType); bool ShouldHideTrackType(const FName& TrackType) const; void ToggleDisplayEmptyTracks(); bool ShouldDisplayEmptyTracks() const; virtual FReply OnPreviewKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override; virtual bool SupportsKeyboardFocus() const override { return true; } /** Time Slider */ TAttribute ScrubTimeAttribute; TAttribute IsPIESimulating; TAttribute TrackScrubbingAttribute; TAttribute> TrackTypesAttribute; FOnScrubPositionChanged OnScrubPositionChanged; FOnViewRangeChanged OnViewRangeChanged; TRange ViewRange; TBindableProperty TraceTime; TBindableProperty RecordingDuration; TSharedPtr CommandList; const FRewindDebuggerCommands& Commands; /** debug object selector */ TSharedRef MakeObjectSelectionMenu(); void SetDebuggedObject(const UObject* Object); FReply OnSelectActorClicked(); TBindableProperty DebuggedObjectName; TSharedRef MakeMainMenu(); TSharedRef MakeFilterMenu(); /** Track tree view */ TArray>* Tracks = nullptr; TSharedPtr SelectedComponent; void OnSelectedTrackChanged(TSharedPtr SelectedItem, ESelectInfo::Type SelectInfo); FBuildTrackContextMenu BuildTrackContextMenu; FOnTrackSelectionChanged OnTrackSelectionChanged; TSharedPtr TrackTreeView; TSharedPtr TimelinesView; TSharedPtr OnContextMenuOpening(); TSharedPtr TrackFilterBox; bool bInExpansionChanged = false; bool bInSelectionChanged = false; bool bDisplayEmptyTracks = false; URewindDebuggerSettings& Settings; };