136 lines
3.8 KiB
C++
136 lines
3.8 KiB
C++
// 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;
|
|
};
|