Fix issue with ImGui popup/modal windows not being able to be closed in transparent mouse input mode. The issue was caused by relying on ImGui::IsWindowHovered to determine whether an ImGui window was being hovered over, which doesn't work as expected with popups and modals. The ImGui documentation instead recommends using ImGuiIO::WantCaptureMouse to determine mouse input forwarding, so now SImGuiWidget relies on this value to update it's transparent mouse input state. (#25)

This commit is contained in:
yash3ahuja 2020-03-24 18:26:14 -07:00 committed by GitHub
parent a35585f26a
commit 73cdfe8d83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 2 deletions

View File

@ -158,6 +158,8 @@ void FImGuiContextProxy::BeginFrame(float DeltaTime)
ImGui::NewFrame(); ImGui::NewFrame();
bWantsMouseCapture = IO.WantCaptureMouse;
bIsFrameStarted = true; bIsFrameStarted = true;
bIsDrawEarlyDebugCalled = false; bIsDrawEarlyDebugCalled = false;
bIsDrawDebugCalled = false; bIsDrawDebugCalled = false;

View File

@ -53,6 +53,9 @@ public:
// Whether this context has mouse hovering any window (read once per frame during context update). // Whether this context has mouse hovering any window (read once per frame during context update).
bool IsMouseHoveringAnyWindow() const { return bIsMouseHoveringAnyWindow; } bool IsMouseHoveringAnyWindow() const { return bIsMouseHoveringAnyWindow; }
// Whether ImGui will use the mouse inputs.
bool WantsMouseCapture() const { return bWantsMouseCapture; }
// Cursor type desired by this context (updated once per frame during context update). // Cursor type desired by this context (updated once per frame during context update).
EMouseCursor::Type GetMouseCursor() const { return MouseCursor; } EMouseCursor::Type GetMouseCursor() const { return MouseCursor; }
@ -93,6 +96,8 @@ private:
bool bIsDrawEarlyDebugCalled = false; bool bIsDrawEarlyDebugCalled = false;
bool bIsDrawDebugCalled = false; bool bIsDrawDebugCalled = false;
bool bWantsMouseCapture = false;
FImGuiInputState InputState; FImGuiInputState InputState;
TArray<FImGuiDrawList> DrawLists; TArray<FImGuiDrawList> DrawLists;

View File

@ -390,13 +390,13 @@ void SImGuiWidget::ReturnFocus()
void SImGuiWidget::UpdateInputState() void SImGuiWidget::UpdateInputState()
{ {
auto& Properties = ModuleManager->GetProperties(); auto& Properties = ModuleManager->GetProperties();
auto* ContextPropxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex); auto* ContextProxy = ModuleManager->GetContextManager().GetContextProxy(ContextIndex);
const bool bEnableTransparentMouseInput = Properties.IsMouseInputShared() const bool bEnableTransparentMouseInput = Properties.IsMouseInputShared()
#if PLATFORM_ANDROID || PLATFORM_IOS #if PLATFORM_ANDROID || PLATFORM_IOS
&& (FSlateApplication::Get().GetCursorPos() != FVector2D::ZeroVector) && (FSlateApplication::Get().GetCursorPos() != FVector2D::ZeroVector)
#endif #endif
&& !(ContextPropxy->IsMouseHoveringAnyWindow() || ContextPropxy->HasActiveItem()); && !(ContextProxy->WantsMouseCapture() || ContextProxy->HasActiveItem());
if (bTransparentMouseInput != bEnableTransparentMouseInput) if (bTransparentMouseInput != bEnableTransparentMouseInput)
{ {
bTransparentMouseInput = bEnableTransparentMouseInput; bTransparentMouseInput = bEnableTransparentMouseInput;