// Copyright Epic Games, Inc. All Rights Reserved. #include "Table.h" // Insights #include "Insights/Table/ViewModels/TableCellValueFormatter.h" #include "Insights/Table/ViewModels/TableCellValueGetter.h" #include "Insights/Table/ViewModels/TableCellValueSorter.h" #include "Insights/Table/ViewModels/TableColumn.h" #define LOCTEXT_NAMESPACE "Insights::FTable" namespace Insights { //////////////////////////////////////////////////////////////////////////////////////////////////// // FTable //////////////////////////////////////////////////////////////////////////////////////////////////// FTable::FTable() : Name(), Description(), Columns(), ColumnIdToPtrMapping() { } //////////////////////////////////////////////////////////////////////////////////////////////////// FTable::~FTable() { Reset(); } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::Reset() { Columns.Reset(); ColumnIdToPtrMapping.Reset(); } //////////////////////////////////////////////////////////////////////////////////////////////////// int32 FTable::GetColumnPositionIndex(const FName& ColumnId) const { return Columns.IndexOfByPredicate([&ColumnId](const TSharedRef& ColumnRef) -> bool { return ColumnRef->GetId() == ColumnId; }); } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::SetColumns(const TArray>& InColumns) { Columns.Reset(InColumns.Num()); ColumnIdToPtrMapping.Reset(); for (TSharedRef ColumnRef: InColumns) { AddColumn(ColumnRef); } } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::AddColumn(TSharedRef ColumnRef) { ColumnRef->SetParentTable(SharedThis(this)); Columns.Add(ColumnRef); ColumnIdToPtrMapping.Add(ColumnRef->GetId(), ColumnRef); } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::AddHierarchyColumn(int32 ColumnIndex, const TCHAR* ColumnName) { const FName HierarchyColumnId(TEXT("_Hierarchy")); TSharedRef ColumnRef = MakeShared(HierarchyColumnId); FTableColumn& Column = *ColumnRef; Column.SetIndex(ColumnIndex); const FString ColumnNameStr = ColumnName ? FString::Printf(TEXT("Hierarchy (%s)"), ColumnName) : TEXT("Hierarchy"); const FText ColumnNameText = FText::FromString(ColumnNameStr); Column.SetShortName(ColumnNameText); Column.SetTitleName(ColumnNameText); // TODO: Column.SetDescription(...); Column.SetFlags(ETableColumnFlags::ShouldBeVisible | ETableColumnFlags::CanBeFiltered | ETableColumnFlags::IsHierarchy); Column.SetHorizontalAlignment(HAlign_Left); Column.SetInitialWidth(90.0f); Column.SetDataType(ETableCellDataType::CString); TSharedRef Getter = MakeShared(); Column.SetValueGetter(Getter); TSharedRef Formatter = MakeShared(); Column.SetValueFormatter(Formatter); TSharedRef Sorter = MakeShared(ColumnRef); Column.SetValueSorter(Sorter); AddColumn(ColumnRef); } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::GetVisibleColumns(TArray>& InArray) const { for (const TSharedRef& Column: Columns) { if (Column->IsVisible()) { InArray.Add(Column); } } } //////////////////////////////////////////////////////////////////////////////////////////////////// void FTable::GetVisibleColumnsData(const TArray& InNodes, FString& OutData) const { constexpr TCHAR Separator = TEXT('\t'); TArray> VisibleColumns; GetVisibleColumns(VisibleColumns); // Table headers for (const TSharedRef& ColumnRef: VisibleColumns) { OutData += ColumnRef->GetShortName().ToString().ReplaceCharWithEscapedChar() + Separator; } if (OutData.Len() > 0) { OutData.RemoveAt(OutData.Len() - 1, 1, false); OutData.AppendChar(TEXT('\n')); } // Selected items for (Insights::FBaseTreeNodePtr Node: InNodes) { for (const TSharedRef& ColumnRef: VisibleColumns) { FText NodeText = ColumnRef->GetValueAsText(*Node); OutData += NodeText.ToString().ReplaceCharWithEscapedChar() + Separator; } if (OutData.Len() > 0) { OutData.RemoveAt(OutData.Len() - 1, 1, false); OutData.AppendChar(TEXT('\n')); } } } //////////////////////////////////////////////////////////////////////////////////////////////////// } // namespace Insights #undef LOCTEXT_NAMESPACE