EM_Task/TraceInsights/Private/Insights/ViewModels/StatsViewColumnFactory.cpp
Boshuang Zhao 5144a49c9b add
2026-02-13 16:18:33 +08:00

666 lines
28 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "StatsViewColumnFactory.h"
// Insights
#include "Insights/Common/TimeUtils.h"
#include "Insights/Table/ViewModels/TableCellValueFormatter.h"
#include "Insights/Table/ViewModels/TableCellValueGetter.h"
#include "Insights/Table/ViewModels/TableCellValueSorter.h"
#include "Insights/ViewModels/StatsGroupingAndSorting.h"
#include "Insights/ViewModels/StatsNodeHelper.h"
#define LOCTEXT_NAMESPACE "SStatsView"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Column identifiers
const FName FStatsViewColumns::NameColumnID(TEXT("Name"));
const FName FStatsViewColumns::MetaGroupNameColumnID(TEXT("MetaGroupName"));
const FName FStatsViewColumns::TypeColumnID(TEXT("Type"));
const FName FStatsViewColumns::DataTypeColumnID(TEXT("DataType"));
const FName FStatsViewColumns::CountColumnID(TEXT("Count"));
const FName FStatsViewColumns::SumColumnID(TEXT("Sum"));
const FName FStatsViewColumns::MaxColumnID(TEXT("Max"));
const FName FStatsViewColumns::UpperQuartileColumnID(TEXT("UpperQuartile"));
const FName FStatsViewColumns::AverageColumnID(TEXT("Average"));
const FName FStatsViewColumns::MedianColumnID(TEXT("Median"));
const FName FStatsViewColumns::LowerQuartileColumnID(TEXT("LowerQuartile"));
const FName FStatsViewColumns::MinColumnID(TEXT("Min"));
////////////////////////////////////////////////////////////////////////////////////////////////////
void FStatsViewColumnFactory::CreateStatsViewColumns(TArray<TSharedRef<Insights::FTableColumn>>& Columns)
{
Columns.Reset();
Columns.Add(CreateNameColumn());
Columns.Add(CreateMetaGroupNameColumn());
Columns.Add(CreateTypeColumn());
Columns.Add(CreateDataTypeColumn());
Columns.Add(CreateCountColumn());
Columns.Add(CreateSumColumn());
Columns.Add(CreateMaxColumn());
// Columns.Add(CreateUpperQuartileColumn());
Columns.Add(CreateAverageColumn());
Columns.Add(CreateMedianColumn());
// Columns.Add(CreateLowerQuartileColumn());
Columns.Add(CreateMinColumn());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateNameColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::NameColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Name_ColumnName", "Name"));
Column.SetTitleName(LOCTEXT("Name_ColumnTitle", "Stats or Group Name"));
Column.SetDescription(LOCTEXT("Name_ColumnDesc", "Name of stats 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<ITableCellValueGetter> Getter = MakeShared<FDisplayNameValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByName>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateMetaGroupNameColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::MetaGroupNameColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("MetaGroupName_ColumnName", "Meta Group"));
Column.SetTitleName(LOCTEXT("MetaGroupName_ColumnTitle", "Meta Group Name"));
Column.SetDescription(LOCTEXT("MetaGroupName_ColumnDesc", "Name of meta group"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(100.0f);
Column.SetDataType(ETableCellDataType::Text);
class FMetaGroupNameValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::MetaGroupNameColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(FText::FromName(StatsNode.GetMetaGroupName())));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMetaGroupNameValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByTextValue>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateTypeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::TypeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Type_ColumnName", "Type"));
Column.SetTitleName(LOCTEXT("Type_ColumnTitle", "Type"));
Column.SetDescription(LOCTEXT("Type_ColumnDesc", "Type of stats counter or group"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Text);
class FStatsTypeValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::TypeColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNodeTypeHelper::ToText(StatsNode.GetType())));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FStatsTypeValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByTextValue>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByStatsType>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateDataTypeColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::DataTypeColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("DataType_ColumnName", "DataType"));
Column.SetTitleName(LOCTEXT("DataType_ColumnTitle", "Data Type"));
Column.SetDescription(LOCTEXT("DataType_ColumnDesc", "Data type of counter values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Left);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Text);
class FStatsTypeValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::DataTypeColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNodeDataTypeHelper::ToText(StatsNode.GetDataType())));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FStatsTypeValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FTextValueFormatter>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByTextValue>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByDataType>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateCountColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::CountColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Count_ColumnName", "Count"));
Column.SetTitleName(LOCTEXT("Count_ColumnTitle", "Sample Count"));
Column.SetDescription(LOCTEXT("Count_ColumnDesc", "Number of selected samples"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(60.0f);
Column.SetDataType(ETableCellDataType::Int64);
Column.SetAggregation(ETableColumnAggregation::Sum);
class FCountValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::CountColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(static_cast<int64>(StatsNode.GetAggregatedStats().Count)));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FCountValueGetter>();
Column.SetValueGetter(Getter);
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FInt64ValueFormatterAsNumber>();
Column.SetValueFormatter(Formatter);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByInt64Value>(ColumnRef);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByCount>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateSumColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::SumColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Sum_ColumnName", "Sum"));
Column.SetTitleName(LOCTEXT("Sum_ColumnTitle", "Sum"));
Column.SetDescription(LOCTEXT("Sum_ColumnDesc", "Sum of selected samples"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
Column.SetAggregation(ETableColumnAggregation::Sum);
class FSumValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::SumColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.Sum));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FSumValueGetter>();
Column.SetValueGetter(Getter);
class FSumValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::SumColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsSum();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FSumValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingBySum>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateMaxColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::MaxColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Max_ColumnName", "Max"));
Column.SetTitleName(LOCTEXT("Max_ColumnTitle", "Maximum"));
Column.SetDescription(LOCTEXT("Max_ColumnDesc", "Maximum of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
// Column.SetAggregation(ETableColumnAggregation::Max);
class FMaxValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::MaxColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.Max));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMaxValueGetter>();
Column.SetValueGetter(Getter);
class FMaxValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::MaxColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsMax();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FMaxValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByMax>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateUpperQuartileColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::UpperQuartileColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("UpperQuartile_ColumnName", "Upper"));
Column.SetTitleName(LOCTEXT("UpperQuartile_ColumnTitle", "Upper Quartile"));
Column.SetDescription(LOCTEXT("UpperQuartile_ColumnDesc", "Upper quartile (Q3; third quartile; 75th percentile) of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
// Column.SetAggregation(ETableColumnAggregation::Max);
class FUpperQuartileValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::UpperQuartileColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.UpperQuartile));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FUpperQuartileValueGetter>();
Column.SetValueGetter(Getter);
class FUpperQuartileValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::UpperQuartileColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsUpperQuartile();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FUpperQuartileValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByUpperQuartile>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateAverageColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::AverageColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Average_ColumnName", "Avg."));
Column.SetTitleName(LOCTEXT("Average_ColumnTitle", "Average"));
Column.SetDescription(LOCTEXT("Average_ColumnDesc", "Average (arithmetic mean) of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
class FAverageValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::AverageColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.Average));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FAverageValueGetter>();
Column.SetValueGetter(Getter);
class FAverageValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::AverageColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsAverage();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FAverageValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByAverage>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateMedianColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::MedianColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Median_ColumnName", "Med."));
Column.SetTitleName(LOCTEXT("Median_ColumnTitle", "Median"));
Column.SetDescription(LOCTEXT("Median_ColumnDesc", "Median (Q2; second quartile; 50th percentile) of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
class FMedianValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::MedianColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.Median));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMedianValueGetter>();
Column.SetValueGetter(Getter);
class FMedianValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::MedianColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsMedian();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FMedianValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByMedian>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateLowerQuartileColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::LowerQuartileColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("LowerQuartile_ColumnName", "Lower"));
Column.SetTitleName(LOCTEXT("LowerQuartile_ColumnTitle", "Lower Quartile"));
Column.SetDescription(LOCTEXT("LowerQuartile_ColumnDesc", "Lower quartile (Q1; first quartile; 25th percentile) of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
// ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
// Column.SetAggregation(ETableColumnAggregation::Min);
class FLowerQuartileValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::LowerQuartileColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.LowerQuartile));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FLowerQuartileValueGetter>();
Column.SetValueGetter(Getter);
class FLowerQuartileValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::LowerQuartileColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsLowerQuartile();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FLowerQuartileValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByLowerQuartile>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
TSharedRef<Insights::FTableColumn> FStatsViewColumnFactory::CreateMinColumn()
{
using namespace Insights;
TSharedRef<FTableColumn> ColumnRef = MakeShared<FTableColumn>(FStatsViewColumns::MinColumnID);
FTableColumn& Column = *ColumnRef;
Column.SetShortName(LOCTEXT("Min_ColumnName", "Min"));
Column.SetTitleName(LOCTEXT("Min_ColumnTitle", "Minimum"));
Column.SetDescription(LOCTEXT("Min_ColumnDesc", "Minimum of selected values"));
Column.SetFlags(ETableColumnFlags::CanBeHidden |
ETableColumnFlags::ShouldBeVisible |
ETableColumnFlags::CanBeFiltered);
Column.SetHorizontalAlignment(HAlign_Right);
Column.SetInitialWidth(AggregatedStatsColumnInitialWidth);
Column.SetDataType(ETableCellDataType::Double);
// Column.SetAggregation(ETableColumnAggregation::Min);
class FMinValueGetter: public FTableCellValueGetter
{
public:
virtual const TOptional<FTableCellValue> GetValue(const FTableColumn& Column, const FBaseTreeNode& Node) const
{
ensure(Column.GetId() == FStatsViewColumns::MinColumnID);
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return TOptional<FTableCellValue>(FTableCellValue(StatsNode.GetAggregatedStats().DoubleStats.Min));
}
};
TSharedRef<ITableCellValueGetter> Getter = MakeShared<FMinValueGetter>();
Column.SetValueGetter(Getter);
class FMinValueFormatter: public FTableCellValueFormatter
{
public:
virtual FText FormatValue(const FTableColumn& Column, const FBaseTreeNode& Node) const override
{
ensure(Column.GetId() == FStatsViewColumns::MinColumnID);
// check(Node.Is<FStatsNode>());
const FStatsNode& StatsNode = static_cast<const FStatsNode&>(Node);
return StatsNode.GetTextForAggregatedStatsMin();
}
};
TSharedRef<ITableCellValueFormatter> Formatter = MakeShared<FMinValueFormatter>();
Column.SetValueFormatter(Formatter);
TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FSorterByDoubleValue>(ColumnRef);
// TSharedRef<ITableCellValueSorter> Sorter = MakeShared<FStatsNodeSortingByMin>(ColumnRef);
Column.SetValueSorter(Sorter);
return ColumnRef;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
#undef LOCTEXT_NAMESPACE