41d6e6a7f3
Coffres : AStorageContainer, un UInventoryComponent configure en conteneur, affiche comme panneau de WBP_InventoryScreen plutot que dans un ecran a lui. Deplacement unifie par UInventoryComponent::TransferSlot / TransferAllTo. Panneau de detail : UItemDetailsWidget, pose DANS WBP_Inventory a droite de la grille. Icone, nom, separation, description, barre d'usure. Il recoit un couple (inventaire, index) et s'abonne a OnInventoryChanged, donc une charge consommee sous le curseur se voit. Une case ne connait plus sa grille : elle diffuse OnHoverChanged. La barre rapide s'y abonne aussi et relaie par le PlayerController, seul a posseder a la fois le HUD et l'ecran. Le panneau efface la case qu'on QUITTE et non lui-meme, sinon passer de la barre a la grille viderait ce qui vient d'etre affiche. L'ecran allume et eteint le panneau (SetItemDetailsEnabled) : WBP_Inventory etant instancie deux fois en mode coffre, une case a cocher par instance serait un bug qui attend qu'on oublie de la decocher. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
136 lines
5.0 KiB
C++
136 lines
5.0 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Blueprint/UserWidget.h"
|
|
#include "InventoryComponent.h"
|
|
#include "InventorySlotWidget.generated.h"
|
|
|
|
class UImage;
|
|
class UProgressBar;
|
|
class UTextBlock;
|
|
|
|
/**
|
|
* Le curseur est entre sur cette case, ou en est sorti.
|
|
*
|
|
* Un delegue et non un pointeur vers la grille : la barre rapide pose les
|
|
* memes cases sans etre un UInventoryWidget, et elle a autant besoin du survol
|
|
* depuis que l'inventaire affiche un panneau de detail.
|
|
*/
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnInventorySlotHoverChanged, int32, SlotIndex, bool, bHovered);
|
|
|
|
/**
|
|
* Une case de la grille d'inventaire : une icone et une quantite.
|
|
*
|
|
* Volontairement passive pour l'affichage : elle ne va jamais chercher
|
|
* l'information elle-meme, c'est la grille parente qui lui pousse son contenu
|
|
* via SetSlot(). Elle est en revanche autonome pour le glisser-deposer, parce
|
|
* que c'est elle qui recoit les evenements souris.
|
|
*/
|
|
UCLASS(Abstract)
|
|
class SURVIVAL_PROJET_API UInventorySlotWidget : public UUserWidget
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
virtual void NativeConstruct() override;
|
|
|
|
/** Appele une fois a la creation : dit a la case qui elle represente. */
|
|
void InitSlot(UInventoryComponent* InInventory, int32 InSlotIndex);
|
|
|
|
/** Le conteneur qui a cree cette case s'y abonne pour suivre le survol. */
|
|
UPROPERTY()
|
|
FOnInventorySlotHoverChanged OnHoverChanged;
|
|
|
|
/** Affiche le contenu d'un slot, ou se vide si le slot est vide. */
|
|
UFUNCTION(BlueprintCallable, Category = "Inventaire")
|
|
void SetSlot(const FInventorySlot& InSlot);
|
|
|
|
/**
|
|
* Transforme cette instance en fantome de glisser : le fond de case
|
|
* disparait pour ne laisser flotter que l'objet lui-meme.
|
|
*/
|
|
void ConfigureAsDragVisual();
|
|
|
|
/** Affiche ou masque le cadre de selection (barre rapide). */
|
|
UFUNCTION(BlueprintCallable, Category = "Inventaire")
|
|
void SetSelected(bool bSelected);
|
|
|
|
/**
|
|
* Inventaire vers lequel le CLIC DROIT envoie le contenu de cette case.
|
|
*
|
|
* Nul en temps normal : hors de l'ecran de coffre il n'existe aucun "autre
|
|
* cote" evident, et deviner une destination reviendrait a faire disparaitre
|
|
* des objets sur un clic malheureux. C'est l'ecran qui sait, et qui pousse.
|
|
*/
|
|
void SetQuickTransferTarget(UInventoryComponent* InTarget);
|
|
|
|
protected:
|
|
// --- Glisser-deposer ---
|
|
virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
|
|
virtual void NativeOnDragDetected(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent, UDragDropOperation*& OutOperation) override;
|
|
virtual bool NativeOnDrop(const FGeometry& InGeometry, const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation) override;
|
|
|
|
// --- Survol, pour que la touche "jeter" sache sur quoi agir ---
|
|
virtual void NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
|
|
virtual void NativeOnMouseLeave(const FPointerEvent& InMouseEvent) override;
|
|
|
|
/** A nommer exactement "ItemIcon" dans le Widget Blueprint. */
|
|
UPROPERTY(meta = (BindWidget))
|
|
TObjectPtr<UImage> ItemIcon;
|
|
|
|
/** A nommer exactement "QuantityText". */
|
|
UPROPERTY(meta = (BindWidget))
|
|
TObjectPtr<UTextBlock> QuantityText;
|
|
|
|
/**
|
|
* Fond de case. BindWidgetOptional et non BindWidget : le Blueprint peut
|
|
* s'en passer sans casser la compilation, c'est purement decoratif.
|
|
* Nomme-le "SlotBackground" pour qu'il soit masque pendant le glisser.
|
|
*/
|
|
UPROPERTY(meta = (BindWidgetOptional))
|
|
TObjectPtr<UWidget> SlotBackground;
|
|
|
|
/**
|
|
* Cadre affiche quand la case est le slot actif de la barre rapide.
|
|
* Optionnel : la grille d'inventaire ne s'en sert jamais.
|
|
*/
|
|
UPROPERTY(meta = (BindWidgetOptional))
|
|
TObjectPtr<UWidget> SelectionBorder;
|
|
|
|
/**
|
|
* Petite barre d'usure en bas de la case, pour les objets a usages
|
|
* multiples. Masquee automatiquement sur tout le reste.
|
|
* A nommer "UsesBar" dans le Widget Blueprint.
|
|
*/
|
|
UPROPERTY(meta = (BindWidgetOptional))
|
|
TObjectPtr<UProgressBar> UsesBar;
|
|
|
|
/** Opacite du fantome qui suit le curseur pendant le glisser. */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventaire", meta = (ClampMin = "0.05", ClampMax = "1.0"))
|
|
float DragVisualOpacity = 0.85f;
|
|
|
|
/** Opacite de la case d'origine tant que le glisser est en cours. */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventaire", meta = (ClampMin = "0.0", ClampMax = "1.0"))
|
|
float DraggedSlotOpacity = 0.3f;
|
|
|
|
private:
|
|
/** Rebranche l'opacite normale, que le glisser ait abouti ou non. */
|
|
UFUNCTION()
|
|
void HandleDragFinished(UDragDropOperation* Operation);
|
|
|
|
TWeakObjectPtr<UInventoryComponent> OwningInventory;
|
|
|
|
/** Destination du clic droit. Voir SetQuickTransferTarget(). */
|
|
TWeakObjectPtr<UInventoryComponent> QuickTransferTarget;
|
|
|
|
int32 SlotIndex = INDEX_NONE;
|
|
|
|
/** Dernier contenu recu, pour construire le fantome de glisser. */
|
|
FInventorySlot CachedSlot;
|
|
|
|
/** Vrai si cette instance est un fantome et non une vraie case de la grille. */
|
|
bool bIsDragVisual = false;
|
|
};
|