// 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 WidgetClass) { //if (!WidgetClass) //{ // //UE_LOG ERROR // return nullptr; //} if (UGameUIManagerSubsystem* UIManager = LocalPlayer->GetGameInstance()->GetSubsystem()) { if (UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy()) { if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked(LocalPlayer))) { return RootLayout->PushWidgetToLayerStack(LayerName, WidgetClass); } } } return nullptr; } void UCommonUIExtensions::PushStreamedContentToLayer_ForPlayer(const ULocalPlayer* LocalPlayer, FGameplayTag LayerName, TSoftClassPtr WidgetClass) { if (UGameUIManagerSubsystem* UIManager = LocalPlayer->GetGameInstance()->GetSubsystem()) { if (UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy()) { if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked(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()) { if (const UGameUIPolicy* Policy = UIManager->GetCurrentUIPolicy()) { if (UPrimaryGameLayout* RootLayout = Policy->GetRootLayout(CastChecked(LocalPlayer))) { RootLayout->FindAndRemoveWidgetFromLayer(ActivatableWidget); } } } } } ULocalPlayer* UCommonUIExtensions::GetLocalPlayerFromController(APlayerController* PlayerController) { if (PlayerController) { return Cast(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); } }