// 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(); }