(Feat) Add Main Menu + Music Manger
This commit is contained in:
@@ -8,11 +8,18 @@
|
||||
|
||||
class UButton;
|
||||
class UConfirmDialogWidget;
|
||||
class UKeyCaptureWidget;
|
||||
class USettingsTabWidget;
|
||||
class UWidgetSwitcher;
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSettingsCloseRequested);
|
||||
|
||||
/** Reponse a une demande de confirmation. bConfirmed est faux sur un refus ou une expiration. */
|
||||
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSettingsConfirmationResult, bool, bConfirmed);
|
||||
|
||||
/** Touche capturee. Invalide si le joueur a annule avec Echap. */
|
||||
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSettingsKeyCaptureResult, FKey, CapturedKey);
|
||||
|
||||
/**
|
||||
* L'ecran de reglages : une barre d'onglets, un WidgetSwitcher, Retour et
|
||||
* Reinitialiser.
|
||||
@@ -55,6 +62,57 @@ public:
|
||||
UFUNCTION(BlueprintCallable, Category = "Reglages")
|
||||
void Close();
|
||||
|
||||
/**
|
||||
* ZOrder de la boite de confirmation, impose par celui qui ouvre l'ecran.
|
||||
*
|
||||
* L'ecran ne le choisit PAS lui-meme : il est ouvert depuis deux contextes
|
||||
* dont les empilements n'ont rien a voir (50 au menu principal, 150 en jeu).
|
||||
* Un numero code en dur ici obligerait le widget a savoir qui l'affiche,
|
||||
* exactement ce qu'on evite avec OnCloseRequested. A appeler AVANT Open().
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "Reglages")
|
||||
void SetDialogZOrder(int32 InZOrder) { DialogZOrder = InZOrder; }
|
||||
|
||||
/**
|
||||
* Pose une question au joueur pour le compte d'un onglet.
|
||||
*
|
||||
* L'ecran est le seul a posseder une boite : un onglet qui creerait la
|
||||
* sienne devrait a son tour se demander a quel ZOrder la poser, et on
|
||||
* repartirait pour un tour.
|
||||
*
|
||||
* @param MessageOrFormat texte simple, ou format contenant {0} si
|
||||
* CountdownSeconds est superieur a zero.
|
||||
* @param CountdownSeconds 0 pour une question sans limite de temps.
|
||||
* @return false si aucune boite n'est configuree -- l'appelant doit alors
|
||||
* decider seul, sa reponse n'arrivera jamais.
|
||||
*/
|
||||
bool RequestConfirmation(const FText& MessageOrFormat, float CountdownSeconds, const FOnSettingsConfirmationResult& OnResult);
|
||||
|
||||
/**
|
||||
* Ouvre le voile de capture de touche pour le compte d'un onglet.
|
||||
*
|
||||
* Meme raison que la boite : un voile pose DANS l'onglet serait clippe a la
|
||||
* zone du WidgetSwitcher au lieu de couvrir l'ecran, et devrait a son tour
|
||||
* se trouver un ZOrder.
|
||||
*
|
||||
* @return false si aucun voile n'est configure -- la reponse n'arrivera
|
||||
* jamais, l'appelant doit renoncer.
|
||||
*/
|
||||
bool RequestKeyCapture(const FText& ActionLabel, const FOnSettingsKeyCaptureResult& OnResult);
|
||||
|
||||
/**
|
||||
* Bascule le voile deja ouvert sur la question de conflit.
|
||||
*
|
||||
* Le voile RESTE ouvert entre la capture et la reponse : c'est le meme geste
|
||||
* pour le joueur, il n'a pas a le voir disparaitre puis revenir.
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "Reglages")
|
||||
void ShowKeyCaptureConflict(const FText& Message, const FOnSettingsConfirmationResult& OnAnswer);
|
||||
|
||||
/** Referme le voile. A appeler quand le remappage est termine ou abandonne. */
|
||||
UFUNCTION(BlueprintCallable, Category = "Reglages")
|
||||
void CloseKeyCapture();
|
||||
|
||||
protected:
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UWidgetSwitcher> TabSwitcher;
|
||||
@@ -62,41 +120,58 @@ protected:
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UButton> BackButton;
|
||||
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
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.
|
||||
* Les trois onglets qui existent sont OBLIGATOIRES : un WBP_Settings sans eux
|
||||
* ne compile pas.
|
||||
*
|
||||
* BindWidgetOptional echoue en silence -- un nom mal orthographie donnait un
|
||||
* bouton parfaitement inerte, sans le moindre message. Pour un element dont
|
||||
* l'absence n'a aucun sens, on veut l'erreur a la compilation du Blueprint.
|
||||
*/
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UButton> GameplayTabButton;
|
||||
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UButton> DisplayTabButton;
|
||||
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UButton> GraphicsTabButton;
|
||||
|
||||
UPROPERTY(meta = (BindWidget))
|
||||
TObjectPtr<UButton> ControlsTabButton;
|
||||
|
||||
/**
|
||||
* Celui-la reste optionnel : sa page n'existe pas encore. Il passera en
|
||||
* BindWidget le jour ou l'onglet Audio sera ecrit -- en attendant, il se
|
||||
* grise tout seul si tu le poses.
|
||||
*/
|
||||
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.
|
||||
* Ton WBP_ConfirmDialog, a renseigner dans les Class Defaults de
|
||||
* WBP_Settings. Laisse-le vide et "Reinitialiser" agit sans rien demander.
|
||||
*/
|
||||
UPROPERTY(meta = (BindWidgetOptional))
|
||||
TObjectPtr<UConfirmDialogWidget> ResetDialog;
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Reglages")
|
||||
TSubclassOf<UConfirmDialogWidget> ResetDialogClass;
|
||||
|
||||
/** La question posee avant de reinitialiser l'onglet visible. */
|
||||
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Reglages")
|
||||
FText ResetDialogMessage;
|
||||
|
||||
/** Ton WBP_KeyCapture. Sans lui, l'onglet Touches ne peut rien remapper. */
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Reglages")
|
||||
TSubclassOf<UKeyCaptureWidget> KeyCaptureClass;
|
||||
|
||||
UPROPERTY(Transient, BlueprintReadOnly, Category = "Reglages")
|
||||
TObjectPtr<UConfirmDialogWidget> ResetDialog;
|
||||
|
||||
UPROPERTY(Transient, BlueprintReadOnly, Category = "Reglages")
|
||||
TObjectPtr<UKeyCaptureWidget> KeyCapture;
|
||||
|
||||
private:
|
||||
UFUNCTION()
|
||||
void HandleBackClicked();
|
||||
@@ -104,11 +179,21 @@ private:
|
||||
UFUNCTION()
|
||||
void HandleResetClicked();
|
||||
|
||||
/** Reponse a la question du bouton Reinitialiser. */
|
||||
UFUNCTION()
|
||||
void HandleResetConfirmed();
|
||||
void HandleResetAnswered(bool bConfirmed);
|
||||
|
||||
UFUNCTION()
|
||||
void HandleResetCancelled();
|
||||
void HandleDialogConfirmed();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleDialogCancelled();
|
||||
|
||||
/** Referme la boite et rend la reponse a qui a pose la question. */
|
||||
void FinishConfirmation(bool bConfirmed);
|
||||
|
||||
/** Cree la boite au premier besoin. Renvoie nullptr si aucune classe n'est assignee. */
|
||||
UConfirmDialogWidget* EnsureDialog();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleGameplayTabClicked();
|
||||
@@ -119,9 +204,24 @@ private:
|
||||
UFUNCTION()
|
||||
void HandleGraphicsTabClicked();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleControlsTabClicked();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleAudioTabClicked();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleKeyCaptured(FKey CapturedKey);
|
||||
|
||||
UFUNCTION()
|
||||
void HandleKeyCaptureCancelled();
|
||||
|
||||
UFUNCTION()
|
||||
void HandleKeyConflictAnswered(bool bConfirmed);
|
||||
|
||||
/** A qui rendre la reponse du conflit affiche dans le voile. */
|
||||
FOnSettingsConfirmationResult PendingConflictAnswer;
|
||||
|
||||
/** Change de page et rafraichit la nouvelle. Ignore un index inexistant. */
|
||||
void ShowTab(int32 Index);
|
||||
|
||||
@@ -131,5 +231,16 @@ private:
|
||||
/** Grise les boutons dont la page n'existe pas encore. */
|
||||
void UpdateTabButtonStates();
|
||||
|
||||
/** A qui rendre la reponse de la boite ouverte. Vide quand rien n'est pose. */
|
||||
FOnSettingsConfirmationResult PendingConfirmation;
|
||||
|
||||
/** A qui rendre la touche capturee. Vide quand le voile est ferme. */
|
||||
FOnSettingsKeyCaptureResult PendingKeyCapture;
|
||||
|
||||
bool bResetDialogOpen = false;
|
||||
|
||||
bool bKeyCaptureOpen = false;
|
||||
|
||||
/** Valeur de repli si l'appelant oublie SetDialogZOrder : devant le fondu exclu. */
|
||||
int32 DialogZOrder = 500;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user