diff --git a/Source/StevesUEHelpers/Private/StevesUI/FocusableButton.cpp b/Source/StevesUEHelpers/Private/StevesUI/FocusableButton.cpp index a5378cd..8bd3945 100644 --- a/Source/StevesUEHelpers/Private/StevesUI/FocusableButton.cpp +++ b/Source/StevesUEHelpers/Private/StevesUI/FocusableButton.cpp @@ -109,5 +109,28 @@ void UFocusableButton::SlateHandleHovered() void UFocusableButton::SlateHandleUnhovered() { - OnUnhovered.Broadcast(); + if (bLoseFocusOnUnhover) + { + Unfocus(); + } + OnUnhovered.Broadcast(); +} + +void UFocusableButton::Unfocus() const +{ + APlayerController* OwningPlayer = GetOwningPlayer(); + if (OwningPlayer == nullptr || !OwningPlayer->IsLocalController() || OwningPlayer->Player == + nullptr) + { + return; + } + if (ULocalPlayer* LocalPlayer = OwningPlayer->GetLocalPlayer()) + { + TOptional UserIndex = FSlateApplication::Get().GetUserIndexForController( + LocalPlayer->GetControllerId()); + if (UserIndex.IsSet()) + { + FSlateApplication::Get().ClearUserFocus(UserIndex.GetValue()); + } + } } diff --git a/Source/StevesUEHelpers/Private/StevesUI/FocusableCheckBox.cpp b/Source/StevesUEHelpers/Private/StevesUI/FocusableCheckBox.cpp index c3e5f05..1b98fff 100644 --- a/Source/StevesUEHelpers/Private/StevesUI/FocusableCheckBox.cpp +++ b/Source/StevesUEHelpers/Private/StevesUI/FocusableCheckBox.cpp @@ -95,5 +95,28 @@ void UFocusableCheckBox::SlateHandleHovered() void UFocusableCheckBox::SlateHandleUnhovered() { - OnUnhovered.Broadcast(); + if (bLoseFocusOnUnhover) + { + Unfocus(); + } + OnUnhovered.Broadcast(); +} + +void UFocusableCheckBox::Unfocus() const +{ + APlayerController* OwningPlayer = GetOwningPlayer(); + if (OwningPlayer == nullptr || !OwningPlayer->IsLocalController() || OwningPlayer->Player == + nullptr) + { + return; + } + if (ULocalPlayer* LocalPlayer = OwningPlayer->GetLocalPlayer()) + { + TOptional UserIndex = FSlateApplication::Get().GetUserIndexForController( + LocalPlayer->GetControllerId()); + if (UserIndex.IsSet()) + { + FSlateApplication::Get().ClearUserFocus(UserIndex.GetValue()); + } + } } diff --git a/Source/StevesUEHelpers/Public/StevesUI/FocusableButton.h b/Source/StevesUEHelpers/Public/StevesUI/FocusableButton.h index a6f610f..7d0c847 100644 --- a/Source/StevesUEHelpers/Public/StevesUI/FocusableButton.h +++ b/Source/StevesUEHelpers/Public/StevesUI/FocusableButton.h @@ -38,6 +38,9 @@ public: UPROPERTY(BlueprintReadWrite, EditAnywhere) bool bTakeFocusOnHover = true; + UPROPERTY(BlueprintReadWrite, EditAnywhere) + bool bLoseFocusOnUnhover = true; + // Simulate a button press UFUNCTION(BlueprintCallable) void SimulatePress(); @@ -56,6 +59,8 @@ protected: void SlateHandleHovered(); void SlateHandleUnhovered(); + void Unfocus() const; + virtual TSharedRef RebuildWidget() override; diff --git a/Source/StevesUEHelpers/Public/StevesUI/FocusableCheckBox.h b/Source/StevesUEHelpers/Public/StevesUI/FocusableCheckBox.h index db595c1..f647eb6 100644 --- a/Source/StevesUEHelpers/Public/StevesUI/FocusableCheckBox.h +++ b/Source/StevesUEHelpers/Public/StevesUI/FocusableCheckBox.h @@ -43,6 +43,10 @@ public: UPROPERTY(BlueprintReadWrite, EditAnywhere) bool bTakeFocusOnHover = true; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + bool bLoseFocusOnUnhover = true; + protected: FCheckBoxStyle FocussedStyle; @@ -54,6 +58,8 @@ protected: void SlateHandleHovered(); void SlateHandleUnhovered(); + void Unfocus() const; + virtual TSharedRef RebuildWidget() override; public: