From 706438a43c368c4a7d822b5ff997fa2befdbd5e6 Mon Sep 17 00:00:00 2001 From: ocornut Date: Thu, 17 Oct 2024 11:37:16 +0200 Subject: [PATCH] Disabled: clicking a disabled item focuses parent window. Fix/amend 83ecc84. (#8064) 83ecc84 was too not supporting widgets using ItemHoverable() directly + too complex. Revert 83ecc84 in ButtonBehavior(), reimplement in UpdateMouseMovingWindowEndFrame()> --- imgui.cpp | 10 ++++++---- imgui_widgets.cpp | 16 ++-------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 3ce5e90db..75e0ad40f 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -4875,12 +4875,13 @@ void ImGui::UpdateMouseMovingWindowNewFrame() } } -// Initiate moving window when clicking on empty space or title bar. +// Initiate focusing and moving window when clicking on empty space or title bar. +// Initiate focusing window when clicking on a disabled item. // Handle left-click and right-click focus. void ImGui::UpdateMouseMovingWindowEndFrame() { ImGuiContext& g = *GImGui; - if (g.ActiveId != 0 || g.HoveredId != 0) + if (g.ActiveId != 0 || (g.HoveredId != 0 && !g.HoveredIdIsDisabled)) return; // Unless we just made a window/popup appear @@ -4906,7 +4907,8 @@ void ImGui::UpdateMouseMovingWindowEndFrame() if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) g.MovingWindow = NULL; - // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already) + // Cancel moving if clicked over an item which was disabled or inhibited by popups + // (when g.HoveredIdIsDisabled == true && g.HoveredId == 0 we are inhibited by popups, when g.HoveredIdIsDisabled == true && g.HoveredId != 0 we are over a disabled item)0 already) if (g.HoveredIdIsDisabled) g.MovingWindow = NULL; } @@ -4920,7 +4922,7 @@ void ImGui::UpdateMouseMovingWindowEndFrame() // With right mouse button we close popups without changing focus based on where the mouse is aimed // Instead, focus will be restored to the window under the bottom-most closed popup. // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger) - if (g.IO.MouseClicked[1]) + if (g.IO.MouseClicked[1] && g.HoveredId == 0) { // Find the top-most window between HoveredWindow and the top-most Modal Window. // This is where we can trim the popup stack. diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 247fce39c..e240bdd90 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -542,8 +542,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // Mouse handling const ImGuiID test_owner_id = (flags & ImGuiButtonFlags_NoTestKeyOwner) ? ImGuiKeyOwner_Any : id; - const bool hovered_disabled = (g.HoveredId == id && g.HoveredIdIsDisabled); - if (hovered || hovered_disabled) + if (hovered) { IM_ASSERT(id != 0); // Lazily check inside rare path. @@ -561,7 +560,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // Process initial action const bool mods_ok = !(flags & ImGuiButtonFlags_NoKeyModsAllowed) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt); - if (mods_ok && !hovered_disabled) + if (mods_ok) { if (mouse_button_clicked != -1 && g.ActiveId != id) { @@ -619,17 +618,6 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, ImGuiInputFlags_Repeat, test_owner_id)) pressed = true; } - else if (mods_ok && hovered_disabled) - { - if (mouse_button_clicked != -1 && g.ActiveId != id) - { - // Disabled path still focus - // FIXME-NAV: Could somehow call SetNavID() with a null ID but mouse pos as NavRectRel so nav may be resumed? - // Will do it once we do it for regular click on window-void. - if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick)) - FocusWindow(window, ImGuiFocusRequestFlags_RestoreFocusedChild); - } - } if (pressed) g.NavDisableHighlight = true;