#include "LuprexUserWidget.h" #include "EnhancedInputComponent.h" #include "InputAction.h" UlxUserWidget::UlxUserWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { } void UlxUserWidget::NativeOnInitialized() { Super::NativeOnInitialized(); BackupInputComponent(); } void UlxUserWidget::BackupInputComponent() { SavedEnhancedActionEventBindings.Reset(); UEnhancedInputComponent* EIC = Cast(InputComponent); if (!EIC) return; const TArray& Live = EIC->GetActionEventBindings(); SavedEnhancedActionEventBindings.Reserve(Live.Num()); for (const EventBinding& Binding : Live) { SavedEnhancedActionEventBindings.Add(Binding->Clone()); } } void UlxUserWidget::DisableEventBinding(const UInputAction* InputAction) { UEnhancedInputComponent* EIC = Cast(InputComponent); if (!EIC) return; TArray& Bindings = GetMutableActionEventBindings(EIC); Bindings.RemoveAll([InputAction](const EventBinding& B) { return B->GetAction() == InputAction; }); } void UlxUserWidget::RestoreInputBinding(const UInputAction* InputAction) { DisableEventBinding(InputAction); UEnhancedInputComponent* EIC = Cast(InputComponent); if (!EIC) return; TArray& Live = GetMutableActionEventBindings(EIC); for (const EventBinding& Saved : SavedEnhancedActionEventBindings) { if (Saved->GetAction() == InputAction) { Live.Add(Saved->Clone()); } } } void UlxUserWidget::RedirectInputAction(const UInputAction* From, const UInputAction* To) { DisableEventBinding(From); UEnhancedInputComponent* EIC = Cast(InputComponent); if (!EIC) return; for (const EventBinding& Saved : SavedEnhancedActionEventBindings) { if (Saved->GetAction() == To) { TSharedPtr Clone(Saved->Clone().Release()); EIC->BindActionInstanceLambda(From, Saved->GetTriggerEvent(), [Clone](const FInputActionInstance& Data) { Clone->Execute(Data); }); } } } TArray& UlxUserWidget::GetMutableActionEventBindings(UEnhancedInputComponent* EIC) { return const_cast&>(EIC->GetActionEventBindings()); }