// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "ConfirmDialogWidget.generated.h" class UButton; class UTextBlock; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnConfirmDialogConfirmed); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnConfirmDialogCancelled); /** * Boite de dialogue "es-tu sur ?", volontairement generique. * * Elle ne sait pas ce qu'elle confirme : elle pose la question et previent via * ses delegues. C'est l'appelant qui decide de l'action. Ainsi la meme boite * servira pour quitter, effacer une sauvegarde ou abandonner une partie. * * Classe Abstract : on cree un WBP_ConfirmDialog qui en herite. */ UCLASS(Abstract) class SURVIVAL_PROJET_API UConfirmDialogWidget : public UUserWidget { GENERATED_BODY() public: UConfirmDialogWidget(const FObjectInitializer& ObjectInitializer); virtual void NativeConstruct() override; virtual void NativeDestruct() override; virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override; UPROPERTY(BlueprintAssignable, Category = "Dialogue") FOnConfirmDialogConfirmed OnConfirmed; UPROPERTY(BlueprintAssignable, Category = "Dialogue") FOnConfirmDialogCancelled OnCancelled; /** * Affiche la boite et lui donne le focus clavier. * * Passe par ici et jamais par SetVisibility directement : sans le focus, * la boite ne recevrait aucune touche et Echap resterait sans effet. */ UFUNCTION(BlueprintCallable, Category = "Dialogue") void Open(const FText& InMessage); /** Referme la boite. Ne previent personne : l'appelant sait ce qu'il fait. */ UFUNCTION(BlueprintCallable, Category = "Dialogue") void Close(); protected: /** Echap equivaut a cliquer Annuler. Decoche pour une question incontournable. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialogue") bool bCancelOnEscape = true; /** * Entree equivaut a cliquer Confirmer. * * Desactive par defaut, volontairement : sur une question destructrice, un * joueur qui martele Entree validerait sans avoir lu. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Dialogue") bool bConfirmOnEnter = false; UPROPERTY(meta = (BindWidget)) TObjectPtr ConfirmButton; UPROPERTY(meta = (BindWidget)) TObjectPtr CancelButton; /** Optionnel : une boite dont le texte est fige dans le Blueprint reste valide. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr MessageText; private: UFUNCTION() void HandleConfirmClicked(); UFUNCTION() void HandleCancelClicked(); };