// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "PauseMenuWidget.generated.h" class UButton; /** * Le menu de pause : trois boutons par-dessus la partie figee. * * Comme UMainMenuWidget, il ne decide de rien -- il appelle * AFpsPlayerController. Mettre SetPause ou OpenLevel ici serait doublement * faux : un widget n'existe que sur la machine du joueur local, et la mise en * pause appartient a l'autorite. * * Classe Abstract : on cree un WBP_PauseMenu qui en herite. */ UCLASS(Abstract) class SURVIVAL_PROJET_API UPauseMenuWidget : public UUserWidget { GENERATED_BODY() public: UPauseMenuWidget(const FObjectInitializer& ObjectInitializer); virtual void NativeConstruct() override; virtual void NativeDestruct() override; /** * Echap, quand c'est CE widget qui tient le focus clavier. * * Indispensable et pas seulement confortable : les widgets UMG sont des * FRERES du SViewport dans l'arbre Slate, jamais ses enfants. Une touche * remonte donc le long des parents du widget focalise et n'atteint jamais le * viewport -- Enhanced Input ne la voit pas. Or le menu de pause est le seul * ecran in-game plein de UButton, et un bouton prend le focus au clic : sans * ce relais, Echap cesse de refermer le menu des le premier clic dedans. */ virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override; /** Affiche le menu et lui rend le focus clavier. */ void Open(); /** Masque le menu. Le focus revient au viewport avec le mode d'input. */ void Close(); /** * Actif (cliquable et focalise) ou simplement lisible derriere un ecran pose * par-dessus -- reglages, boite de confirmation. * * Redonner le focus en redevenant actif est la moitie qui manque le plus * souvent : l'ecran qui passait devant l'avait pris pour lui, et personne ne * le rend en se fermant. */ void SetInteractive(bool bInteractive); protected: /** Reprend la partie. Nomme exactement "ResumeButton" dans le WBP. */ UPROPERTY(meta = (BindWidget)) TObjectPtr ResumeButton; /** Retour au menu principal, apres confirmation. */ UPROPERTY(meta = (BindWidget)) TObjectPtr QuitToMenuButton; /** * BindWidgetOptional : un WBP_PauseMenu sans bouton Reglages reste valide. * * Pas de bouton "Quitter le jeu" ici, volontairement : la sortie se fait * depuis le menu principal, ou l'on repasse de toute facon. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr SettingsButton; /** * Ouvre le panneau d'invitation de l'overlay Steam. C'est la SEULE facon de * faire venir un ami : il n'existe ni navigateur de parties, ni bouton * Rejoindre dans le menu principal. * * Grise tout seul quand l'invitation est impossible -- Steam absent, ou * partie lancee alors qu'il l'etait. Un bouton qui ne repond pas au clic * passe pour un bug ; un bouton grise se comprend tout seul. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr InviteButton; private: UFUNCTION() void HandleResumeClicked(); UFUNCTION() void HandleSettingsClicked(); UFUNCTION() void HandleQuitToMenuClicked(); UFUNCTION() void HandleInviteClicked(); };