// Project Lab - NHTV Igad #pragma once #include "MenuAction.h" #include "Blueprint/UserWidget.h" #include "MenuItemBase.generated.h" DECLARE_DYNAMIC_DELEGATE_OneParam(FOverlayItemClosed, int32, choice); extern TSubclassOf defaultButtonClass; extern TSubclassOf defaultSliderClass; /** * Base class for a menu item with controller navigation/input support */ UCLASS() class UNREALPROJECT_API UMenuItemBase : public UUserWidget { GENERATED_BODY() public: void NativeConstruct() override; void NativeDestruct() override; // Called when the item's menu has focus every frame virtual void FocusTick(float DeltaTime); UFUNCTION(BlueprintCallable, Category="MenuItem") virtual void NativeOnSelectionChanged(bool selected, bool controller); // Shows a message box and fires a delegate when the user chooses an option UFUNCTION(BlueprintCallable, Category = "SubMenu") class UMsgBoxInfo* ShowMessageBox(FOverlayItemClosed cb, FString caption, FString message, TArray options, FString defaultOption); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSelectionChanged, bool, selected); UPROPERTY(BlueprintAssignable, Category = "MenuItem") FSelectionChanged onSelectionChanged; // UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MenuItem") int32 priority; UPROPERTY(BlueprintReadOnly) int32 index; UFUNCTION(BlueprintCallable, Category = "MenuItem") bool IsSelected() const; UFUNCTION(BlueprintCallable, Category = "MenuItem") class USubMenu* GetSubMenu() const; UFUNCTION(BlueprintCallable, Category = "MenuItem") bool HasFocus() const; DECLARE_DYNAMIC_DELEGATE(FMenuAction); UFUNCTION(BlueprintCallable, Category = "MenuItem") void AddActionBinding(EMenuActionBinding binding, FMenuAction action); UFUNCTION(BlueprintCallable, Category = "MenuItem") void ClearActionBinding(EMenuActionBinding binding); UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") void OnMenuAction(EMenuActionBinding binding); virtual void NativeOnMenuAction(EMenuActionBinding binding); UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") FText GetDescription(); UFUNCTION(BlueprintNativeEvent, Category = "MenuItem") FText GetTitle(); UPROPERTY(BlueprintReadOnly, Category="MenuItem") bool blockInput; private: bool m_selected; friend class APlayerControllerBase; friend class USubMenu; TMultiMap m_actionBindings; protected: UPROPERTY() class USubMenu* m_subMenu; };