You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
- 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]
121 lines
4.4 KiB
C++
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 |