// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "HotbarWidget.generated.h" class UHorizontalBox; class UInventoryComponent; class UInventorySlotWidget; /** * Le curseur entre ou sort d'une case de la barre rapide. * * La barre n'affiche rien elle-meme : le panneau de detail vit dans l'ecran * d'inventaire, qu'elle ne connait pas. C'est le PlayerController qui tient les * deux widgets et qui fait le pont -- il est deja le proprietaire du HUD. */ DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnHotbarSlotHovered, UInventoryComponent*, Inventory, int32, SlotIndex, bool, bHovered); /** * Barre rapide en bas de l'ecran, affichee en permanence. * * Elle ne possede aucune donnee : elle montre les N premiers slots de * l'inventaire. Deplacer un objet de la grille vers la barre, c'est * simplement le deplacer vers un slot d'index bas -- le glisser-deposer * existant s'en occupe deja sans aucun code supplementaire. */ UCLASS(Abstract) class EMBERWILD_API UHotbarWidget : public UUserWidget { GENERATED_BODY() public: virtual void NativeConstruct() override; virtual void NativeDestruct() override; /** Remet a jour contenu et selection. */ UFUNCTION(BlueprintCallable, Category = "Inventaire") void Refresh(); /** (Re)branche sur l'inventaire du pawn possede. Voir UInventoryWidget. */ void BindToOwningPawn(); /** * Destination du clic droit pour les cases de la barre. * * La barre reste affichee et cliquable par-dessus l'ecran de coffre : sans * ca, le clic droit marcherait dans la grille et pas dans la barre, ce qui * passerait pour un bug. Le controller lui pousse le coffre a l'ouverture * et nullptr a la fermeture. */ void SetQuickTransferTarget(UInventoryComponent* InTarget); UPROPERTY(BlueprintAssignable, Category = "Inventory") FOnHotbarSlotHovered OnSlotHovered; protected: /** A nommer exactement "SlotContainer" dans le Widget Blueprint. */ UPROPERTY(meta = (BindWidget)) TObjectPtr SlotContainer; /** Le meme WBP_InventorySlot que la grille : une seule apparence a maintenir. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Inventaire") TSubclassOf SlotWidgetClass; /** Espacement entre les cases. */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Inventaire", meta = (ClampMin = "0")) float SlotPadding = 4.f; private: UFUNCTION() void HandleInventoryChanged(); UFUNCTION() void HandleSelectionChanged(int32 NewIndex); /** Abonne aux cases : relaie le survol vers l'exterieur. */ UFUNCTION() void HandleSlotHovered(int32 SlotIndex, bool bHovered); void RebuildSlots(int32 DesiredCount); UInventoryComponent* ResolveInventory() const; TWeakObjectPtr BoundInventory; /** Destination du clic droit, recopiee sur chaque case creee. */ TWeakObjectPtr QuickTransferTarget; /** UPROPERTY obligatoire : sans ca le GC collecterait les cases. */ UPROPERTY(Transient) TArray> SlotWidgets; };