From 2d50eadfdfa782b7b8f29b6a5c1ccb5f3475e511 Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Thu, 3 Feb 2022 15:38:52 +0000 Subject: [PATCH] Add a minimum time before "Close All" button is accepted on a menu This is to avoid insta-close on some controllers when the same button is mapped to open menu and close --- .../Private/StevesUI/MenuStack.cpp | 15 +++++++++++---- .../StevesUEHelpers/Public/StevesUI/MenuStack.h | 8 ++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Source/StevesUEHelpers/Private/StevesUI/MenuStack.cpp b/Source/StevesUEHelpers/Private/StevesUI/MenuStack.cpp index 3984bbc..0e50d55 100644 --- a/Source/StevesUEHelpers/Private/StevesUI/MenuStack.cpp +++ b/Source/StevesUEHelpers/Private/StevesUI/MenuStack.cpp @@ -6,7 +6,6 @@ #include "StevesUI/MenuBase.h" #include "Kismet/GameplayStatics.h" - void UMenuStack::NativeConstruct() { Super::NativeConstruct(); @@ -156,8 +155,15 @@ bool UMenuStack::HandleKeyDownEvent(const FKeyEvent& InKeyEvent) else if (InstantCloseKeys.Contains(Key)) { // Shortcut to exit all menus - CloseAll(true); - return true; + // Make sure we're open long enough + FDateTime CurrTime = FDateTime::Now(); + FTimespan Diff = CurrTime - TimeFirstOpen; + if (Diff.GetTicks() > (int64)(MinTimeOpen * ETimespan::TicksPerSecond)) + { + CloseAll(true); + return true; + } + } return false; @@ -236,7 +242,8 @@ void UMenuStack::PopMenuIfTop(UMenuBase* UiMenuBase, bool bWasCancel) void UMenuStack::FirstMenuOpened() { - // Nothing to do now but keep for future use + // Don't use world time (even real time) since map can change while open + TimeFirstOpen = FDateTime::Now(); } void UMenuStack::RemoveFromParent() diff --git a/Source/StevesUEHelpers/Public/StevesUI/MenuStack.h b/Source/StevesUEHelpers/Public/StevesUI/MenuStack.h index 7557429..a5b5bcf 100644 --- a/Source/StevesUEHelpers/Public/StevesUI/MenuStack.h +++ b/Source/StevesUEHelpers/Public/StevesUI/MenuStack.h @@ -52,6 +52,8 @@ protected: UFUNCTION() void InputModeChanged(int PlayerIndex, EInputMode NewMode); + FDateTime TimeFirstOpen; + public: /// Input keys which go back a level in the menu stack (default Esc and B gamepad button) /// Clear this list if you don't want this behaviour @@ -98,6 +100,10 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Behavior") EGamePauseChange GamePauseSettingOnClose = EGamePauseChange::DoNotChange; + /// Minimum amount of time a menu should be open before responding to instant close key (prevent fast close because of leaked input) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Behaviour") + float MinTimeOpen = 0.5f; + /// Push a new menu level by class. This will instantiate the new menu, display it, and inform the previous menu that it's /// been superceded. Use the returned instance if you want to cache it UFUNCTION(BlueprintCallable) @@ -131,4 +137,6 @@ public: UMenuStack(); + + };