Files
Naked-Desire/Source/NakedDesire/UI/Menu/PauseMenuWidget.cpp
T
2026-06-05 20:00:33 +03:00

85 lines
2.2 KiB
C++

// © 2025 Naked People Team. All Rights Reserved.
#include "PauseMenuWidget.h"
#include "ConfirmModalWidget.h"
#include "Components/Button.h"
#include "Kismet/GameplayStatics.h"
#include "Widgets/CommonActivatableWidgetContainer.h"
#define LOCTEXT_NAMESPACE "PauseMenu"
UPauseMenuWidget::UPauseMenuWidget()
{
// Default to the front-end map; override per-asset on WBP_PauseMenu.
MainMenuMap = TSoftObjectPtr<UWorld>(FSoftObjectPath(TEXT("/Game/Maps/MainMenu.MainMenu")));
}
void UPauseMenuWidget::NativeOnActivated()
{
Super::NativeOnActivated();
GetWorld()->GetTimerManager().SetTimer(PauseTimerHandle, this, &UPauseMenuWidget::PauseGame, 0.1f);
ResumeButton->OnClicked.AddUniqueDynamic(this, &UPauseMenuWidget::OnResumeClicked);
SettingsButton->OnClicked.AddUniqueDynamic(this, &UPauseMenuWidget::OnSettingsClicked);
MainMenuButton->OnClicked.AddUniqueDynamic(this, &UPauseMenuWidget::OnMainMenuClicked);
}
void UPauseMenuWidget::NativeOnDeactivated()
{
Super::NativeOnDeactivated();
// Unpause whenever the menu closes — Resume, back action, or being popped.
if (UGameplayStatics::IsGamePaused(this))
UGameplayStatics::SetGamePaused(this, false);
}
void UPauseMenuWidget::OnResumeClicked()
{
DeactivateWidget();
}
void UPauseMenuWidget::OnSettingsClicked()
{
if (SettingsWidgetClass && ModalStack)
ModalStack->AddWidget(SettingsWidgetClass);
}
void UPauseMenuWidget::OnMainMenuClicked()
{
if (!ConfirmModalClass || !ModalStack)
{
HandleMainMenuConfirmed();
return;
}
UConfirmModalWidget* Modal = ModalStack->AddWidget<UConfirmModalWidget>(ConfirmModalClass);
if (!Modal)
return;
Modal->Setup(
LOCTEXT("MainMenuTitle", "Main Menu"),
LOCTEXT("MainMenuBody", "Return to the main menu? Unsaved progress may be lost."));
Modal->OnConfirmed.AddUObject(this, &UPauseMenuWidget::HandleMainMenuConfirmed);
}
void UPauseMenuWidget::HandleMainMenuConfirmed()
{
// Unpause before travel — level transitions while paused are unreliable.
UGameplayStatics::SetGamePaused(this, false);
if (MainMenuMap.IsNull())
return;
UGameplayStatics::OpenLevelBySoftObjectPtr(this, MainMenuMap);
}
void UPauseMenuWidget::PauseGame()
{
UGameplayStatics::SetGamePaused(this, true);
}
#undef LOCTEXT_NAMESPACE