mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Menus: Adjusted BeginMenu() closing logic so hovering void or non-MenuItem() in parent window always lead to menu closure.
This commit is contained in:
		| @@ -61,6 +61,9 @@ Other Changes: | ||||
|   instance of a same table ID, when instances have a different height. (#3955). | ||||
| - Inputs: Fixed IsMouseClicked() repeat mode rate being half of keyboard repeat rate. | ||||
| - ColorEdit: Fixed text baseline alignment after a SameLine() after a ColorEdit() with visible label. | ||||
| - Menus: Adjusted BeginMenu() closing logic so hovering void or non-MenuItem() in parent window | ||||
|   always lead to menu closure. Fixes using items that are not MenuItem() or BeginItem() at the root | ||||
|   level of a popup with a child menu opened. | ||||
| - Stack Tool: Added option to copy item path to clipboard. (#4631) | ||||
| - Drawlist: Fixed PathArcTo() emitting terminating vertices too close to arc vertices. (#4993) [@thedmd] | ||||
| - DrawList: Fixed texture-based anti-aliasing path with RGBA textures (#5132, #3245) [@cfillion] | ||||
|   | ||||
							
								
								
									
										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.88 WIP" | ||||
| #define IMGUI_VERSION_NUM           18712 | ||||
| #define IMGUI_VERSION_NUM           18713 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||
| #define IMGUI_HAS_TABLE | ||||
|  | ||||
|   | ||||
| @@ -6935,7 +6935,7 @@ 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_other_child_menu = false; | ||||
|         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; | ||||
|         if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar)) | ||||
|         { | ||||
| @@ -6946,18 +6946,22 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) | ||||
|             ImVec2 tc = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR(); | ||||
|             float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f);   // add a bit of extra slack. | ||||
|             ta.x += (window->Pos.x < child_menu_window->Pos.x) ? -0.5f : +0.5f;                     // to avoid numerical issues (FIXME: ??) | ||||
|             tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f);                           // triangle is maximum 200 high to limit the slope and the bias toward large sub-menus // FIXME: Multiply by fb_scale? | ||||
|             tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f);                           // triangle has maximum height to limit the slope and the bias toward large sub-menus | ||||
|             tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); | ||||
|             moving_toward_other_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); | ||||
|             moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); | ||||
|             //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_other_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] | ||||
|         } | ||||
|         if (menu_is_open && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_toward_other_child_menu) | ||||
|  | ||||
|         // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) | ||||
|         // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. | ||||
|         // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) | ||||
|         if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu) | ||||
|             want_close = true; | ||||
|  | ||||
|         // Open | ||||
|         if (!menu_is_open && pressed) // Click/activate to open | ||||
|             want_open = true; | ||||
|         else if (!menu_is_open && hovered && !moving_toward_other_child_menu) // Hover to open | ||||
|         else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open | ||||
|             want_open = true; | ||||
|         if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open | ||||
|         { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut