167 lines
5.5 KiB
C++
167 lines
5.5 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "CommonUIExtensions.h"
|
|
|
|
#include "Blueprint/UserWidget.h"
|
|
#include "CommonActivatableWidget.h"
|
|
#include "CommonInputBaseTypes.h"
|
|
#include "CommonInputSubsystem.h"
|
|
#include "CommonLocalPlayer.h"
|
|
#include "Delegates/Delegate.h"
|
|
#include "Engine/GameInstance.h"
|
|
#include "Engine/LocalPlayer.h"
|
|
#include "GameFramework/PlayerController.h"
|
|
#include "GameUIManagerSubsystem.h"
|
|
#include "GameUIPolicy.h"
|
|
#include "GameplayTagContainer.h"
|
|
#include "PrimaryGameLayout.h"
|
|
#include "Templates/Casts.h"
|
|
#include "UObject/UnrealNames.h"
|
|
#include "Widgets/CommonActivatableWidgetContainer.h"
|
|
|
|
int32 UCommonUIExtensions::InputSuspensions = 0;
|
|
|
|
ECommonInputType UCommonUIExtensions::GetOwningPlayerInputType(const UUserWidget* WidgetContextObject)
|
|
{
|
|
if (WidgetContextObject)
|
|
{
|
|
if (const UCommonInputSubsystem* InputSubsystem = UCommonInputSubsystem::Get(WidgetContextObject->GetOwningLocalPlayer()))
|
|
{
|
|
return InputSubsystem->GetCurrentInputType();
|
|
}
|
|
}
|
|
|
|
return ECommonInputType::Count;
|
|
}
|
|
|
|
bool UCommonUIExtensions::IsOwningPlayerUsingTouch(const UUserWidget* WidgetContextObject)
|
|
{
|
|
if (WidgetContextObject)
|
|
{
|
|
if (const UCommonInputSubsystem* InputSubsystem = UCommonInputSubsystem::Get(WidgetContextObject->GetOwningLocalPlayer()))
|
|
{
|
|
return InputSubsystem->GetCurrentInputType() == ECommonInputType::Touch;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool UCommonUIExtensions::IsOwningPlayerUsingGamepad(const UUserWidget* WidgetContextObject)
|
|
{
|
|
if (WidgetContextObject)
|
|
{
|
|
if (const UCommonInputSubsystem* InputSubsystem = UCommonInputSubsystem::Get(WidgetContextObject->GetOwningLocalPlayer()))
|
|
{
|
|
return InputSubsystem->GetCurrentInputType() == ECommonInputType::Gamepad;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
UCommonActivatableWidget* UCommonUIExtensions::PushContentToLayer_ForPlayer(const ULocalPlayer* LocalPlayer, FGameplayTag LayerName, TSubclassOf<UCommonActivatableWidget> WidgetClass)
|
|
{
|
|
//if (!WidgetClass)
|
|
//{
|
|
// //UE_LOG ERROR
|
|
// return nullptr;
|
|
//}
|
|
|
|
if (UGameUIManagerSubsystem* UIManager = LocalPlayer->GetGameInstance()->GetSubsystem<UGameUIManagerSubsystem>())
|
|
{
|
|
if (UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy())
|
|
{
|
|
if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked<UCommonLocalPlayer>(LocalPlayer)))
|
|
{
|
|
return RootLayout->PushWidgetToLayerStack(LayerName, WidgetClass);
|
|
}
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
void UCommonUIExtensions::PushStreamedContentToLayer_ForPlayer(const ULocalPlayer* LocalPlayer, FGameplayTag LayerName, TSoftClassPtr<UCommonActivatableWidget> WidgetClass)
|
|
{
|
|
if (UGameUIManagerSubsystem* UIManager = LocalPlayer->GetGameInstance()->GetSubsystem<UGameUIManagerSubsystem>())
|
|
{
|
|
if (UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy())
|
|
{
|
|
if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked<UCommonLocalPlayer>(LocalPlayer)))
|
|
{
|
|
const bool bSuspendInputUntilComplete = true;
|
|
RootLayout->PushWidgetToLayerStackAsync(LayerName, bSuspendInputUntilComplete, WidgetClass);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void UCommonUIExtensions::PopContentFromLayer(UCommonActivatableWidget* ActivatableWidget)
|
|
{
|
|
if (const ULocalPlayer* LocalPlayer = ActivatableWidget->GetOwningLocalPlayer())
|
|
{
|
|
if (const UGameUIManagerSubsystem* UIManager = LocalPlayer->GetGameInstance()->GetSubsystem<UGameUIManagerSubsystem>())
|
|
{
|
|
if (const UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy())
|
|
{
|
|
if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked<UCommonLocalPlayer>(LocalPlayer)))
|
|
{
|
|
RootLayout->FindAndRemoveWidgetFromLayer(ActivatableWidget);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ULocalPlayer* UCommonUIExtensions::GetLocalPlayerFromController(APlayerController* PlayerController)
|
|
{
|
|
if (PlayerController)
|
|
{
|
|
return Cast<ULocalPlayer>(PlayerController->Player);
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
FName UCommonUIExtensions::SuspendInputForPlayer(APlayerController* PlayerController, FName SuspendReason)
|
|
{
|
|
return SuspendInputForPlayer(PlayerController ? PlayerController->GetLocalPlayer() : nullptr, SuspendReason);
|
|
}
|
|
|
|
FName UCommonUIExtensions::SuspendInputForPlayer(ULocalPlayer* LocalPlayer, FName SuspendReason)
|
|
{
|
|
if (UCommonInputSubsystem* CommonInputSubsystem = UCommonInputSubsystem::Get(LocalPlayer))
|
|
{
|
|
InputSuspensions++;
|
|
FName SuspendToken = SuspendReason;
|
|
SuspendToken.SetNumber(InputSuspensions);
|
|
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::MouseAndKeyboard, SuspendToken, true);
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::Gamepad, SuspendToken, true);
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::Touch, SuspendToken, true);
|
|
|
|
return SuspendToken;
|
|
}
|
|
|
|
return NAME_None;
|
|
}
|
|
|
|
void UCommonUIExtensions::ResumeInputForPlayer(APlayerController* PlayerController, FName SuspendToken)
|
|
{
|
|
ResumeInputForPlayer(PlayerController ? PlayerController->GetLocalPlayer() : nullptr, SuspendToken);
|
|
}
|
|
|
|
void UCommonUIExtensions::ResumeInputForPlayer(ULocalPlayer* LocalPlayer, FName SuspendToken)
|
|
{
|
|
if (SuspendToken == NAME_None)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (UCommonInputSubsystem* CommonInputSubsystem = UCommonInputSubsystem::Get(LocalPlayer))
|
|
{
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::MouseAndKeyboard, SuspendToken, false);
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::Gamepad, SuspendToken, false);
|
|
CommonInputSubsystem->SetInputTypeFilter(ECommonInputType::Touch, SuspendToken, false);
|
|
}
|
|
}
|