(Feat) Add Main Menu + Music Manger

This commit is contained in:
2026-07-29 20:18:51 +02:00
parent 956f48816b
commit 9b5ad7c8a4
55 changed files with 3727 additions and 125 deletions
@@ -8,6 +8,7 @@
class UButton;
class UProgressBar;
class USlider;
class UTextBlock;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSettingRowIndexChanged, int32, NewIndex);
@@ -49,10 +50,17 @@ public:
/**
* Mode nombre : la valeur affichee est calculee a partir de l'index.
* Suffix sert aux unites ("%", "°") et peut rester vide.
*
* @param Step pas fin, celui du glissement. C'est lui qui definit la
* granularite de l'index.
* @param ArrowStep bond des fleches, forcement un multiple de Step. Les
* fleches se calent sur le multiple suivant plutot que
* d'ajouter betement leur bond : depuis 37 avec un bond de
* 5 on arrive a 40, pas a 42.
* @param Suffix unite ("%", "°"), peut rester vide.
*/
UFUNCTION(BlueprintCallable, Category = "Reglages")
void SetupAsNumber(const FText& Label, float Min, float Max, float Step, float Value, const FText& Suffix);
void SetupAsNumber(const FText& Label, float Min, float Max, float Step, float ArrowStep, float Value, const FText& Suffix);
UFUNCTION(BlueprintPure, Category = "Reglages")
int32 GetIndex() const { return CurrentIndex; }
@@ -75,6 +83,18 @@ public:
UFUNCTION(BlueprintCallable, Category = "Reglages")
void SetNumericValueSilently(float Value);
/**
* Derniere valeur que le JOUEUR peut atteindre, les suivantes restant
* affichables par le code.
*
* Sert a "Personnalise" en qualite globale : c'est un etat dans lequel on
* tombe en bougeant un curseur individuel, jamais un choix qu'on fait.
* Sans ca la fleche droite proposerait de le "selectionner", ce qui ne veut
* rien dire. INDEX_NONE pour lever la limite.
*/
UFUNCTION(BlueprintCallable, Category = "Reglages")
void SetMaxSelectableIndex(int32 InMaxSelectableIndex);
protected:
UPROPERTY(meta = (BindWidget))
TObjectPtr<UTextBlock> LabelText;
@@ -89,14 +109,29 @@ protected:
TObjectPtr<UButton> RightArrowButton;
/**
* Facultative : une ligne de choix (Maintien / Bascule) n'a rien a remplir.
* Volontairement une ProgressBar et non un Slider : la barre montre ou l'on
* en est, ce sont les fleches qui reglent. Un slider glissable produirait des
* valeurs entre deux paliers que le setter refuserait ensuite.
* Le REMPLISSAGE visible, et rien d'autre.
*
* Le Slider d'Unreal ne sait pas dessiner de portion remplie : il rend une
* barre uniforme plus une poignee. On empile donc les deux -- cette
* ProgressBar pour le rendu, le Slider transparent par-dessus pour le
* geste. C'est le montage habituel, pas un bricolage.
*/
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UProgressBar> ValueBar;
/**
* Le GESTE, et rien d'autre : a styler entierement transparent dans le WBP.
*
* Sa course est exprimee en INDEX de palier (0 a StepCount-1) et non dans
* l'unite du reglage -- c'est ce qui garantit qu'un glissement ne peut pas
* produire une valeur hors palier, que le setter refuserait ensuite.
*
* Les deux sont facultatifs : une ligne de choix (Maintien / Bascule) les
* replie tous les deux, il n'y a rien a doser.
*/
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<USlider> ValueSlider;
private:
UFUNCTION()
void HandleLeftClicked();
@@ -104,9 +139,19 @@ private:
UFUNCTION()
void HandleRightClicked();
/** Glissement souris : on arrondit sur le palier le plus proche. */
UFUNCTION()
void HandleSliderValueChanged(float NewValue);
/** Deplace l'index de Delta paliers et diffuse, si le mouvement est possible. */
void StepIndex(int32 Delta);
/** Index vise par une fleche : le multiple de son bond suivant ou precedent. */
int32 ArrowTargetIndex(int32 Direction) const;
/** Plus grand index atteignable par le joueur. */
int32 MaxSelectable() const;
/** Reecrit le texte, la barre et l'etat des deux fleches. */
void Refresh();
@@ -120,8 +165,23 @@ private:
int32 CurrentIndex = 0;
/** Nombre de paliers, donc d'index valides. Toujours au moins 1. */
/** Nombre de paliers fins, donc d'index valides. Toujours au moins 1. */
int32 StepCount = 1;
/** Bond des fleches, exprime en nombre de paliers fins. 1 en mode choix. */
int32 ArrowIndexDelta = 1;
/** INDEX_NONE = aucune limite, tous les paliers sont selectionnables. */
int32 MaxSelectableIndex = INDEX_NONE;
bool bNumeric = false;
/**
* Vrai pendant qu'on repositionne le curseur depuis le code.
*
* USlider::SetValue ne rediffuse pas son delegue aujourd'hui, mais s'en
* remettre a ce detail d'implementation coute une boucle infinie le jour ou
* il change.
*/
bool bRefreshingSlider = false;
};