Files
UnrealEngine/Engine/Source/Runtime/UMG/Private/Extensions/UIComponentWidgetBlueprintGeneratedClassExtension.cpp
2025-05-18 13:04:45 +08:00

135 lines
4.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Extensions/UIComponentWidgetBlueprintGeneratedClassExtension.h"
#include "Blueprint/UserWidget.h"
#include "Blueprint/WidgetBlueprintGeneratedClass.h"
#include "CoreMinimal.h"
#include "Blueprint/WidgetTree.h"
#include "Extensions/UIComponent.h"
#include "Extensions/UIComponentContainer.h"
#include "Extensions/UIComponentUserWidgetExtension.h"
#include "UObject/UnrealType.h"
UUIComponentContainer* UUIComponentWidgetBlueprintGeneratedClassExtension::DuplicateContainer(UUserWidget* UserWidget) const
{
check(ComponentContainer);
check(!ComponentContainer->IsEmpty());
UObject* Outer = UserWidget;
//FObjectInstancingGraph ObjectInstancingGraph;
UUIComponentContainer* NewContainer = NewObject<UUIComponentContainer>(Outer,
ComponentContainer->GetClass(),
NAME_None,
RF_Transactional,
ComponentContainer,
false);
return NewContainer;
}
bool UUIComponentWidgetBlueprintGeneratedClassExtension::VerifyContainer(const UUserWidget* UserWidget) const
{
if(const UUIComponentUserWidgetExtension* UserWidgetExtension = UserWidget->GetExtension<UUIComponentUserWidgetExtension>())
{
TArray<FUIComponentTarget> Components;
ComponentContainer->ForEachComponentTarget([&Components](const FUIComponentTarget& ComponentTarget){
Components.Push(ComponentTarget);
});
while(Components.Num() > 0)
{
const FUIComponentTarget& Target = Components[Components.Num()-1];
if(!UserWidgetExtension->GetComponent(Target.GetComponent()->GetClass(), Target.GetTargetName()))
{
return false;
}
else
{
Components.RemoveAt(Components.Num()-1);
}
}
return true;
}
return false;
}
#if WITH_EDITOR
bool UUIComponentWidgetBlueprintGeneratedClassExtension::VerifyAllWidgetsExists(const UWidgetTree* WidgetTree) const
{
TSet<FName> Targets;
ComponentContainer->ForEachComponentTarget([&Targets](const FUIComponentTarget& ComponentTarget){
Targets.FindOrAdd(ComponentTarget.GetTargetName());
});
for (FName& WidgetName : Targets)
{
if (WidgetTree->FindWidget(WidgetName))
{
continue;
}
return false;
}
return true;
}
#endif // WITH_EDITOR
void UUIComponentWidgetBlueprintGeneratedClassExtension::InitializeContainer(UUIComponentContainer* InComponentContainer)
{
check(InComponentContainer != nullptr);
check(ComponentContainer == nullptr);
ComponentContainer = InComponentContainer;
}
void UUIComponentWidgetBlueprintGeneratedClassExtension::Initialize(UUserWidget* UserWidget)
{
UUIComponentUserWidgetExtension* UserWidgetExtension = UserWidget->GetExtension<UUIComponentUserWidgetExtension>();
if (!UserWidgetExtension)
{
UserWidgetExtension = UserWidget->AddExtension<UUIComponentUserWidgetExtension>();
UserWidgetExtension->InitializeContainer(DuplicateContainer(UserWidget));
}
}
void UUIComponentWidgetBlueprintGeneratedClassExtension::PreConstruct(UUserWidget* UserWidget, bool IsDesignTime)
{
// This is where we can add the UserWidgetExtension and Duplicate the Component Container from the GeneratedClassExtension
// If the extension do not exists, Add it.
UUIComponentUserWidgetExtension* UserWidgetExtension = UserWidget->GetExtension<UUIComponentUserWidgetExtension>();
if (!UserWidgetExtension)
{
UserWidgetExtension = UserWidget->AddExtension<UUIComponentUserWidgetExtension>();
UserWidgetExtension->InitializeContainer(DuplicateContainer(UserWidget));
UserWidgetExtension->Initialize();
}
else
{
if (UserWidget != UserWidgetExtension->GetOuterUUserWidget())
{
UserWidgetExtension->Rename(nullptr, UserWidget);
}
}
if (!IsDesignTime)
{
// Set the component object in the corresponding property on the userwidget.
ComponentContainer->ForEachComponentTarget([UserWidget](const FUIComponentTarget& ComponentTarget) {
FName ComponentPropertyName = UUIComponentContainer::GetPropertyNameForComponent(ComponentTarget.GetComponent(), ComponentTarget.GetTargetName());
FObjectPropertyBase* FoundPanelObjectProperty = FindFProperty<FObjectPropertyBase>(UserWidget->GetClass(), ComponentPropertyName);
bool bValidPanelObject = FoundPanelObjectProperty && FoundPanelObjectProperty->PropertyClass->IsChildOf(UUIComponent::StaticClass());
if (ensureAlwaysMsgf(bValidPanelObject, TEXT("The compiler should have added the property")))
{
if (ensure(FoundPanelObjectProperty->PropertyClass == ComponentTarget.GetComponent()->GetClass()))
{
FoundPanelObjectProperty->SetObjectPropertyValue_InContainer(UserWidget, ComponentTarget.GetComponent());
}
}
});
}
}