96 lines
3.1 KiB
C++
96 lines
3.1 KiB
C++
// 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<UHorizontalBox> SlotContainer;
|
|
|
|
/** Le meme WBP_InventorySlot que la grille : une seule apparence a maintenir. */
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Inventaire")
|
|
TSubclassOf<UInventorySlotWidget> 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<UInventoryComponent> BoundInventory;
|
|
|
|
/** Destination du clic droit, recopiee sur chaque case creee. */
|
|
TWeakObjectPtr<UInventoryComponent> QuickTransferTarget;
|
|
|
|
/** UPROPERTY obligatoire : sans ca le GC collecterait les cases. */
|
|
UPROPERTY(Transient)
|
|
TArray<TObjectPtr<UInventorySlotWidget>> SlotWidgets;
|
|
};
|