From 2e841e3e3d3b63aaf40c8ed2b85a9de435fdf7fe Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Tue, 1 Feb 2022 16:58:53 +0000 Subject: [PATCH] Consistent 0.5s update frequency on input images regardless of number of events --- .../Private/StevesUI/InputImage.cpp | 16 +++++++++++++++- .../RichTextBlockInputImageDecorator.cpp | 2 +- .../StevesUEHelpers/Public/StevesUI/InputImage.h | 3 +++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/StevesUEHelpers/Private/StevesUI/InputImage.cpp b/Source/StevesUEHelpers/Private/StevesUI/InputImage.cpp index 630849f..68db7be 100644 --- a/Source/StevesUEHelpers/Private/StevesUI/InputImage.cpp +++ b/Source/StevesUEHelpers/Private/StevesUI/InputImage.cpp @@ -15,6 +15,7 @@ TSharedRef UInputImage::RebuildWidget() bSubbedToInputEvents = true; GS->OnInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged); GS->OnButtonInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged); + GS->OnAxisInputModeChanged.AddUniqueDynamic(this, &UInputImage::OnInputModeChanged); } UpdateImage(); @@ -25,11 +26,12 @@ void UInputImage::OnInputModeChanged(int ChangedPlayerIdx, EInputMode InputMode) { if (ChangedPlayerIdx == PlayerIndex) { + // Delay update, in case multiple received in short succession + MarkImageDirty(); // auto GS = GetStevesGameSubsystem(GetWorld()); // UE_LOG(LogTemp, Warning, TEXT("Updating image for input mode change: %s Button device: %s"), // *UEnum::GetValueAsString(InputMode), // *UEnum::GetValueAsString(GS->GetLastInputButtonPressed(ChangedPlayerIdx))); - UpdateImage(); } } @@ -48,6 +50,7 @@ void UInputImage::BeginDestroy() { GS->OnInputModeChanged.RemoveAll(this); GS->OnButtonInputModeChanged.RemoveAll(this); + GS->OnAxisInputModeChanged.RemoveAll(this); } } @@ -104,4 +107,15 @@ void UInputImage::UpdateImage() SetBrushFromAtlasInterface(Sprite, true); } } + DelayedUpdateImageTimer.Invalidate(); +} + +void UInputImage::MarkImageDirty() +{ + if (!DelayedUpdateImageTimer.IsValid()) + { + // Delayed update + GetWorld()->GetTimerManager().SetTimer(DelayedUpdateImageTimer, this, &UInputImage::UpdateImage, 0.5f); + } + } diff --git a/Source/StevesUEHelpers/Private/StevesUI/RichTextBlockInputImageDecorator.cpp b/Source/StevesUEHelpers/Private/StevesUI/RichTextBlockInputImageDecorator.cpp index 153a4ea..7e9623e 100644 --- a/Source/StevesUEHelpers/Private/StevesUI/RichTextBlockInputImageDecorator.cpp +++ b/Source/StevesUEHelpers/Private/StevesUI/RichTextBlockInputImageDecorator.cpp @@ -154,7 +154,7 @@ public: } } - TimeUntilNextSpriteCheck = 0.25f; + TimeUntilNextSpriteCheck = 0.5f; } } }; diff --git a/Source/StevesUEHelpers/Public/StevesUI/InputImage.h b/Source/StevesUEHelpers/Public/StevesUI/InputImage.h index a23b7df..ab77863 100644 --- a/Source/StevesUEHelpers/Public/StevesUI/InputImage.h +++ b/Source/StevesUEHelpers/Public/StevesUI/InputImage.h @@ -40,6 +40,8 @@ protected: UUiTheme* CustomTheme; bool bSubbedToInputEvents = false; + + FTimerHandle DelayedUpdateImageTimer; public: /// Tell this image to display the bound action for the current input method @@ -78,6 +80,7 @@ public: protected: virtual TSharedRef RebuildWidget() override; + virtual void MarkImageDirty(); virtual void UpdateImage(); UFUNCTION()