diff --git a/Content/Widgets/BP_CustomButton.uasset b/Content/Widgets/BP_CustomButton.uasset index 4690b8c..63c0860 100644 --- a/Content/Widgets/BP_CustomButton.uasset +++ b/Content/Widgets/BP_CustomButton.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8f04235f8da7980ddd63ba79a27454b56e01ba83db2f926e4c9b0005f268c49 -size 28939 +oid sha256:494462ef0f0b6fc7e0d7ddb677bc13d159df410bcd40b058b1e36171e14f1990 +size 29241 diff --git a/Content/Widgets/MainMenu/BP_MainMenuWidget.uasset b/Content/Widgets/MainMenu/BP_MainMenuWidget.uasset index cf7b21a..bbe6b81 100644 --- a/Content/Widgets/MainMenu/BP_MainMenuWidget.uasset +++ b/Content/Widgets/MainMenu/BP_MainMenuWidget.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:123b21415cb1743d0f9a0a01e67f7b8badf595e6bfb1fa8e499eefc7fa9248e1 -size 36010 +oid sha256:b36162b739be523b053cf0902be73631c715b324e07060c575f4bfb4577e5945 +size 38512 diff --git a/Source/vampires/Widgets/CustomButton.cpp b/Source/vampires/Widgets/CustomButton.cpp index aa24671..4e8f09f 100644 --- a/Source/vampires/Widgets/CustomButton.cpp +++ b/Source/vampires/Widgets/CustomButton.cpp @@ -36,7 +36,28 @@ void UCustomButton::SynchronizeProperties() } } -TObjectPtr UCustomButton::GetTextBlock() +void UCustomButton::NativeOnAddedToFocusPath(const FFocusEvent& InFocusEvent) +{ + Super::NativeOnAddedToFocusPath(InFocusEvent); + + OnFocused.Broadcast(InFocusEvent); + OnButtonHovered(); +} + +void UCustomButton::NativeOnRemovedFromFocusPath(const FFocusEvent& InFocusEvent) +{ + Super::NativeOnRemovedFromFocusPath(InFocusEvent); + + OnUnfocused.Broadcast(InFocusEvent); + OnButtonUnhovered(); +} + +UButton* UCustomButton::GetButton() +{ + return ButtonBody; +} + +UTextBlock* UCustomButton::GetTextBlock() { return TextBlock; } diff --git a/Source/vampires/Widgets/CustomButton.h b/Source/vampires/Widgets/CustomButton.h index 71ed665..ec853b5 100644 --- a/Source/vampires/Widgets/CustomButton.h +++ b/Source/vampires/Widgets/CustomButton.h @@ -17,6 +17,8 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonReleasedEventCustom); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonHoverEventCustom); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFocusPath, FFocusEvent, InFocusEvent); + /** * */ @@ -41,6 +43,12 @@ public: UPROPERTY(BlueprintAssignable) FOnButtonHoverEventCustom OnUnhovered; + UPROPERTY(BlueprintAssignable) + FFocusPath OnFocused; + + UPROPERTY(BlueprintAssignable) + FFocusPath OnUnfocused; + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Button Settings | Text") FText ButtonText = FText::FromString("Default"); @@ -79,8 +87,16 @@ protected: virtual void SynchronizeProperties() override; + virtual void NativeOnAddedToFocusPath(const FFocusEvent& InFocusEvent) override; + + virtual void NativeOnRemovedFromFocusPath(const FFocusEvent& InFocusEvent) override; + public: - TObjectPtr GetTextBlock(); + UFUNCTION(BlueprintCallable) + UButton* GetButton(); + + UFUNCTION(BlueprintCallable) + UTextBlock* GetTextBlock(); protected: UFUNCTION() diff --git a/Source/vampires/Widgets/MainMenuWidget.cpp b/Source/vampires/Widgets/MainMenuWidget.cpp index 7620790..06efb19 100644 --- a/Source/vampires/Widgets/MainMenuWidget.cpp +++ b/Source/vampires/Widgets/MainMenuWidget.cpp @@ -15,16 +15,19 @@ void UMainMenuWidget::NativeConstruct() if (NewGameButton) { NewGameButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonOnClicked); + NewGameButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonFocused); } if (OptionsButton) { OptionsButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::OptionsButtonOnClicked); + OptionsButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::OptionsButtonFocused); } if (QuitButton) { QuitButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonOnClicked); + QuitButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonFocused); } QuitButton->SetIsEnabled(false); @@ -38,11 +41,26 @@ void UMainMenuWidget::NativeConstruct() FReply UMainMenuWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) { - NewGameButton->SetKeyboardFocus(); + CurrentFocus->SetKeyboardFocus(); return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent); } +UCustomButton* UMainMenuWidget::GetNewGameButton() +{ + return NewGameButton; +} + +UCustomButton* UMainMenuWidget::GetOptionsButton() +{ + return OptionsButton; +} + +UCustomButton* UMainMenuWidget::GetQuitButton() +{ + return QuitButton; +} + void UMainMenuWidget::NewGameButtonOnClicked() { if (NewGameMenuWidget) @@ -59,6 +77,11 @@ void UMainMenuWidget::NewGameButtonOnClicked() } } +void UMainMenuWidget::NewGameButtonFocused(FFocusEvent InFocusEvent) +{ + SetCurrentFocus(NewGameButton); +} + void UMainMenuWidget::OptionsButtonOnClicked() { if (OptionsMenuWidget) @@ -75,6 +98,11 @@ void UMainMenuWidget::OptionsButtonOnClicked() } } +void UMainMenuWidget::OptionsButtonFocused(FFocusEvent InFocusEvent) +{ + SetCurrentFocus(OptionsButton); +} + void UMainMenuWidget::QuitButtonOnClicked() { // TODO: Add platform specific Exit requests @@ -82,3 +110,8 @@ void UMainMenuWidget::QuitButtonOnClicked() // For some reason the generic version does not work the same as FWindowsPlatformMisc FWindowsPlatformMisc::RequestExit(false); } + +void UMainMenuWidget::QuitButtonFocused(FFocusEvent InFocusEvent) +{ + SetCurrentFocus(QuitButton); +} diff --git a/Source/vampires/Widgets/MainMenuWidget.h b/Source/vampires/Widgets/MainMenuWidget.h index a1d750e..bc57fa7 100644 --- a/Source/vampires/Widgets/MainMenuWidget.h +++ b/Source/vampires/Widgets/MainMenuWidget.h @@ -11,7 +11,7 @@ class UCustomButton; * */ UCLASS() -class VAMPIRES_API UMainMenuWidget : public UUserWidget +class VAMPIRES_API UMainMenuWidget : public UVampireInteractiveWidget { GENERATED_BODY() @@ -39,13 +39,32 @@ public: protected: virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; +public: + UFUNCTION(BlueprintCallable) + UCustomButton* GetNewGameButton(); + + UFUNCTION(BlueprintCallable) + UCustomButton* GetOptionsButton(); + + UFUNCTION(BlueprintCallable) + UCustomButton* GetQuitButton(); + private: UFUNCTION() void NewGameButtonOnClicked(); + UFUNCTION() + void NewGameButtonFocused(FFocusEvent InFocusEvent); + UFUNCTION() void OptionsButtonOnClicked(); + UFUNCTION() + void OptionsButtonFocused(FFocusEvent InFocusEvent); + UFUNCTION() void QuitButtonOnClicked(); + + UFUNCTION() + void QuitButtonFocused(FFocusEvent InFocusEvent); }; diff --git a/Source/vampires/Widgets/VampireInteractiveWidget.cpp b/Source/vampires/Widgets/VampireInteractiveWidget.cpp index 6293925..2263db5 100644 --- a/Source/vampires/Widgets/VampireInteractiveWidget.cpp +++ b/Source/vampires/Widgets/VampireInteractiveWidget.cpp @@ -28,6 +28,11 @@ void UVampireInteractiveWidget::SetReturnScreen(UUserWidget* UserWidget) } } +void UVampireInteractiveWidget::SetCurrentFocus(UUserWidget* UserWidget) +{ + CurrentFocus = UserWidget; +} + void UVampireInteractiveWidget::PlayHoveredSound() { if (ButtonHoveredSound) diff --git a/Source/vampires/Widgets/VampireInteractiveWidget.h b/Source/vampires/Widgets/VampireInteractiveWidget.h index 5588050..12497df 100644 --- a/Source/vampires/Widgets/VampireInteractiveWidget.h +++ b/Source/vampires/Widgets/VampireInteractiveWidget.h @@ -6,6 +6,7 @@ #include "Blueprint/UserWidget.h" #include "VampireInteractiveWidget.generated.h" +class UCustomButton; class UButton; class UTextBlock; /** @@ -16,6 +17,8 @@ class VAMPIRES_API UVampireInteractiveWidget : public UUserWidget { GENERATED_BODY() + // TODO: Remove a lot of this stuff that has now been replaced by UCustomButton + protected: UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings | Sound") TObjectPtr ButtonHoveredSound; @@ -35,7 +38,8 @@ protected: UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings") TArray> InteractableButtons; -protected: + TObjectPtr CurrentFocus; + UPROPERTY() TObjectPtr PreviousScreen; @@ -49,6 +53,9 @@ public: UFUNCTION() void SetReturnScreen(UUserWidget* UserWidget); + UFUNCTION() + void SetCurrentFocus(UUserWidget* UserWidget); + protected: UFUNCTION() void PlayHoveredSound();