Files
UnrealEngineUWP/Engine/Source/Editor/DetailCustomizations/Private/LevelSequenceActorDetails.cpp
jeanfrancois dube 383f7e12fc Make sure the sequencer code always try to load bindings in order to properly resolve unloaded objects.
Also converted lots of code to go through LoadSequence instead of manually calling TryLoad.

#rb andrew.rodham

#ROBOMERGE-SOURCE: CL 15315165 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v771-15082668)

[CL 15315175 by jeanfrancois dube in ue5-main branch]
2021-02-04 11:14:06 -04:00

164 lines
5.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LevelSequenceActorDetails.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/Input/SButton.h"
#include "Editor.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "DetailCategoryBuilder.h"
#include "IDetailsView.h"
#include "LevelSequenceActor.h"
#include "Algo/Transform.h"
#include "Subsystems/AssetEditorSubsystem.h"
#define LOCTEXT_NAMESPACE "LevelSequenceActorDetails"
TSharedRef<IDetailCustomization> FLevelSequenceActorDetails::MakeInstance()
{
return MakeShareable( new FLevelSequenceActorDetails );
}
void AddAllSubObjectProperties(TArray<UObject*>& SubObjects, IDetailCategoryBuilder& Category, TAttribute<EVisibility> Visibility = TAttribute<EVisibility>(EVisibility::Visible))
{
SubObjects.Remove(nullptr);
if (!SubObjects.Num())
{
return;
}
for (const FProperty* TestProperty : TFieldRange<FProperty>(SubObjects[0]->GetClass()))
{
if (TestProperty->HasAnyPropertyFlags(CPF_Edit))
{
const bool bAdvancedDisplay = TestProperty->HasAnyPropertyFlags(CPF_AdvancedDisplay);
const EPropertyLocation::Type PropertyLocation = bAdvancedDisplay ? EPropertyLocation::Advanced : EPropertyLocation::Common;
IDetailPropertyRow* NewRow = Category.AddExternalObjectProperty(SubObjects, TestProperty->GetFName(), PropertyLocation);
if (NewRow)
{
NewRow->Visibility(Visibility);
}
}
}
}
void FLevelSequenceActorDetails::CustomizeDetails( IDetailLayoutBuilder& DetailLayout )
{
const TArray< TWeakObjectPtr<UObject> >& SelectedObjects = DetailLayout.GetSelectedObjects();
for( int32 ObjectIndex = 0; ObjectIndex < SelectedObjects.Num(); ++ObjectIndex )
{
const TWeakObjectPtr<UObject>& CurrentObject = SelectedObjects[ObjectIndex];
if ( CurrentObject.IsValid() )
{
ALevelSequenceActor* CurrentLevelSequenceActor = Cast<ALevelSequenceActor>(CurrentObject.Get());
if (CurrentLevelSequenceActor != NULL)
{
LevelSequenceActor = CurrentLevelSequenceActor;
break;
}
}
}
TArray<ALevelSequenceActor*> LevelSequenceActors;
{
TArray<TWeakObjectPtr<>> ObjectPtrs;
DetailLayout.GetObjectsBeingCustomized(ObjectPtrs);
for (TWeakObjectPtr<> WeakObj : ObjectPtrs)
{
if (auto* Actor = Cast<ALevelSequenceActor>(WeakObj.Get()))
{
LevelSequenceActors.Add(Actor);
}
}
}
IDetailCategoryBuilder& GeneralCategory = DetailLayout.EditCategory( "General", NSLOCTEXT("GeneralDetails", "General", "General"), ECategoryPriority::Important );
GeneralCategory.AddCustomRow( NSLOCTEXT("LevelSequenceActorDetails", "OpenLevelSequence", "Open Level Sequence") )
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot()
.FillWidth(1.f)
.Padding(0, 5, 10, 5)
[
SNew(SButton)
.ContentPadding(3)
.VAlign(VAlign_Center)
.HAlign(HAlign_Center)
.IsEnabled( this, &FLevelSequenceActorDetails::CanOpenLevelSequenceForActor )
.OnClicked( this, &FLevelSequenceActorDetails::OnOpenLevelSequenceForActor )
.Text( NSLOCTEXT("LevelSequenceActorDetails", "OpenLevelSequence", "Open Level Sequence") )
]
];
TArray<UObject*> SubObjects;
IDetailCategoryBuilder& BurnInOptionsCategory = DetailLayout.EditCategory( "BurnInOptions", LOCTEXT("BurnInOptions", "Burn In Options") ).InitiallyCollapsed(false);
{
SubObjects.Reset();
Algo::Transform(LevelSequenceActors, SubObjects, &ALevelSequenceActor::BurnInOptions);
AddAllSubObjectProperties(SubObjects, BurnInOptionsCategory);
}
IDetailCategoryBuilder& BindingOverridesCategory = DetailLayout.EditCategory( "BindingOverrides", LOCTEXT("BindingOverrides", "Binding Overrides") ).InitiallyCollapsed(false);
{
SubObjects.Reset();
Algo::Transform(LevelSequenceActors, SubObjects, &ALevelSequenceActor::BindingOverrides);
AddAllSubObjectProperties(SubObjects, BindingOverridesCategory);
}
IDetailCategoryBuilder& InstanceDataCategory = DetailLayout.EditCategory( "InstanceData", LOCTEXT("InstanceData", "Instance Data") ).InitiallyCollapsed(false);
{
TSharedRef<IPropertyHandle> UseInstanceData = DetailLayout.GetProperty(GET_MEMBER_NAME_CHECKED(ALevelSequenceActor, bOverrideInstanceData));
DetailLayout.HideProperty(UseInstanceData);
InstanceDataCategory.AddProperty(UseInstanceData);
SubObjects.Reset();
Algo::Transform(LevelSequenceActors, SubObjects, &ALevelSequenceActor::DefaultInstanceData);
auto IsVisible = [UseInstanceData]() -> EVisibility
{
bool bValue = false;
return UseInstanceData->GetValue(bValue) == FPropertyAccess::Success && bValue ? EVisibility::Visible : EVisibility::Collapsed;
};
TAttribute<EVisibility> Visibility = TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateLambda(IsVisible));
AddAllSubObjectProperties(SubObjects, InstanceDataCategory, Visibility);
}
}
bool FLevelSequenceActorDetails::CanOpenLevelSequenceForActor() const
{
if( LevelSequenceActor.IsValid() )
{
return LevelSequenceActor.Get()->LevelSequence.IsValid();
}
return false;
}
FReply FLevelSequenceActorDetails::OnOpenLevelSequenceForActor()
{
if( LevelSequenceActor.IsValid() )
{
UObject* LoadedObject = LevelSequenceActor.Get()->LoadSequence();
if (LoadedObject != nullptr)
{
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset(LoadedObject);
}
}
return FReply::Handled();
}
#undef LOCTEXT_NAMESPACE