// 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 TabSwitcher; UPROPERTY(meta = (BindWidget)) TObjectPtr BackButton; UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr 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 GameplayTabButton; UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr DisplayTabButton; UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr GraphicsTabButton; UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr 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 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; };