2020-10-28 06:51:40 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "DataLayerOutlinerIsDynamicallyLoadedColumn.h"
|
|
|
|
|
#include "DataLayer/DataLayerEditorSubsystem.h"
|
|
|
|
|
#include "DataLayerTreeItem.h"
|
|
|
|
|
#include "Widgets/Images/SImage.h"
|
|
|
|
|
#include "Widgets/Input/SButton.h"
|
2020-11-09 10:53:09 -04:00
|
|
|
#include "Widgets/Input/SCheckBox.h"
|
2020-10-28 06:51:40 -04:00
|
|
|
#include "Widgets/Views/STreeView.h"
|
|
|
|
|
#include "ScopedTransaction.h"
|
|
|
|
|
#include "EditorStyleSet.h"
|
|
|
|
|
#include "Editor.h"
|
|
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "DataLayer"
|
|
|
|
|
|
|
|
|
|
FName FDataLayerOutlinerIsDynamicallyLoadedColumn::GetID()
|
|
|
|
|
{
|
|
|
|
|
static FName DataLayerIsDynamicallyLoaded("DataLayerIsDynamicallyLoaded");
|
|
|
|
|
return DataLayerIsDynamicallyLoaded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SHeaderRow::FColumn::FArguments FDataLayerOutlinerIsDynamicallyLoadedColumn::ConstructHeaderRowColumn()
|
|
|
|
|
{
|
|
|
|
|
return SHeaderRow::Column(GetColumnID())
|
2020-11-09 10:53:09 -04:00
|
|
|
.FixedWidth(40.f)
|
2020-10-28 06:51:40 -04:00
|
|
|
.HAlignHeader(HAlign_Center)
|
|
|
|
|
.VAlignHeader(VAlign_Center)
|
|
|
|
|
.HAlignCell(HAlign_Center)
|
|
|
|
|
.VAlignCell(VAlign_Center)
|
|
|
|
|
[
|
|
|
|
|
SNew(SImage)
|
|
|
|
|
.ColorAndOpacity(FSlateColor::UseForeground())
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TSharedRef<SWidget> FDataLayerOutlinerIsDynamicallyLoadedColumn::ConstructRowWidget(FSceneOutlinerTreeItemRef TreeItem, const STableRow<FSceneOutlinerTreeItemPtr>& Row)
|
|
|
|
|
{
|
|
|
|
|
if (TreeItem->IsA<FDataLayerTreeItem>())
|
|
|
|
|
{
|
|
|
|
|
return SNew(SHorizontalBox)
|
|
|
|
|
+ SHorizontalBox::Slot()
|
2020-11-09 10:53:09 -04:00
|
|
|
.Padding(2, 0, 0, 0)
|
2020-10-28 06:51:40 -04:00
|
|
|
.AutoWidth()
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
[
|
2021-03-17 15:17:35 -04:00
|
|
|
SNew(SImage)
|
|
|
|
|
.ToolTipText(LOCTEXT("IsDynamicallyLoadedButtonToolTip", "Whether the Data Layer affects actor runtime loading"))
|
|
|
|
|
.Image_Lambda([this, TreeItem]()
|
2020-10-28 06:51:40 -04:00
|
|
|
{
|
|
|
|
|
FDataLayerTreeItem* DataLayerTreeItem = TreeItem->CastTo<FDataLayerTreeItem>();
|
2021-03-17 15:17:35 -04:00
|
|
|
const UDataLayer* DataLayer = DataLayerTreeItem->GetDataLayer();
|
|
|
|
|
if (DataLayer && DataLayer->IsDynamicallyLoaded())
|
2020-10-28 06:51:40 -04:00
|
|
|
{
|
2021-03-17 15:17:35 -04:00
|
|
|
return FEditorStyle::GetBrush("DataLayer.DynamicallyLoaded");
|
2020-10-28 06:51:40 -04:00
|
|
|
}
|
2021-03-17 15:17:35 -04:00
|
|
|
else
|
2020-10-28 06:51:40 -04:00
|
|
|
{
|
2021-03-17 15:17:35 -04:00
|
|
|
return FEditorStyle::GetBrush("DataLayer.NotDynamicallyLoaded");
|
|
|
|
|
}
|
|
|
|
|
})
|
2020-11-09 10:53:09 -04:00
|
|
|
]
|
|
|
|
|
+ SHorizontalBox::Slot()
|
|
|
|
|
.Padding(2, 0, 0, 0)
|
|
|
|
|
.AutoWidth()
|
|
|
|
|
.VAlign(VAlign_Center)
|
|
|
|
|
[
|
|
|
|
|
SNew(SCheckBox)
|
|
|
|
|
.IsChecked_Lambda([this, TreeItem]()
|
|
|
|
|
{
|
|
|
|
|
FDataLayerTreeItem* DataLayerTreeItem = TreeItem->CastTo<FDataLayerTreeItem>();
|
|
|
|
|
UDataLayer* DataLayer = DataLayerTreeItem->GetDataLayer();
|
|
|
|
|
return DataLayer && DataLayer->IsDynamicallyLoadedInEditor() ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;
|
|
|
|
|
})
|
|
|
|
|
.OnCheckStateChanged_Lambda([this, TreeItem](ECheckBoxState NewState)
|
|
|
|
|
{
|
|
|
|
|
bool bNewState = (NewState == ECheckBoxState::Checked);
|
|
|
|
|
FDataLayerTreeItem* DataLayerTreeItem = TreeItem->CastTo<FDataLayerTreeItem>();
|
|
|
|
|
if (UDataLayer* DataLayer = DataLayerTreeItem->GetDataLayer())
|
|
|
|
|
{
|
|
|
|
|
bool bSuccess = false;
|
|
|
|
|
UDataLayerEditorSubsystem* DataLayerEditorSubsystem = UDataLayerEditorSubsystem::Get();
|
|
|
|
|
const auto& Tree = WeakSceneOutliner.Pin()->GetTree();
|
|
|
|
|
if (Tree.IsItemSelected(TreeItem))
|
|
|
|
|
{
|
|
|
|
|
// Toggle IsDynamicallyLoadedInEditor flag of selected DataLayers to the same state as the given DataLayer
|
|
|
|
|
bool bIsDynamicallyLoadedInEditor = DataLayer->IsDynamicallyLoadedInEditor();
|
|
|
|
|
|
|
|
|
|
TArray<UDataLayer*> AllSelectedDataLayers;
|
|
|
|
|
for (auto& SelectedItem : Tree.GetSelectedItems())
|
|
|
|
|
{
|
|
|
|
|
FDataLayerTreeItem* SelectedDataLayerTreeItem = SelectedItem->CastTo<FDataLayerTreeItem>();
|
|
|
|
|
UDataLayer* SelectedDataLayer = SelectedDataLayerTreeItem ? SelectedDataLayerTreeItem->GetDataLayer() : nullptr;
|
|
|
|
|
if (SelectedDataLayer && SelectedDataLayer->IsDynamicallyLoadedInEditor() == bIsDynamicallyLoadedInEditor)
|
|
|
|
|
{
|
|
|
|
|
AllSelectedDataLayers.Add(SelectedDataLayer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-17 15:17:35 -04:00
|
|
|
const FScopedTransaction Transaction(LOCTEXT("ToggleDataLayersIsDynamicallyLoadedInEditor", "Toggle Data Layers Dynamically Loaded In Editor Flag"));
|
2020-11-09 10:53:09 -04:00
|
|
|
bSuccess = DataLayerEditorSubsystem->ToggleDataLayersIsDynamicallyLoadedInEditor(AllSelectedDataLayers);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2021-03-17 15:17:35 -04:00
|
|
|
const FScopedTransaction Transaction(LOCTEXT("ToggleDataLayerIsDynamicallyLoadedInEditor", "Toggle Data Layer Dynamically Loaded In Editor Flag"));
|
2020-11-09 10:53:09 -04:00
|
|
|
bSuccess = DataLayerEditorSubsystem->ToggleDataLayerIsDynamicallyLoadedInEditor(DataLayer);
|
|
|
|
|
}
|
|
|
|
|
if (!bSuccess)
|
|
|
|
|
{
|
|
|
|
|
// Cancelled : Undo last transaction
|
|
|
|
|
GEditor->Trans->Undo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
2021-03-17 15:17:35 -04:00
|
|
|
.ToolTipText(LOCTEXT("IsDynamicallyLoadedInEditorCheckBoxToolTip", "Toggle Data Layer Dynamically Loaded In Editor Flag"))
|
2020-11-09 10:53:09 -04:00
|
|
|
.HAlign(HAlign_Center)
|
2020-10-28 06:51:40 -04:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
return SNullWidget::NullWidget;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|