Files
UnrealEngineUWP/Engine/Source/Editor/DataLayerEditor/Private/DataLayer/DataLayerOutlinerIsDynamicallyLoadedColumn.cpp
richard malo 9a4289de40 - Changed Data Layer Visibility to be transient
- Added Data Layer bIsInitiallyVisible persistent flag to control Data Layer visibility flag initial value when loading map
- Fixed bug when changing map, Data Layer visibility was not properly reflected on actors
- Better Data Layer properties categorisation (Runtime vs Editor)
- Changing Data Layer IsDynamicallyLoaded flag is now only possible in its Details view
- Allow IsDynamicallyLoadedInEditor for any type of Data Layer
#rb jeanfrancois.dube, patrick.enfedaque

#ROBOMERGE-SOURCE: CL 15728575 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v781-15675533)

[CL 15728630 by richard malo in ue5-main branch]
2021-03-17 15:17:35 -04:00

121 lines
4.4 KiB
C++

// 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"
#include "Widgets/Input/SCheckBox.h"
#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())
.FixedWidth(40.f)
.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()
.Padding(2, 0, 0, 0)
.AutoWidth()
.VAlign(VAlign_Center)
[
SNew(SImage)
.ToolTipText(LOCTEXT("IsDynamicallyLoadedButtonToolTip", "Whether the Data Layer affects actor runtime loading"))
.Image_Lambda([this, TreeItem]()
{
FDataLayerTreeItem* DataLayerTreeItem = TreeItem->CastTo<FDataLayerTreeItem>();
const UDataLayer* DataLayer = DataLayerTreeItem->GetDataLayer();
if (DataLayer && DataLayer->IsDynamicallyLoaded())
{
return FEditorStyle::GetBrush("DataLayer.DynamicallyLoaded");
}
else
{
return FEditorStyle::GetBrush("DataLayer.NotDynamicallyLoaded");
}
})
]
+ 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);
}
}
const FScopedTransaction Transaction(LOCTEXT("ToggleDataLayersIsDynamicallyLoadedInEditor", "Toggle Data Layers Dynamically Loaded In Editor Flag"));
bSuccess = DataLayerEditorSubsystem->ToggleDataLayersIsDynamicallyLoadedInEditor(AllSelectedDataLayers);
}
else
{
const FScopedTransaction Transaction(LOCTEXT("ToggleDataLayerIsDynamicallyLoadedInEditor", "Toggle Data Layer Dynamically Loaded In Editor Flag"));
bSuccess = DataLayerEditorSubsystem->ToggleDataLayerIsDynamicallyLoadedInEditor(DataLayer);
}
if (!bSuccess)
{
// Cancelled : Undo last transaction
GEditor->Trans->Undo();
}
}
})
.ToolTipText(LOCTEXT("IsDynamicallyLoadedInEditorCheckBoxToolTip", "Toggle Data Layer Dynamically Loaded In Editor Flag"))
.HAlign(HAlign_Center)
];
}
return SNullWidget::NullWidget;
}
#undef LOCTEXT_NAMESPACE