mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Menus: Fix sub-menu inhibition stopping working in some cases. (Amend WIP) (#2517, #5614, noticed in #5546)
Amend bda2cde6
Fixes the case where following menu hover sequence results in incorrect RestoreNavWindow (previously SourceWindow) pointing to opened sub-menu:
1. Hover "Menu -> Options" - Open ##Menu_01 window
2. Hover "Menu -> Colors"  - SourceWindow incorrectly points to ##Menu_01 window
			
			
This commit is contained in:
		| @@ -79,6 +79,9 @@ Other Changes: | ||||
| - Window: Fixed a potential crash when appending to a child window. (#5515, #3496, #4797) [@rokups] | ||||
| - IO: Added ImGuiKey_MouseXXX aliases for mouse buttons/wheel so all operations done on ImGuiKey | ||||
|   can apply to mouse data as well. (#4921) | ||||
| - Menus: Fixed incorrect sub-menu parent association when opening a menu by closing another. | ||||
|   Among other things, it would accidentally break part of the closing heuristic logic when moving | ||||
|   towards a sub-menu. (#2517, #5614). [@rokups] | ||||
| - Nav: Fixed moving/resizing window with gamepad or keyboard when running at very high framerate. | ||||
| - Nav: Pressing Space/GamepadFaceDown on a repeating button uses the same repeating rate as a mouse hold. | ||||
| - Platform IME: [Windows] Removed call to ImmAssociateContextEx() leading to freeze on some setups. | ||||
|   | ||||
							
								
								
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -9336,7 +9336,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) | ||||
|     ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. | ||||
|     popup_ref.PopupId = id; | ||||
|     popup_ref.Window = NULL; | ||||
|     popup_ref.SourceWindow = g.NavWindow; | ||||
|     popup_ref.BackupNavWindow = g.NavWindow;            // When popup closes focus may be restored to NavWindow (depend on window type). | ||||
|     popup_ref.OpenFrameCount = g.FrameCount; | ||||
|     popup_ref.OpenParentId = parent_window->IDStack.back(); | ||||
|     popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); | ||||
| @@ -9438,12 +9438,13 @@ void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_ | ||||
|     IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); | ||||
|  | ||||
|     // Trim open popup stack | ||||
|     ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow; | ||||
|     ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; | ||||
|     ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow; | ||||
|     g.OpenPopupStack.resize(remaining); | ||||
|  | ||||
|     if (restore_focus_to_window_under_popup) | ||||
|     { | ||||
|         ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window; | ||||
|         if (focus_window && !focus_window->WasActive && popup_window) | ||||
|         { | ||||
|             // Fallback | ||||
| @@ -12689,8 +12690,12 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|     { | ||||
|         for (int i = 0; i < g.OpenPopupStack.Size; i++) | ||||
|         { | ||||
|             ImGuiWindow* window = g.OpenPopupStack[i].Window; | ||||
|             BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); | ||||
|             // As it's difficult to interact with tree nodes while popups are open, we display everything inline. | ||||
|             const ImGuiPopupData* popup_data = &g.OpenPopupStack[i]; | ||||
|             ImGuiWindow* window = popup_data->Window; | ||||
|             BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'", | ||||
|                 popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", | ||||
|                 popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); | ||||
|         } | ||||
|         TreePop(); | ||||
|     } | ||||
|   | ||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -65,7 +65,7 @@ Index of this file: | ||||
| // Version | ||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||
| #define IMGUI_VERSION               "1.89 WIP" | ||||
| #define IMGUI_VERSION_NUM           18812 | ||||
| #define IMGUI_VERSION_NUM           18813 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||
| #define IMGUI_HAS_TABLE | ||||
|  | ||||
|   | ||||
| @@ -1048,7 +1048,7 @@ struct ImGuiPopupData | ||||
| { | ||||
|     ImGuiID             PopupId;        // Set on OpenPopup() | ||||
|     ImGuiWindow*        Window;         // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() | ||||
|     ImGuiWindow*        SourceWindow;   // Set on OpenPopup() copy of NavWindow at the time of opening the popup | ||||
|     ImGuiWindow*        BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close | ||||
|     int                 ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value | ||||
|     int                 OpenFrameCount; // Set on OpenPopup() | ||||
|     ImGuiID             OpenParentId;   // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) | ||||
|   | ||||
| @@ -7107,7 +7107,8 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) | ||||
|         // Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu | ||||
|         // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive. | ||||
|         bool moving_toward_child_menu = false; | ||||
|         ImGuiWindow* child_menu_window = (g.BeginPopupStack.Size < g.OpenPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].SourceWindow == window) ? g.OpenPopupStack[g.BeginPopupStack.Size].Window : NULL; | ||||
|         ImGuiPopupData* child_popup = (g.BeginPopupStack.Size < g.OpenPopupStack.Size) ? &g.OpenPopupStack[g.BeginPopupStack.Size] : NULL; // Popup candidate (testing below) | ||||
|         ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL; | ||||
|         if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar)) | ||||
|         { | ||||
|             float ref_unit = g.FontSize; // FIXME-DPI | ||||
|   | ||||
		Reference in New Issue
	
	Block a user