Files
Unreal_EmberWild/Source/EmberWild/Public/ItemDetailsWidget.h
T

115 lines
3.6 KiB
C++

// 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<UImage> ItemIcon;
/** A nommer exactement "ItemNameText". */
UPROPERTY(meta = (BindWidget))
TObjectPtr<UTextBlock> ItemNameText;
/** Pense a cocher "Auto Wrap Text" dessus, sinon le panneau s'elargit. */
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> 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<UWidget> UsesPanel;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UProgressBar> UsesBar;
/** "3 / 5", pose par-dessus la barre. */
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> 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<UWidget> 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<UInventoryComponent> BoundInventory;
int32 SlotIndex = INDEX_NONE;
};