(Feat) Add MainMenu

This commit is contained in:
2026-07-28 14:10:17 +02:00
parent ed7c7fd991
commit 175bef228c
33 changed files with 2331 additions and 12 deletions
@@ -0,0 +1,135 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "SettingsMenuWidget.generated.h"
class UButton;
class UConfirmDialogWidget;
class USettingsTabWidget;
class UWidgetSwitcher;
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSettingsCloseRequested);
/**
* L'ecran de reglages : une barre d'onglets, un WidgetSwitcher, Retour et
* Reinitialiser.
*
* Il ne sait PAS qui l'a ouvert. Il demande a se fermer via OnCloseRequested et
* c'est l'appelant -- menu principal ou menu de pause -- qui decide de ce que
* "Retour" veut dire. Sans ca il faudrait un ecran par contexte.
*
* Il ne connait pas davantage le contenu de ses onglets : il appelle
* RefreshFromSettings et ResetToDefaults sur USettingsTabWidget. Ajouter
* l'onglet Graphismes ne demandera aucune ligne ici.
*
* Classe Abstract : on cree un WBP_Settings qui en herite.
*/
UCLASS(Abstract)
class SURVIVAL_PROJET_API USettingsMenuWidget : public UUserWidget
{
GENERATED_BODY()
public:
USettingsMenuWidget(const FObjectInitializer& ObjectInitializer);
virtual void NativeConstruct() override;
virtual void NativeDestruct() override;
virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override;
UPROPERTY(BlueprintAssignable, Category = "Reglages")
FOnSettingsCloseRequested OnCloseRequested;
/**
* Affiche l'ecran, rafraichit l'onglet visible et prend le focus clavier.
*
* Passe par ici et jamais par SetVisibility : sans le focus, Echap ne
* refermerait pas l'ecran.
*/
UFUNCTION(BlueprintCallable, Category = "Reglages")
void Open();
/** Masque l'ecran et ecrit le fichier de reglages. */
UFUNCTION(BlueprintCallable, Category = "Reglages")
void Close();
protected:
UPROPERTY(meta = (BindWidget))
TObjectPtr<UWidgetSwitcher> TabSwitcher;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UButton> BackButton;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> ResetButton;
/**
* Les onglets a venir. Grises automatiquement tant que le WidgetSwitcher ne
* contient pas la page correspondante -- meme principe que les boutons de
* coop du menu principal : ils annoncent la couleur sans mener nulle part.
*/
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> GameplayTabButton;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> DisplayTabButton;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> GraphicsTabButton;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> AudioTabButton;
/**
* Boite de confirmation POSEE DANS le WBP_Settings, et non ajoutee au
* viewport : elle se retrouve ainsi naturellement au-dessus de l'ecran de
* reglages, sans avoir a lui trouver un ZOrder qui n'entre en conflit ni
* avec le menu de pause ni avec la boite d'abandon de partie.
*
* Absente, "Reinitialiser" agit sans rien demander.
*/
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UConfirmDialogWidget> ResetDialog;
/** La question posee avant de reinitialiser l'onglet visible. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Reglages")
FText ResetDialogMessage;
private:
UFUNCTION()
void HandleBackClicked();
UFUNCTION()
void HandleResetClicked();
UFUNCTION()
void HandleResetConfirmed();
UFUNCTION()
void HandleResetCancelled();
UFUNCTION()
void HandleGameplayTabClicked();
UFUNCTION()
void HandleDisplayTabClicked();
UFUNCTION()
void HandleGraphicsTabClicked();
UFUNCTION()
void HandleAudioTabClicked();
/** Change de page et rafraichit la nouvelle. Ignore un index inexistant. */
void ShowTab(int32 Index);
/** La page actuellement affichee, ou nullptr si le switcher est vide. */
USettingsTabWidget* GetActiveTab() const;
/** Grise les boutons dont la page n'existe pas encore. */
void UpdateTabButtonStates();
bool bResetDialogOpen = false;
};