Explorar o código

Menus, Nav: Fixed not being able to close a menu with Left arrow when parent is not a popup. (#5730)

ocornut %!s(int64=2) %!d(string=hai) anos
pai
achega
0749453355
Modificáronse 2 ficheiros con 9 adicións e 10 borrados
  1. 3 2
      docs/CHANGELOG.txt
  2. 6 8
      imgui_widgets.cpp

+ 3 - 2
docs/CHANGELOG.txt

@@ -135,8 +135,9 @@ Other Changes:
   towards a sub-menu. (#2517, #5614). [@rokups]
 - Menus: Fixed gaps in closing logic which would make child-menu erroneously close when crossing
   the gap between a menu item inside a window and a child-menu in a secondary viewport. (#5614)
-- Menus, Nav: Fixed keyboard/gamepad navigation occasionally erroneously landing on menu-item in
-  parent when the parent is not a popup. (#5730)
+- Menus, Nav: Fixed keyboard/gamepad navigation occasionally erroneously landing on menu-item
+  in parent window when the parent is not a popup. (#5730)
+- Menus, Nav: Fixed not being able to close a menu with Left arrow when parent is not a popup. (#5730)
 - Menus, Nav: Fixed using left/right navigation when appending to an existing menu (multiple
   BeginMenu() call with same names). (#1207)
 - Nav: Fixed moving/resizing window with gamepad or keyboard when running at very high framerate.

+ 6 - 8
imgui_widgets.cpp

@@ -7177,21 +7177,19 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
 
 void ImGui::EndMenu()
 {
-    // Nav: When a left move request _within our child menu_ failed, close ourselves (the _parent_ menu).
-    // A menu doesn't close itself because EndMenuBar() wants to catch the last Left<>Right inputs.
-    // However, it means that with the current code, a BeginMenu() from outside another menu or a menu-bar won't be closable with the Left direction.
-    // FIXME: This doesn't work if the parent BeginMenu() is not on a menu.
+    // Nav: When a left move request our menu failed, close ourselves.
     ImGuiContext& g = *GImGui;
     ImGuiWindow* window = g.CurrentWindow;
     IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup);  // Mismatched BeginMenu()/EndMenu() calls
-
+    ImGuiWindow* parent_window = window->ParentWindow;  // Should always be != NULL is we passed assert.
     if (window->BeginCount == window->BeginCountPreviousFrame)
-        if (g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet() && window->DC.LayoutType == ImGuiLayoutType_Vertical)
-            if (g.NavWindow && (g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow == window)
+        if (g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet())
+            if (g.NavWindow && (g.NavWindow->RootWindowForNav == window) && parent_window->DC.LayoutType == ImGuiLayoutType_Vertical)
             {
-                ClosePopupToLevel(g.BeginPopupStack.Size, true);
+                ClosePopupToLevel(g.BeginPopupStack.Size - 1, true);
                 NavMoveRequestCancel();
             }
+
     EndPopup();
 }