// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "ItemDetailsWidget.generated.h" class UImage; class UInventoryComponent; class UProgressBar; class UTextBlock; /** * Le panneau qui decrit l'objet survole : icone, nom, description, usure. * Rien d'autre -- volontairement. * * Il ne connait ni la grille ni l'ecran. On lui pousse un couple * (inventaire, index) et il lit -- et NON une copie du FInventorySlot : * le contenu peut changer pendant le survol (une charge consommee, un craft * qui vide la pile), donc le panneau s'abonne a OnInventoryChanged de * l'inventaire affiche et se relit tout seul. Jamais de Tick. * * Aucun texte en dur ici en dehors du format numerique de l'usure : la mise en * page et les libelles appartiennent au Widget Blueprint. */ UCLASS(Abstract) class EMBERWILD_API UItemDetailsWidget : public UUserWidget { GENERATED_BODY() public: virtual void NativeConstruct() override; virtual void NativeDestruct() override; /** Affiche la case InSlotIndex de InInventory. Index invalide = etat vide. */ void ShowSlot(UInventoryComponent* InInventory, int32 InSlotIndex); /** Repasse en etat vide et coupe l'abonnement. */ void Clear(); /** * Efface, mais seulement si c'est bien CETTE case qui est affichee. * * Le panneau est unique et trois conteneurs le nourrissent -- grille, barre * rapide, et la grille elle-meme quand elle se rebranche. Passer de l'un a * l'autre emet "entre dans B" PUIS "sort de A" : un effacement * inconditionnel viderait l'affichage qui vient d'arriver. */ void ClearSlot(const UInventoryComponent* InInventory, int32 InSlotIndex); protected: /** A nommer exactement "ItemIcon" dans le Widget Blueprint. */ UPROPERTY(meta = (BindWidget)) TObjectPtr ItemIcon; /** A nommer exactement "ItemNameText". */ UPROPERTY(meta = (BindWidget)) TObjectPtr ItemNameText; /** Pense a cocher "Auto Wrap Text" dessus, sinon le panneau s'elargit. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr ItemDescriptionText; /** * Bloc d'usure entier -- barre et texte ensemble -- replie sur tout objet * qui n'a pas de charges multiples. Sans lui, la barre et son texte * devraient etre replies separement et finiraient un jour desynchronises. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr UsesPanel; UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr UsesBar; /** "3 / 5", pose par-dessus la barre. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr UsesText; /** * Le conteneur qui empile tout le panneau -- a renommer "ContentRoot", ce * n'est pas un widget de plus. * * Il est masque en bloc quand rien n'est survole. Sans lui, la barre de * separation resterait seule a l'ecran : c'est une decoration du Blueprint, * le C++ n'a aucune raison de la connaitre individuellement. */ UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr ContentRoot; private: UFUNCTION() void HandleInventoryChanged(); /** Relit la case et repeint tout le panneau. */ void Refresh(); /** * Etat vide : plus rien a l'ecran. * * Le panneau n'a pas de fond, donc vide il est simplement invisible -- et sa * largeur est tenue par le Size Box du Blueprint, pas par son contenu. C'est * ce qui empeche la grille de sauter lateralement quand le curseur quitte * une case. */ void ClearDisplay(); /** (Re)branche OnInventoryChanged. Un seul abonnement a la fois. */ void BindInventory(UInventoryComponent* InInventory); TWeakObjectPtr BoundInventory; int32 SlotIndex = INDEX_NONE; };