// Copyright Epic Games, Inc. All Rights Reserved. #include "NetStatsViewColumnFactory.h" // Insights #include "Insights/Table/ViewModels/TableCellValueFormatter.h" #include "Insights/Table/ViewModels/TableCellValueGetter.h" #include "Insights/Table/ViewModels/TableCellValueSorter.h" #include "Insights/NetworkingProfiler/ViewModels/NetEventGroupingAndSorting.h" #include "Insights/NetworkingProfiler/ViewModels/NetEventNodeHelper.h" #define LOCTEXT_NAMESPACE "SNetStatsView" //////////////////////////////////////////////////////////////////////////////////////////////////// // Column identifiers const FName FNetStatsViewColumns::NameColumnID(TEXT("Name")); // TEXT("_Hierarchy") const FName FNetStatsViewColumns::TypeColumnID(TEXT("Type")); const FName FNetStatsViewColumns::LevelColumnID(TEXT("Level")); const FName FNetStatsViewColumns::InstanceCountColumnID(TEXT("Count")); // Inclusive columns const FName FNetStatsViewColumns::TotalInclusiveSizeColumnID(TEXT("TotalIncl")); const FName FNetStatsViewColumns::MaxInclusiveSizeColumnID(TEXT("MaxIncl")); const FName FNetStatsViewColumns::AverageInclusiveSizeColumnID(TEXT("AverageIncl")); // Exclusive columns const FName FNetStatsViewColumns::TotalExclusiveSizeColumnID(TEXT("TotalExcl")); const FName FNetStatsViewColumns::MaxExclusiveSizeColumnID(TEXT("MaxExcl")); const FName FNetStatsViewColumns::AverageExclusiveSizeColumnID(TEXT("AverageExcl")); //////////////////////////////////////////////////////////////////////////////////////////////////// void FNetStatsViewColumnFactory::CreateNetStatsViewColumns(TArray>& Columns) { Columns.Reset(); Columns.Add(CreateNameColumn()); Columns.Add(CreateTypeColumn()); Columns.Add(CreateLevelColumn()); Columns.Add(CreateInstanceCountColumn()); Columns.Add(CreateTotalInclusiveSizeColumn()); Columns.Add(CreateMaxInclusiveSizeColumn()); Columns.Add(CreateAverageInclusiveSizeColumn()); Columns.Add(CreateTotalExclusiveSizeColumn()); Columns.Add(CreateMaxExclusiveSizeColumn()); // Columns.Add(CreateAverageExclusiveSizeColumn()); } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateNameColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::NameColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("Name_ColumnName", "Name")); Column.SetTitleName(LOCTEXT("Name_ColumnTitle", "NetEvent or Group Name")); Column.SetDescription(LOCTEXT("Name_ColumnDesc", "Name of the timer or group")); Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered | ETableColumnFlags::IsHierarchy); Column.SetHorizontalAlignment(HAlign_Left); Column.SetInitialWidth(206.0f); Column.SetMinWidth(42.0f); Column.SetDataType(ETableCellDataType::Text); TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateTypeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::TypeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("Type_ColumnName", "Type")); Column.SetTitleName(LOCTEXT("Type_ColumnTitle", "Type")); Column.SetDescription(LOCTEXT("Type_ColumnDesc", "Type of timer or group")); Column.SetFlags(ETableColumnFlags::CanBeHidden | // ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Left); Column.SetInitialWidth(60.0f); Column.SetDataType(ETableCellDataType::Text); class FNetEventTypeValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::TypeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(NetEventNodeTypeHelper::ToText(NetEventNode.GetType()))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); // TSharedRef Sorter = MakeShared(ColumnRef); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateLevelColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::LevelColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("Level_ColumnName", "Level")); Column.SetTitleName(LOCTEXT("Level_ColumnTitle", "Level")); Column.SetDescription(LOCTEXT("Level_ColumnDesc", "Level of net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(40.0f); Column.SetDataType(ETableCellDataType::Int64); class FLevelValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::LevelColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetLevel()))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateInstanceCountColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::InstanceCountColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("InstanceCount_ColumnName", "Count")); Column.SetTitleName(LOCTEXT("InstanceCount_ColumnTitle", "Instance Count")); Column.SetDescription(LOCTEXT("InstanceCount_ColumnDesc", "Number of net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(60.0f); Column.SetDataType(ETableCellDataType::Int64); class FInstanceCountValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::InstanceCountColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().InstanceCount))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); // TSharedRef Sorter = MakeShared(ColumnRef); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// // Inclusive Columns //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateTotalInclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::TotalInclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("TotalInclusive_ColumnName", "Incl")); Column.SetTitleName(LOCTEXT("TotalInclusive_ColumnTitle", "Total Inclusive Size")); Column.SetDescription(LOCTEXT("TotalInclusive_ColumnDesc", "Total inclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(TotalSizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); Column.SetAggregation(ETableColumnAggregation::Sum); class FTotalInclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::TotalInclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().TotalInclusive))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); // TSharedRef Sorter = MakeShared(ColumnRef); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateMaxInclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::MaxInclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("MaxInclusive_ColumnName", "I.Max")); Column.SetTitleName(LOCTEXT("MaxInclusive_ColumnTitle", "Max Inclusive Size")); Column.SetDescription(LOCTEXT("MaxInclusive_ColumnDesc", "Maximum inclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | // ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(SizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); class FMaxInclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::MaxInclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().MaxInclusive))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateAverageInclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::AverageInclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("AvgInclusive_ColumnName", "I.Avg")); Column.SetTitleName(LOCTEXT("AvgInclusive_ColumnTitle", "Average Inclusive Size")); Column.SetDescription(LOCTEXT("AvgInclusive_ColumnDesc", "Average inclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | // ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(SizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); class FAverageInclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::AverageInclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().AverageInclusive))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// // Exclusive Columns //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateTotalExclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::TotalExclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("TotalExclusive_ColumnName", "Excl")); Column.SetTitleName(LOCTEXT("TotalExclusive_ColumnTitle", "Total Exclusive Size")); Column.SetDescription(LOCTEXT("TotalExclusive_ColumnDesc", "Total exclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(TotalSizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); Column.SetAggregation(ETableColumnAggregation::Sum); class FTotalExclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::TotalExclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().TotalExclusive))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); // TSharedRef Sorter = MakeShared Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateMaxExclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::MaxExclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("MaxExclusive_ColumnName", "E.Max")); Column.SetTitleName(LOCTEXT("MaxExclusive_ColumnTitle", "Max Exclusive Size")); Column.SetDescription(LOCTEXT("MaxExclusive_ColumnDesc", "Maximum exclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | // ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(SizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); class FMaxExclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::MaxExclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().MaxExclusive))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// TSharedRef FNetStatsViewColumnFactory::CreateAverageExclusiveSizeColumn() { using namespace Insights; TSharedRef ColumnRef = MakeShared(FNetStatsViewColumns::AverageExclusiveSizeColumnID); FTableColumn& Column = *ColumnRef; Column.SetShortName(LOCTEXT("AvgExclusive_ColumnName", "E.Avg")); Column.SetTitleName(LOCTEXT("AvgExclusive_ColumnTitle", "Average Exclusive Size)")); Column.SetDescription(LOCTEXT("AvgExclusive_ColumnDesc", "Average exclusive size (bits) of selected net event instances")); Column.SetFlags(ETableColumnFlags::CanBeHidden | // ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered); Column.SetHorizontalAlignment(HAlign_Right); Column.SetInitialWidth(SizeColumnInitialWidth); Column.SetDataType(ETableCellDataType::Int64); class FAverageExclusiveValueGetter: public FTableCellValueGetter { public: virtual const TOptional GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const { ensure(Column.GetId() == FNetStatsViewColumns::AverageExclusiveSizeColumnID); const FNetEventNode& NetEventNode = static_cast(Node); // return TOptional(FTableCellValue(static_cast(NetEventNode.GetAggregatedStats().AverageExclusive))); return TOptional(FTableCellValue(int64(0))); } }; TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); return ColumnRef; } //////////////////////////////////////////////////////////////////////////////////////////////////// #undef LOCTEXT_NAMESPACE