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

109 lines
3.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DataLayerOutlinerDeleteButtonColumn.h"
#include "Containers/Array.h"
#include "DataLayer/DataLayerEditorSubsystem.h"
#include "DataLayerActorTreeItem.h"
#include "HAL/Platform.h"
#include "HAL/PlatformCrt.h"
#include "ISceneOutlinerTreeItem.h"
#include "Input/Reply.h"
#include "Internationalization/Internationalization.h"
#include "Internationalization/Text.h"
#include "Layout/Margin.h"
#include "Layout/Visibility.h"
#include "Misc/Attribute.h"
#include "SceneOutlinerPublicTypes.h"
#include "Styling/AppStyle.h"
#include "Templates/TypeHash.h"
#include "Types/SlateEnums.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Images/SImage.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Layout/SSpacer.h"
#include "Widgets/SNullWidget.h"
#include "Widgets/Views/SHeaderRow.h"
#include "Widgets/Views/STreeView.h"
#include "WorldPartition/DataLayer/DataLayerInstance.h"
class AActor;
class SWidget;
template <typename ItemType> class STableRow;
#define LOCTEXT_NAMESPACE "DataLayer"
FName FDataLayerOutlinerDeleteButtonColumn::GetID()
{
static FName DataLayeDeleteButton("Remove Actor");
return DataLayeDeleteButton;
}
SHeaderRow::FColumn::FArguments FDataLayerOutlinerDeleteButtonColumn::ConstructHeaderRowColumn()
{
return SHeaderRow::Column(GetColumnID())
.FixedWidth(40.f)
.DefaultTooltip(FText::FromName(GetColumnID()))
[
SNew(SSpacer)
];
}
const TSharedRef<SWidget> FDataLayerOutlinerDeleteButtonColumn::ConstructRowWidget(FSceneOutlinerTreeItemRef TreeItem, const STableRow<FSceneOutlinerTreeItemPtr>& Row)
{
if (FDataLayerActorTreeItem* DataLayerActorItem = TreeItem->CastTo<FDataLayerActorTreeItem>())
{
return SNew(SButton)
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.ButtonStyle(FAppStyle::Get(), "DataLayerBrowserButton")
.ContentPadding(0)
.Visibility_Lambda([this, TreeItem, DataLayerActorItem]()
{
AActor* Actor = DataLayerActorItem->GetActor();
const UDataLayerInstance* DataLayerInstance = DataLayerActorItem->GetDataLayer();
return (Actor && Actor->IsUserManaged() && DataLayerInstance && DataLayerInstance->CanRemoveActor(Actor) && DataLayerInstance->CanUserRemoveActors() && TreeItem->CanInteract()) ? EVisibility::Visible : EVisibility::Collapsed;
})
.OnClicked_Lambda([this, TreeItem, DataLayerActorItem]()
{
AActor* Actor = DataLayerActorItem->GetActor();
const UDataLayerInstance* DataLayerInstance = DataLayerActorItem->GetDataLayer();
if (Actor && DataLayerInstance)
{
UDataLayerEditorSubsystem* DataLayerEditorSubsystem = UDataLayerEditorSubsystem::Get();
if (auto SceneOutliner = WeakSceneOutliner.IsValid() ? WeakSceneOutliner.Pin() : nullptr)
{
const auto& Tree = SceneOutliner->GetTree();
if (SceneOutliner->GetSharedData().CustomDelete.IsBound())
{
TArray<TWeakPtr<ISceneOutlinerTreeItem>> SelectedItems;
if (Tree.IsItemSelected(TreeItem))
{
for (auto& SelectedItem : Tree.GetSelectedItems())
{
if (FDataLayerActorTreeItem* SelectedDataLayerActorTreeItem = SelectedItem->CastTo<FDataLayerActorTreeItem>())
{
SelectedItems.Add(SelectedDataLayerActorTreeItem->AsShared());
}
}
}
else
{
SelectedItems.Add(TreeItem);
}
SceneOutliner->GetSharedData().CustomDelete.Execute(SelectedItems);
}
}
}
return FReply::Handled();
})
.ToolTipText(LOCTEXT("RemoveFromDataLayerButtonText", "Remove from Data Layer"))
[
SNew(SImage)
.Image(FAppStyle::GetBrush(TEXT("DataLayerBrowser.Actor.RemoveFromDataLayer")))
];
}
return SNullWidget::NullWidget;
}
#undef LOCTEXT_NAMESPACE