Files
Unreal_EmberWild/Source/Survival_projet/Private/ConfirmDialogWidget.cpp
T
2026-07-28 14:16:50 +02:00

107 lines
2.8 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "ConfirmDialogWidget.h"
#include "Components/Button.h"
#include "Components/TextBlock.h"
#include "InputCoreTypes.h"
UConfirmDialogWidget::UConfirmDialogWidget(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// Sans ce drapeau le widget ne peut pas prendre le focus clavier, et
// NativeOnKeyDown ne serait jamais appele. Il ne se change qu'a la
// construction, d'ou sa presence ici et pas dans Open().
SetIsFocusable(true);
}
void UConfirmDialogWidget::NativeConstruct()
{
Super::NativeConstruct();
if (ConfirmButton)
{
ConfirmButton->OnClicked.AddDynamic(this, &UConfirmDialogWidget::HandleConfirmClicked);
}
if (CancelButton)
{
CancelButton->OnClicked.AddDynamic(this, &UConfirmDialogWidget::HandleCancelClicked);
}
}
void UConfirmDialogWidget::Open(const FText& InMessage)
{
if (MessageText)
{
MessageText->SetText(InMessage);
}
SetVisibility(ESlateVisibility::Visible);
// Le focus doit etre repris a CHAQUE ouverture : le refermer le rend au
// menu, et une boite visible mais sans focus ignorerait le clavier.
SetKeyboardFocus();
}
void UConfirmDialogWidget::Close()
{
SetVisibility(ESlateVisibility::Collapsed);
}
FReply UConfirmDialogWidget::NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent)
{
const FKey Key = InKeyEvent.GetKey();
// La touche "retour" de la manette en plus d'Echap : Slate y fait pointer le
// bouton retour de la plateforme (B sur Xbox, Rond sur PlayStation). Une
// seule ligne et le clavier comme la manette sont couverts, sans avoir a
// enumerer les touches de chaque constructeur.
//
// GetVirtualKey() et non la constante EKeys::Virtual_Back, depreciee en 5.8 :
// la resolution se fait desormais a l'appel, donc a chaud selon la manette
// reellement branchee.
if (bCancelOnEscape && (Key == EKeys::Escape || Key == EKeys::Virtual_Gamepad_Back.GetVirtualKey()))
{
OnCancelled.Broadcast();
// Handled et non Unhandled : sans ca la touche continue de remonter et
// serait consommee une seconde fois par ce qui se trouve derriere.
return FReply::Handled();
}
if (bConfirmOnEnter && (Key == EKeys::Enter || Key == EKeys::Virtual_Gamepad_Accept.GetVirtualKey()))
{
OnConfirmed.Broadcast();
return FReply::Handled();
}
return Super::NativeOnKeyDown(InGeometry, InKeyEvent);
}
void UConfirmDialogWidget::HandleConfirmClicked()
{
OnConfirmed.Broadcast();
}
void UConfirmDialogWidget::HandleCancelClicked()
{
OnCancelled.Broadcast();
}
void UConfirmDialogWidget::NativeDestruct()
{
if (ConfirmButton)
{
ConfirmButton->OnClicked.RemoveDynamic(this, &UConfirmDialogWidget::HandleConfirmClicked);
}
if (CancelButton)
{
CancelButton->OnClicked.RemoveDynamic(this, &UConfirmDialogWidget::HandleCancelClicked);
}
Super::NativeDestruct();
}