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;
}

View File

@ -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<UTextBlock> GetTextBlock();
UFUNCTION(BlueprintCallable)
UButton* GetButton();
UFUNCTION(BlueprintCallable)
UTextBlock* GetTextBlock();
protected:
UFUNCTION()

View File

@ -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);
}

View File

@ -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);
};

View File

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

View File

@ -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<USoundBase> ButtonHoveredSound;
@ -35,7 +38,8 @@ protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Widget Settings")
TArray<TObjectPtr<UButton>> InteractableButtons;
protected:
TObjectPtr<UUserWidget> CurrentFocus;
UPROPERTY()
TObjectPtr<UUserWidget> PreviousScreen;
@ -49,6 +53,9 @@ public:
UFUNCTION()
void SetReturnScreen(UUserWidget* UserWidget);
UFUNCTION()
void SetCurrentFocus(UUserWidget* UserWidget);
protected:
UFUNCTION()
void PlayHoveredSound();