Lots of work on input processing
This commit is contained in:
@@ -94,8 +94,7 @@ void FlxInputModeRequests::GarbageCollect()
|
||||
int32 N = Requests.Num();
|
||||
Requests.RemoveAll([](const FlxInputModeRequest &Entry)
|
||||
{
|
||||
UUserWidget *W = Entry.Widget;
|
||||
return W == nullptr || !IsValid(W) || W->GetParent() == nullptr;
|
||||
return !IsValid(Entry.Widget);
|
||||
});
|
||||
if (Requests.Num() < N) Dirty = true;
|
||||
}
|
||||
|
||||
@@ -197,7 +197,9 @@ void AlxPlayerControllerBase::BuildInputStack(TArray<UInputComponent*>& InputSta
|
||||
const TArray<FlxInputModeRequest> &Requests = InputModeRequests.GetRequests();
|
||||
for (int32 Idx = Requests.Num() - 1; Idx >= 0; --Idx)
|
||||
{
|
||||
if (UInputComponent *IC = GetWidgetInputComponent(Requests[Idx].Widget))
|
||||
UUserWidget *Widget = Requests[Idx].Widget;
|
||||
if (!Widget->IsInViewport()) continue;
|
||||
if (UInputComponent *IC = GetWidgetInputComponent(Widget))
|
||||
{
|
||||
IC->bBlockInput = Requests[Idx].BlockInput;
|
||||
InputStack.Push(IC);
|
||||
@@ -219,16 +221,19 @@ void AlxPlayerControllerBase::UpdateInputMode()
|
||||
TSharedRef<SViewport> ViewportWidgetRef = ViewportWidget.ToSharedRef();
|
||||
FReply &SlateOperations = LocalPlayer->GetSlateOperations();
|
||||
|
||||
// The first entry in InputModeRequests (highest priority) dictates the
|
||||
// The first active entry in InputModeRequests dictates the
|
||||
// pointer / capture / focus state. If there are no requests at all,
|
||||
// fall back to a static default-constructed request.
|
||||
static const FlxInputModeRequest EmptyRequest;
|
||||
const TArray<FlxInputModeRequest> &Requests = InputModeRequests.GetRequests();
|
||||
const FlxInputModeRequest &Top = Requests.IsEmpty() ? EmptyRequest : Requests[0];
|
||||
const FlxInputModeRequest *Top = &EmptyRequest;
|
||||
for (const FlxInputModeRequest &Req : InputModeRequests.GetRequests())
|
||||
{
|
||||
if (Req.Widget->IsInViewport()) { Top = &Req; break; }
|
||||
}
|
||||
|
||||
SetShowMouseCursor(Top.ShowPointer);
|
||||
SetShowMouseCursor(Top->ShowPointer);
|
||||
|
||||
if (Top.ShowPointer)
|
||||
if (Top->ShowPointer)
|
||||
{
|
||||
// Pointer-visible mode: full macroexpansion of SetInputModeGameAndUI
|
||||
// — the BP wrapper, APlayerController::SetInputMode, and
|
||||
@@ -254,7 +259,7 @@ void AlxPlayerControllerBase::UpdateInputMode()
|
||||
// UWidget holds its live SWidget in a cached TSharedPtr; we need a
|
||||
// TSharedRef for SetUserFocus. Fall back to the viewport if the
|
||||
// target has never been constructed (cached widget is null).
|
||||
TSharedPtr<SWidget> SlateFocus = Top.Focus ? Top.Focus->GetCachedWidget() : nullptr;
|
||||
TSharedPtr<SWidget> SlateFocus = Top->Focus ? Top->Focus->GetCachedWidget() : nullptr;
|
||||
if (SlateFocus.IsValid())
|
||||
{
|
||||
SlateOperations.SetUserFocus(SlateFocus.ToSharedRef());
|
||||
|
||||
Reference in New Issue
Block a user