103 lines
3.2 KiB
C++
103 lines
3.2 KiB
C++
// 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 EMBERWILD_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<UButton> ResumeButton;
|
|
|
|
/** Retour au menu principal, apres confirmation. */
|
|
UPROPERTY(meta = (BindWidget))
|
|
TObjectPtr<UButton> 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<UButton> 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<UButton> InviteButton;
|
|
|
|
private:
|
|
UFUNCTION()
|
|
void HandleResumeClicked();
|
|
|
|
UFUNCTION()
|
|
void HandleSettingsClicked();
|
|
|
|
UFUNCTION()
|
|
void HandleQuitToMenuClicked();
|
|
|
|
UFUNCTION()
|
|
void HandleInviteClicked();
|
|
};
|