// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "InventoryScreenWidget.generated.h" class UButton; class UCraftingWidget; class UInventoryWidget; class UWidgetSwitcher; /** * L'onglet visible a change. true = Inventaire, false = Fabrication. * * L'ecran se contente d'annoncer. Ce que ca implique pour le reste du HUD -- * masquer la barre rapide, par exemple -- ne le regarde pas : il serait alors * un widget reutilisable qui connait la pile de son hote, exactement ce qu'on * evite partout ailleurs. */ DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnInventoryScreenTabChanged, bool, bInventoryTabActive); /** * L'ecran que Tab ouvre : une barre d'onglets et deux pages, Inventaire et * Fabrication. * * Il ne contient aucune logique de l'une ni de l'autre. Les pages restent des * widgets autonomes -- la grille d'inventaire n'a pas change d'une ligne en * devenant une page -- et l'ecran ne fait que les montrer, les rebrancher apres * un respawn, et relayer au controller ce dont il a besoin. * * Classe Abstract : on cree un WBP_InventoryScreen qui en herite. */ UCLASS(Abstract) class SURVIVAL_PROJET_API UInventoryScreenWidget : public UUserWidget { GENERATED_BODY() public: virtual void NativeConstruct() override; /** Rebranche les deux pages sur le pawn possede. A appeler depuis OnPossess. */ void BindToOwningPawn(); /** * Index de la case d'inventaire survolee, ou INDEX_NONE. * * Renvoie INDEX_NONE des que l'onglet Fabrication est affiche : sans ca, la * touche "jeter" agirait sur une case invisible, sous le panneau de craft. */ int32 GetHoveredSlotIndex() const; /** Revient sur l'onglet Inventaire. Appele a chaque ouverture par Tab. */ UFUNCTION(BlueprintCallable, Category = "UI") void ShowInventoryTab(); /** Bascule sur l'onglet Fabrication. Appele par la touche dediee. */ UFUNCTION(BlueprintCallable, Category = "UI") void ShowCraftingTab(); UPROPERTY(BlueprintAssignable, Category = "UI") FOnInventoryScreenTabChanged OnTabChanged; protected: /** * Absorbe ou traite les depots qui ne visent aucune page. * Meme regle que dans la grille : lache hors des cases, l'objet est jete. */ virtual bool NativeOnDrop(const FGeometry& InGeometry, const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation) override; UPROPERTY(meta = (BindWidget)) TObjectPtr TabSwitcher; UPROPERTY(meta = (BindWidget)) TObjectPtr InventoryTabButton; UPROPERTY(meta = (BindWidget)) TObjectPtr CraftingTabButton; /** * Ton WBP_Inventory, pose comme enfant du WidgetSwitcher et renomme * "InventoryPage". Les deux pages sont obligatoires : un ecran a onglets * auquel il manque une page n'a aucun sens, autant que le Blueprint refuse * de compiler. */ UPROPERTY(meta = (BindWidget)) TObjectPtr InventoryPage; /** Ton WBP_Crafting, renomme "CraftingPage". */ UPROPERTY(meta = (BindWidget)) TObjectPtr CraftingPage; private: UFUNCTION() void HandleInventoryTabClicked(); UFUNCTION() void HandleCraftingTabClicked(); /** * Affiche une page et grise son bouton d'onglet. * * On passe le widget et non un index en dur : l'ordre des enfants du * WidgetSwitcher se change d'un glisser dans la Designer, et un 0/1 code ici * inverserait silencieusement les onglets le jour ou ca arrive. */ void ShowPage(UWidget* Page); bool IsInventoryTabActive() const; };