EM_Task/TraceInsights/Private/Insights/Widgets/SStartPageWindow.h

282 lines
9.4 KiB
C
Raw Permalink Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Framework/Docking/TabManager.h"
#include "GenericPlatform/GenericPlatformMisc.h"
#include "Input/Reply.h"
#include "Layout/Visibility.h"
#include "Misc/Guid.h"
#include "SlateFwd.h"
#include "Trace/StoreClient.h"
#include "TraceServices/ModuleService.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Docking/SDockTab.h"
#include "Widgets/Layout/SSplitter.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/SOverlay.h"
#include "Widgets/Views/SListView.h"
// Insights
#include "Insights/InsightsManager.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
class FActiveTimerHandle;
class SVerticalBox;
class SEditableTextBox;
namespace Insights
{
class FStoreBrowser;
struct FStoreBrowserTraceInfo;
} // namespace Insights
////////////////////////////////////////////////////////////////////////////////////////////////////
/** Type definition for shared pointers to instances of SNotificationItem. */
typedef TSharedPtr<class SNotificationItem> SNotificationItemPtr;
/** Type definition for shared references to instances of SNotificationItem. */
typedef TSharedRef<class SNotificationItem> SNotificationItemRef;
/** Type definition for weak references to instances of SNotificationItem. */
typedef TWeakPtr<class SNotificationItem> SNotificationItemWeak;
////////////////////////////////////////////////////////////////////////////////////////////////////
struct FTraceViewModel
{
uint32 TraceId = 0;
uint64 ChangeSerial = 0;
int32 TraceIndex = -1; // debug
FText Name;
FText Uri;
FDateTime Timestamp = 0;
uint64 Size = 0;
bool bIsLive = false;
uint32 IpAddress = 0;
bool bIsMetadataUpdated = false;
FText Platform;
FText AppName;
FText CommandLine;
EBuildConfiguration ConfigurationType = EBuildConfiguration::Unknown;
EBuildTargetType TargetType = EBuildTargetType::Unknown;
FTraceViewModel() = default;
static FDateTime ConvertTimestamp(uint64 InTimestamp)
{
return FDateTime(static_cast<int64>(InTimestamp));
}
static FText AnsiStringViewToText(const FAnsiStringView& AnsiStringView)
{
FString FatString(AnsiStringView.Len(), AnsiStringView.GetData());
return FText::FromString(FatString);
}
};
/** Implements the Start Page window. */
class SStartPageWindow: public SCompoundWidget
{
public:
/** Default constructor. */
SStartPageWindow();
/** Virtual destructor. */
virtual ~SStartPageWindow();
SLATE_BEGIN_ARGS(SStartPageWindow) {}
SLATE_END_ARGS()
/** Constructs this widget. */
void Construct(const FArguments& InArgs);
void OpenSettings();
void CloseSettings();
private:
TSharedRef<SWidget> ConstructSessionsPanel();
TSharedRef<SWidget> ConstructLoadPanel();
TSharedRef<SWidget> ConstructTraceStoreDirectoryPanel();
TSharedRef<SWidget> ConstructAutoStartPanel();
TSharedRef<SWidget> ConstructRecorderPanel();
TSharedRef<SWidget> ConstructConnectPanel();
/** Generate a new row for the Traces list view. */
TSharedRef<ITableRow> TraceList_OnGenerateRow(TSharedPtr<FTraceViewModel> InTrace, const TSharedRef<STableViewBase>& OwnerTable);
//////////////////////////////////////////////////
// "Starting Analysis" Splash Screen
void ShowSplashScreenOverlay();
void TickSplashScreenOverlay(const float InDeltaTime);
float SplashScreenOverlayOpacity() const;
EVisibility SplashScreenOverlay_Visibility() const;
FSlateColor SplashScreenOverlay_ColorAndOpacity() const;
FSlateColor SplashScreenOverlay_TextColorAndOpacity() const;
FText GetSplashScreenOverlayText() const;
//////////////////////////////////////////////////
bool Open_IsEnabled() const;
FReply Open_OnClicked();
void OpenFileDialog();
void LoadTraceSession(TSharedPtr<FTraceViewModel> InTrace);
void LoadTraceFile(const FString& InTraceFile);
void LoadTrace(uint32 InTraceId);
//////////////////////////////////////////////////
// Traces
TSharedRef<SWidget> MakeTraceListMenu();
FReply RefreshTraces_OnClicked();
void RefreshTraceList();
void UpdateTrace(FTraceViewModel& InOutTrace, const Insights::FStoreBrowserTraceInfo& InSourceTrace);
void OnTraceListChanged();
void TraceList_OnSelectionChanged(TSharedPtr<FTraceViewModel> InTrace, ESelectInfo::Type SelectInfo);
void TraceList_OnMouseButtonDoubleClick(TSharedPtr<FTraceViewModel> InTrace);
//////////////////////////////////////////////////
// Auto Start Analysis
ECheckBoxState AutoStart_IsChecked() const;
void AutoStart_OnCheckStateChanged(ECheckBoxState NewState);
//////////////////////////////////////////////////
// Trace Store Directory
FText GetTraceStoreDirectory() const;
FReply ExploreTraceStoreDirectory_OnClicked();
//////////////////////////////////////////////////
// Recorder
FText GetRecorderStatusText() const;
EVisibility StartTraceRecorder_Visibility() const;
EVisibility StopTraceRecorder_Visibility() const;
FReply StartTraceRecorder_OnClicked();
FReply StopTraceRecorder_OnClicked();
//////////////////////////////////////////////////
// New Connection
FReply Connect_OnClicked();
//////////////////////////////////////////////////
/** Updates the amount of time the profiler has been active. */
EActiveTimerReturnType UpdateActiveDuration(double InCurrentTime, float InDeltaTime);
/**
* Ticks this widget. Override in derived classes, but always call the parent implementation.
*
* @param AllottedGeometry The space allotted for this widget
* @param InCurrentTime Current absolute real time
* @param InDeltaTime Real time passed since last tick
*/
virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
/**
* The system will use this event to notify a widget that the cursor has entered it. This event is NOT bubbled.
*
* @param MyGeometry The Geometry of the widget receiving the event
* @param MouseEvent Information about the input event
*/
virtual void OnMouseEnter(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
/**
* The system will use this event to notify a widget that the cursor has left it. This event is NOT bubbled.
*
* @param MouseEvent Information about the input event
*/
virtual void OnMouseLeave(const FPointerEvent& MouseEvent) override;
/**
* Called after a key is pressed when this widget has focus
*
* @param MyGeometry The Geometry of the widget receiving the event
* @param InKeyEvent Key event
*
* @return Returns whether the event was handled, along with other possible actions
*/
virtual FReply OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) override;
/**
* Called when the user is dropping something onto a widget; terminates drag and drop.
*
* @param MyGeometry The geometry of the widget receiving the event.
* @param DragDropEvent The drag and drop event.
*
* @return A reply that indicated whether this event was handled.
*/
virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
/**
* Called during drag and drop when the the mouse is being dragged over a widget.
*
* @param MyGeometry The geometry of the widget receiving the event.
* @param DragDropEvent The drag and drop event.
*
* @return A reply that indicated whether this event was handled.
*/
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
public:
/** Widget for the non-intrusive notifications. */
TSharedPtr<SNotificationList> NotificationList;
/** Holds all active and visible notifications, stored as FGuid -> SNotificationItemWeak. */
TMap<FString, SNotificationItemWeak> ActiveNotifications;
/** Overlay slot which contains the profiler settings widget. */
SOverlay::FOverlaySlot* OverlaySettingsSlot;
/** The number of seconds the profiler has been active */
float DurationActive;
private:
/** The handle to the active update duration tick */
TWeakPtr<FActiveTimerHandle> ActiveTimerHandle;
/** Holds all widgets for the profiler window like menu bar, toolbar and tabs. */
TSharedPtr<SVerticalBox> MainContentPanel;
int32 LiveSessionCount;
bool bAutoStartAnalysisForLiveSessions;
TArray<uint32> AutoStartedSessions; // tracks sessions that were auto started (in order to not start them again)
TSharedPtr<SSearchBox> AutoStartPlatformFilter;
TSharedPtr<SSearchBox> AutoStartAppNameFilter;
EBuildConfiguration AutoStartConfigurationTypeFilter;
EBuildTargetType AutoStartTargetTypeFilter;
TUniquePtr<Insights::FStoreBrowser> StoreBrowser;
uint64 TracesChangeSerial;
TArray<TSharedPtr<FTraceViewModel>> TraceViewModels;
TMap<uint32, TSharedPtr<FTraceViewModel>> TraceViewModelMap;
TSharedPtr<SListView<TSharedPtr<FTraceViewModel>>> TraceListView;
TSharedPtr<FTraceViewModel> SelectedTrace;
TSharedPtr<SEditableTextBox> HostTextBox;
FString SplashScreenOverlayTraceFile;
float SplashScreenOverlayFadeTime;
};