Files
UnrealEngine/Engine/Plugins/Experimental/UIFramework/Source/Private/UIFPresenter.cpp
2025-05-18 13:04:45 +08:00

67 lines
1.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "UIFPresenter.h"
#include "Blueprint/GameViewportSubsystem.h"
#include "Components/Widget.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(UIFPresenter)
UUIFrameworkGameViewportPresenter::FWidgetPair::FWidgetPair(UWidget* InWidget, FUIFrameworkWidgetId InWidgetId)
: UMGWidget(InWidget)
, WidgetId(InWidgetId)
{
}
void UUIFrameworkGameViewportPresenter::AddToViewport(UWidget* UMGWidget, const FUIFrameworkGameLayerSlot& Slot)
{
if (UGameViewportSubsystem* Subsystem = UGameViewportSubsystem::Get(GetOuterUUIFrameworkPlayerComponent()->GetWorld()))
{
FGameViewportWidgetSlot GameViewportWidgetSlot;
GameViewportWidgetSlot.ZOrder = Slot.ZOrder;
if (Slot.Type == EUIFrameworkGameLayerType::Viewport)
{
Subsystem->AddWidget(UMGWidget, GameViewportWidgetSlot);
}
else
{
APlayerController* LocalOwner = GetOuterUUIFrameworkPlayerComponent()->GetPlayerController();
check(LocalOwner);
Subsystem->AddWidgetForPlayer(UMGWidget, LocalOwner->GetLocalPlayer(), GameViewportWidgetSlot);
}
Widgets.Emplace(UMGWidget, Slot.GetWidgetId());
}
}
void UUIFrameworkGameViewportPresenter::RemoveFromViewport(FUIFrameworkWidgetId WidgetId)
{
int32 IndexOf = Widgets.IndexOfByPredicate([WidgetId](const FWidgetPair& Other) { return Other.WidgetId == WidgetId; });
if (IndexOf != INDEX_NONE)
{
if (UGameViewportSubsystem* Subsystem = UGameViewportSubsystem::Get(GetOuterUUIFrameworkPlayerComponent()->GetWorld()))
{
Subsystem->RemoveWidget(Widgets[IndexOf].UMGWidget.Get());
}
Widgets.RemoveAtSwap(IndexOf);
}
}
void UUIFrameworkGameViewportPresenter::BeginDestroy()
{
if (GetOuter() && !IsTemplate())
{
if (UGameViewportSubsystem* Subsystem = UGameViewportSubsystem::Get(GetOuterUUIFrameworkPlayerComponent()->GetWorld()))
{
for (FWidgetPair& Pair : Widgets)
{
Subsystem->RemoveWidget(Pair.UMGWidget.Get());
}
}
}
Widgets.Reset();
Super::BeginDestroy();
}