Files
UnrealEngine/Engine/Source/Editor/SceneOutliner/Private/SceneOutlinerTextInfoColumn.cpp
2025-05-18 13:04:45 +08:00

92 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SceneOutlinerTextInfoColumn.h"
#include "ISceneOutliner.h"
#include "SceneOutlinerPublicTypes.h"
#include "SortHelper.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Views/SHeaderRow.h"
#define LOCTEXT_NAMESPACE "SceneOutlinerTextInfoColumn"
TSharedRef<ISceneOutlinerColumn> FTextInfoColumn::CreateTextInfoColumn(ISceneOutliner& Outliner, const FName InColumnName, const FGetTextForItem InGetTextForItem, const FText InColumnToolTip)
{
return TSharedRef<ISceneOutlinerColumn>(MakeShareable(new FTextInfoColumn(Outliner, InColumnName, InGetTextForItem, InColumnToolTip)));
}
FTextInfoColumn::FTextInfoColumn(ISceneOutliner& Outliner, const FName InColumnName, const FGetTextForItem& InGetTextForItem, const FText InColumnToolTip):
ColumnName(InColumnName),
ColumnToolTip(InColumnToolTip),
SceneOutlinerWeak(StaticCastSharedRef<ISceneOutliner>(Outliner.AsShared())),
GetTextForItem(InGetTextForItem)
{
}
FName FTextInfoColumn::GetColumnID()
{
return ColumnName;
}
SHeaderRow::FColumn::FArguments FTextInfoColumn::ConstructHeaderRowColumn()
{
return SHeaderRow::Column(ColumnName)
.DefaultTooltip(!ColumnToolTip.IsEmptyOrWhitespace() ? ColumnToolTip : TAttribute<FText>())
.FillWidth(2)
.HeaderComboVisibility(EHeaderComboVisibility::OnHover);
}
const TSharedRef< SWidget > FTextInfoColumn::ConstructRowWidget(FSceneOutlinerTreeItemRef TreeItem, const STableRow<FSceneOutlinerTreeItemPtr>& Row)
{
auto SceneOutliner = SceneOutlinerWeak.Pin();
check(SceneOutliner.IsValid());
TSharedRef<SHorizontalBox> HorizontalBox = SNew(SHorizontalBox);
TSharedRef<STextBlock> MainText = SNew(STextBlock)
.Text(this, &FTextInfoColumn::GetInfoForItem, TWeakPtr<ISceneOutlinerTreeItem>(TreeItem))
.HighlightText(SceneOutliner->GetFilterHighlightText())
.ColorAndOpacity(FSlateColor::UseSubduedForeground());
HorizontalBox->AddSlot()
.AutoWidth()
.VAlign(VAlign_Center)
.Padding(8, 0, 0, 0)
[
MainText
];
return HorizontalBox;
}
void FTextInfoColumn::PopulateSearchStrings(const ISceneOutlinerTreeItem& Item, TArray< FString >& OutSearchStrings) const
{
FString String = GetTextForItem.Execute(Item);
if (String.Len())
{
OutSearchStrings.Add(MoveTemp(String));
}
}
bool FTextInfoColumn::SupportsSorting() const
{
return true; // Text Columns are always sortable
}
void FTextInfoColumn::SortItems(TArray<FSceneOutlinerTreeItemPtr>& RootItems, const EColumnSortMode::Type SortMode) const
{
FSceneOutlinerSortHelper<FString>()
.Primary([this](const ISceneOutlinerTreeItem& Item) { return GetTextForItem.Execute(Item); }, SortMode)
.Sort(RootItems);
}
FText FTextInfoColumn::GetInfoForItem(TWeakPtr<ISceneOutlinerTreeItem> TreeItem) const
{
auto Item = TreeItem.Pin();
return Item.IsValid() ? FText::FromString(GetTextForItem.Execute(*Item)) : FText::GetEmpty();
}
#undef LOCTEXT_NAMESPACE