Files
UnrealEngineUWP/Engine/Source/Editor/LevelInstanceEditor/Private/LevelInstanceActorDetails.cpp
patrick enfedaque c827257cdb Level Instance:
- Track Move Actors to prevent discarding changes
- Track deleted packages through move operations so they get saved when committing Level instance
- Do not prompt for save anymore when committing existing Level instance
- Consolidate package save/delete tracking inside new LevelInstanceEditorObject

#rb richard.malo
#preflight 61d439b05b6f9bf2e698c4bb

#ROBOMERGE-AUTHOR: patrick.enfedaque
#ROBOMERGE-SOURCE: CL 18507029 in //UE5/Release-5.0/... via CL 18507031
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v899-18417669)

[CL 18507032 by patrick enfedaque in ue5-release-engine-test branch]
2022-01-04 07:28:59 -05:00

151 lines
4.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LevelInstanceActorDetails.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Input/SMultiLineEditableTextBox.h"
#include "ScopedTransaction.h"
#include "Engine/World.h"
#include "LevelInstance/LevelInstanceActor.h"
#define LOCTEXT_NAMESPACE "FLevelInstanceActorDetails"
namespace LevelInstanceActorDetailsCallbacks
{
static bool IsEditCommitButtonEnabled(TWeakObjectPtr<ALevelInstance> LevelInstanceActorPtr)
{
if (ALevelInstance* LevelInstanceActor = LevelInstanceActorPtr.Get())
{
return LevelInstanceActor->CanEdit() || LevelInstanceActor->CanCommit();
}
return false;
}
static FText GetEditCommitButtonText(TWeakObjectPtr<ALevelInstance> LevelInstanceActorPtr)
{
if (ALevelInstance* LevelInstanceActor = LevelInstanceActorPtr.Get())
{
if (LevelInstanceActor->CanCommit())
{
return LOCTEXT("CommitChanges", "Commit Changes");
}
}
return LOCTEXT("Edit", "Edit");
}
static FText GetEditCommitReasonText(TWeakObjectPtr<ALevelInstance> LevelInstanceActorPtr)
{
FText Reason;
if (ALevelInstance* LevelInstanceActor = LevelInstanceActorPtr.Get())
{
if (!LevelInstanceActor->IsEditing())
{
LevelInstanceActor->CanEdit(&Reason);
return Reason;
}
LevelInstanceActor->CanCommit(&Reason);
}
return Reason;
}
static EVisibility GetEditCommitReasonVisibility(TWeakObjectPtr<ALevelInstance> LevelInstanceActorPtr)
{
if (ALevelInstance* LevelInstanceActor = LevelInstanceActorPtr.Get())
{
return IsEditCommitButtonEnabled(LevelInstanceActor) ? EVisibility::Collapsed : EVisibility::Visible;
}
return EVisibility::Collapsed;
}
static FReply OnEditCommitButtonClicked(TWeakObjectPtr<ALevelInstance> LevelInstanceActorPtr)
{
if (ALevelInstance* LevelInstanceActor = LevelInstanceActorPtr.Get())
{
if (LevelInstanceActor->CanCommit())
{
LevelInstanceActor->Commit();
}
else if (LevelInstanceActor->CanEdit())
{
LevelInstanceActor->Edit();
}
}
return FReply::Handled();
}
}
FLevelInstanceActorDetails::FLevelInstanceActorDetails()
{
}
TSharedRef<IDetailCustomization> FLevelInstanceActorDetails::MakeInstance()
{
return MakeShareable(new FLevelInstanceActorDetails);
}
void FLevelInstanceActorDetails::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
TArray<TWeakObjectPtr<UObject>> EditingObjects;
DetailBuilder.GetObjectsBeingCustomized(EditingObjects);
if (EditingObjects.Num() > 1)
{
return;
}
TWeakObjectPtr<ALevelInstance> EditingObject = Cast<ALevelInstance>(EditingObjects[0].Get());
UWorld* World = EditingObject->GetWorld();
if (!World)
{
return;
}
IDetailCategoryBuilder& LevelInstanceEditingCategory = DetailBuilder.EditCategory("Level Edit", FText::GetEmpty(), ECategoryPriority::Transform);
LevelInstanceEditingCategory.AddCustomRow(FText::GetEmpty())
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.FillWidth(1)
[
SNew(SMultiLineEditableTextBox)
.Visibility_Static(&LevelInstanceActorDetailsCallbacks::GetEditCommitReasonVisibility, EditingObject)
.Font(DetailBuilder.GetDetailFontBold())
.BackgroundColor(TAttribute<FSlateColor>::Create(TAttribute<FSlateColor>::FGetter::CreateLambda([]() { return FEditorStyle::GetColor("ErrorReporting.WarningBackgroundColor"); })))
.Text_Static(&LevelInstanceActorDetailsCallbacks::GetEditCommitReasonText, EditingObject)
.AutoWrapText(true)
.IsReadOnly(true)
]
]
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.FillWidth(1)
[
SNew(SButton)
.IsEnabled_Static(&LevelInstanceActorDetailsCallbacks::IsEditCommitButtonEnabled, EditingObject)
.Text_Static(&LevelInstanceActorDetailsCallbacks::GetEditCommitButtonText, EditingObject)
.HAlign(HAlign_Center)
.OnClicked_Static(&LevelInstanceActorDetailsCallbacks::OnEditCommitButtonClicked, EditingObject)
]
]
];
}
#undef LOCTEXT_NAMESPACE