Files
UnrealEngineUWP/Engine/Source/Editor/DataLayerEditor/Private/DataLayer/DataLayerOutlinerDeleteButtonColumn.cpp
richard malo 14620f45a3 External Data Layer V1
- Allows for plugins to inject/remove content (actors) in a partitioned world
- Serves as a replacement for the experimental 'Content Bundle' feature
- Added new External Data Layer (EDL) Asset
- Added new Game Feature Action 'AddWorldPartitionContent' to control activation of an EDL asset
- Supports Data Layers inside a plugin (child of an EDL)
- Added builder to convert content bundles to EDL (UGameFeatureActionConvertContentBundleWorldPartitionBuilder)
- Feature is temporarily disabled by default and can be turned on using Editor Experimental Settings 'Enable World Partition External Data Layers' flag
#jira UE-204248
#rb JeanFrancois.Dube, Patrick.Enfedaque, Sebastien.Lussier
#tests QAGame PIE/-game/cooked, Regression test PIE/cook of latest game map, Tested PIE/cook of latest game map converted to EDL

[CL 31015614 by richard malo in ue5-main branch]
2024-01-30 14:18:27 -05:00

109 lines
3.6 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 && 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