From 185744e6974f3d9aa7f60832763444d153dddd46 Mon Sep 17 00:00:00 2001 From: ocornut Date: Sat, 21 Feb 2015 12:49:51 +0000 Subject: [PATCH] Having a InputText() active doesn't steal mouse inputs (relate to #134) --- imgui.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 3c6ade3e..2f46ee45 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -992,6 +992,7 @@ struct ImGuiState ImGuiID ActiveId; ImGuiID ActiveIdPreviousFrame; bool ActiveIdIsAlive; + bool ActiveIdIsFocusedOnly; // Set only by active widget. Denote focus but no active interaction. float SettingsDirtyTimer; ImVector Settings; ImVector ColorModifiers; @@ -1046,6 +1047,7 @@ struct ImGuiState ActiveId = 0; ActiveIdPreviousFrame = 0; ActiveIdIsAlive = false; + ActiveIdIsFocusedOnly = false; SettingsDirtyTimer = 0.0f; SetNextWindowPosVal = ImVec2(0.0f, 0.0f); SetNextWindowPosCond = 0; @@ -1149,6 +1151,7 @@ static void SetActiveId(ImGuiID id) { ImGuiState& g = *GImGui; g.ActiveId = id; + g.ActiveIdIsFocusedOnly = false; } static void RegisterAliveId(const ImGuiID& id) @@ -3791,8 +3794,11 @@ static bool IsHovered(const ImGuiAabb& bb, const ImGuiID& id) if (g.HoveredId == 0) { ImGuiWindow* window = GetCurrentWindow(); - const bool hovered = (g.HoveredRootWindow == window->RootWindow) && (g.ActiveId == 0 || g.ActiveId == id) && IsMouseHoveringBox(bb); - return hovered; + if (g.HoveredRootWindow == window->RootWindow) + { + bool hovered = (g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && IsMouseHoveringBox(bb); + return hovered; + } } return false; } @@ -4516,20 +4522,14 @@ bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, c if (g.SliderAsInputTextId == 0) { // First frame - IM_ASSERT(g.ActiveId == id); // InputText ID should match the Slider ID (else we'd need to store them both which is also possible) + IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID (else we'd need to store them both, which is also possible) g.SliderAsInputTextId = g.ActiveId; - SetActiveId(id); g.HoveredId = id; } - else + else if (g.ActiveId != g.SliderAsInputTextId) { - if (g.ActiveId == g.SliderAsInputTextId) - SetActiveId(id); - else - { - SetActiveId(0); - g.SliderAsInputTextId = 0; - } + // Release + g.SliderAsInputTextId = 0; } if (value_changed) { @@ -5379,6 +5379,11 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT } } + // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget. + // Down the line we should have a cleaner concept of focused vs active in the library. + if (g.ActiveId == id) + g.ActiveIdIsFocusedOnly = !io.MouseDown[0]; + bool value_changed = false; bool cancel_edit = false; bool enter_pressed = false;