Get Focusing set up on the Main Menu widget

This commit is contained in:
baz 2025-08-28 03:36:23 +01:00
parent e129f2f0cc
commit e7a10aa267
8 changed files with 110 additions and 9 deletions

BIN
Content/Widgets/BP_CustomButton.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

View File

@ -36,7 +36,28 @@ void UCustomButton::SynchronizeProperties()
} }
} }
TObjectPtr<UTextBlock> 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; return TextBlock;
} }

View File

@ -17,6 +17,8 @@ DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonReleasedEventCustom);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonHoverEventCustom); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnButtonHoverEventCustom);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFocusPath, FFocusEvent, InFocusEvent);
/** /**
* *
*/ */
@ -41,6 +43,12 @@ public:
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FOnButtonHoverEventCustom OnUnhovered; FOnButtonHoverEventCustom OnUnhovered;
UPROPERTY(BlueprintAssignable)
FFocusPath OnFocused;
UPROPERTY(BlueprintAssignable)
FFocusPath OnUnfocused;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Button Settings | Text") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Button Settings | Text")
FText ButtonText = FText::FromString("Default"); FText ButtonText = FText::FromString("Default");
@ -79,8 +87,16 @@ protected:
virtual void SynchronizeProperties() override; virtual void SynchronizeProperties() override;
virtual void NativeOnAddedToFocusPath(const FFocusEvent& InFocusEvent) override;
virtual void NativeOnRemovedFromFocusPath(const FFocusEvent& InFocusEvent) override;
public: public:
TObjectPtr<UTextBlock> GetTextBlock(); UFUNCTION(BlueprintCallable)
UButton* GetButton();
UFUNCTION(BlueprintCallable)
UTextBlock* GetTextBlock();
protected: protected:
UFUNCTION() UFUNCTION()

View File

@ -15,16 +15,19 @@ void UMainMenuWidget::NativeConstruct()
if (NewGameButton) if (NewGameButton)
{ {
NewGameButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonOnClicked); NewGameButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonOnClicked);
NewGameButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::NewGameButtonFocused);
} }
if (OptionsButton) if (OptionsButton)
{ {
OptionsButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::OptionsButtonOnClicked); OptionsButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::OptionsButtonOnClicked);
OptionsButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::OptionsButtonFocused);
} }
if (QuitButton) if (QuitButton)
{ {
QuitButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonOnClicked); QuitButton->OnClicked.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonOnClicked);
QuitButton->OnFocused.AddUniqueDynamic(this, &UMainMenuWidget::QuitButtonFocused);
} }
QuitButton->SetIsEnabled(false); QuitButton->SetIsEnabled(false);
@ -38,11 +41,26 @@ void UMainMenuWidget::NativeConstruct()
FReply UMainMenuWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) FReply UMainMenuWidget::NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
{ {
NewGameButton->SetKeyboardFocus(); CurrentFocus->SetKeyboardFocus();
return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent); return Super::NativeOnMouseButtonUp(InGeometry, InMouseEvent);
} }
UCustomButton* UMainMenuWidget::GetNewGameButton()
{
return NewGameButton;
}
UCustomButton* UMainMenuWidget::GetOptionsButton()
{
return OptionsButton;
}
UCustomButton* UMainMenuWidget::GetQuitButton()
{
return QuitButton;
}
void UMainMenuWidget::NewGameButtonOnClicked() void UMainMenuWidget::NewGameButtonOnClicked()
{ {
if (NewGameMenuWidget) if (NewGameMenuWidget)
@ -59,6 +77,11 @@ void UMainMenuWidget::NewGameButtonOnClicked()
} }
} }
void UMainMenuWidget::NewGameButtonFocused(FFocusEvent InFocusEvent)
{
SetCurrentFocus(NewGameButton);
}
void UMainMenuWidget::OptionsButtonOnClicked() void UMainMenuWidget::OptionsButtonOnClicked()
{ {
if (OptionsMenuWidget) if (OptionsMenuWidget)
@ -75,6 +98,11 @@ void UMainMenuWidget::OptionsButtonOnClicked()
} }
} }
void UMainMenuWidget::OptionsButtonFocused(FFocusEvent InFocusEvent)
{
SetCurrentFocus(OptionsButton);
}
void UMainMenuWidget::QuitButtonOnClicked() void UMainMenuWidget::QuitButtonOnClicked()
{ {
// TODO: Add platform specific Exit requests // 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 // For some reason the generic version does not work the same as FWindowsPlatformMisc
FWindowsPlatformMisc::RequestExit(false); FWindowsPlatformMisc::RequestExit(false);
} }
void UMainMenuWidget::QuitButtonFocused(FFocusEvent InFocusEvent)
{
SetCurrentFocus(QuitButton);
}

View File

@ -11,7 +11,7 @@ class UCustomButton;
* *
*/ */
UCLASS() UCLASS()
class VAMPIRES_API UMainMenuWidget : public UUserWidget class VAMPIRES_API UMainMenuWidget : public UVampireInteractiveWidget
{ {
GENERATED_BODY() GENERATED_BODY()
@ -39,13 +39,32 @@ public:
protected: protected:
virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
public:
UFUNCTION(BlueprintCallable)
UCustomButton* GetNewGameButton();
UFUNCTION(BlueprintCallable)
UCustomButton* GetOptionsButton();
UFUNCTION(BlueprintCallable)
UCustomButton* GetQuitButton();
private: private:
UFUNCTION() UFUNCTION()
void NewGameButtonOnClicked(); void NewGameButtonOnClicked();
UFUNCTION()
void NewGameButtonFocused(FFocusEvent InFocusEvent);
UFUNCTION() UFUNCTION()
void OptionsButtonOnClicked(); void OptionsButtonOnClicked();
UFUNCTION()
void OptionsButtonFocused(FFocusEvent InFocusEvent);
UFUNCTION() UFUNCTION()
void QuitButtonOnClicked(); void QuitButtonOnClicked();
UFUNCTION()
void QuitButtonFocused(FFocusEvent InFocusEvent);
}; };

View File

@ -28,6 +28,11 @@ void UVampireInteractiveWidget::SetReturnScreen(UUserWidget* UserWidget)
} }
} }
void UVampireInteractiveWidget::SetCurrentFocus(UUserWidget* UserWidget)
{
CurrentFocus = UserWidget;
}
void UVampireInteractiveWidget::PlayHoveredSound() void UVampireInteractiveWidget::PlayHoveredSound()
{ {
if (ButtonHoveredSound) if (ButtonHoveredSound)

View File

@ -6,6 +6,7 @@
#include "Blueprint/UserWidget.h" #include "Blueprint/UserWidget.h"
#include "VampireInteractiveWidget.generated.h" #include "VampireInteractiveWidget.generated.h"
class UCustomButton;
class UButton; class UButton;
class UTextBlock; class UTextBlock;
/** /**
@ -16,6 +17,8 @@ class VAMPIRES_API UVampireInteractiveWidget : public UUserWidget
{ {
GENERATED_BODY() GENERATED_BODY()
// TODO: Remove a lot of this stuff that has now been replaced by UCustomButton
protected: protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings | Sound") UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings | Sound")
TObjectPtr<USoundBase> ButtonHoveredSound; TObjectPtr<USoundBase> ButtonHoveredSound;
@ -35,7 +38,8 @@ protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings") UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings")
TArray<TObjectPtr<UButton>> InteractableButtons; TArray<TObjectPtr<UButton>> InteractableButtons;
protected: TObjectPtr<UUserWidget> CurrentFocus;
UPROPERTY() UPROPERTY()
TObjectPtr<UUserWidget> PreviousScreen; TObjectPtr<UUserWidget> PreviousScreen;
@ -49,6 +53,9 @@ public:
UFUNCTION() UFUNCTION()
void SetReturnScreen(UUserWidget* UserWidget); void SetReturnScreen(UUserWidget* UserWidget);
UFUNCTION()
void SetCurrentFocus(UUserWidget* UserWidget);
protected: protected:
UFUNCTION() UFUNCTION()
void PlayHoveredSound(); void PlayHoveredSound();