mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +01:00 
			
		
		
		
	Popups: Fixed an issue when reopening a same popup multiple times would offset them by 1 pixel on the right. (#4936)
Passing explicit ImGuiPopupFlags_MouseButtonRight to OpenPopupOnItemClick() calls somehow document the unusual (due to legacy) default value.
This commit is contained in:
		| @@ -110,6 +110,7 @@ Other Changes: | |||||||
| - Fixed a situation where CTRL+Tab or Modal can occasionally lead to the creation of ImDrawCmd with zero triangles, | - Fixed a situation where CTRL+Tab or Modal can occasionally lead to the creation of ImDrawCmd with zero triangles, | ||||||
|   which would makes the draw operation of some backends assert (e.g. Metal with debugging). (#4857) |   which would makes the draw operation of some backends assert (e.g. Metal with debugging). (#4857) | ||||||
| - Popups: Fixed a regression crash when a new window is created after a modal on the same frame. (#4920) [@rokups] | - Popups: Fixed a regression crash when a new window is created after a modal on the same frame. (#4920) [@rokups] | ||||||
|  | - Popups: Fixed an issue when reopening a same popup multiple times would offset them by 1 pixel on the right. (#4936) | ||||||
| - Tables, ImDrawListSplitter: Fixed erroneously stripping trailing ImDrawList::AddCallback() when submitted in | - Tables, ImDrawListSplitter: Fixed erroneously stripping trailing ImDrawList::AddCallback() when submitted in | ||||||
|   last column or last channel and when there are no other drawing operation. (#4843, #4844) [@hoffstadt] |   last column or last channel and when there are no other drawing operation. (#4843, #4844) [@hoffstadt] | ||||||
| - Tables: Fixed positioning of Sort icon on right-most column with some settings (not resizable + no borders). (#4918). | - Tables: Fixed positioning of Sort icon on right-most column with some settings (not resizable + no borders). (#4918). | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -6235,8 +6235,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | |||||||
|             SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) |             SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) | ||||||
|         else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) |         else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) | ||||||
|             window->Pos = FindBestWindowPosForPopup(window); |             window->Pos = FindBestWindowPosForPopup(window); | ||||||
|         else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) |  | ||||||
|             window->Pos = FindBestWindowPosForPopup(window); |  | ||||||
|         else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) |         else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) | ||||||
|             window->Pos = FindBestWindowPosForPopup(window); |             window->Pos = FindBestWindowPosForPopup(window); | ||||||
|  |  | ||||||
| @@ -9261,7 +9259,7 @@ void ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiPopupFlags popup_flags | |||||||
| // - You may want to handle the whole on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). | // - You may want to handle the whole on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). | ||||||
| //   This is essentially the same as: | //   This is essentially the same as: | ||||||
| //       id = str_id ? GetID(str_id) : GetItemID(); | //       id = str_id ? GetID(str_id) : GetItemID(); | ||||||
| //       OpenPopupOnItemClick(str_id); | //       OpenPopupOnItemClick(str_id, ImGuiPopupFlags_MouseButtonRight); | ||||||
| //       return BeginPopup(id); | //       return BeginPopup(id); | ||||||
| //   Which is essentially the same as: | //   Which is essentially the same as: | ||||||
| //       id = str_id ? GetID(str_id) : GetItemID(); | //       id = str_id ? GetID(str_id) : GetItemID(); | ||||||
| @@ -9420,11 +9418,6 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) | |||||||
|             r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); |             r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); | ||||||
|         return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); |         return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); | ||||||
|     } |     } | ||||||
|     if (window->Flags & ImGuiWindowFlags_Popup) |  | ||||||
|     { |  | ||||||
|         ImRect r_avoid = ImRect(window->Pos.x - 1, window->Pos.y - 1, window->Pos.x + 1, window->Pos.y + 1); |  | ||||||
|         return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); |  | ||||||
|     } |  | ||||||
|     if (window->Flags & ImGuiWindowFlags_Tooltip) |     if (window->Flags & ImGuiWindowFlags_Tooltip) | ||||||
|     { |     { | ||||||
|         // Position tooltip (always follows mouse) |         // Position tooltip (always follows mouse) | ||||||
| @@ -9932,9 +9925,10 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() | |||||||
|     if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) |     if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) | ||||||
|     { |     { | ||||||
|         // Mouse (we need a fallback in case the mouse becomes invalid after being used) |         // Mouse (we need a fallback in case the mouse becomes invalid after being used) | ||||||
|         if (IsMousePosValid(&g.IO.MousePos)) |         // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. | ||||||
|             return g.IO.MousePos; |         // In theory we could move that +1.0f offset in OpenPopupEx() | ||||||
|         return g.MouseLastValidPos; |         ImVec2 p = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : g.MouseLastValidPos; | ||||||
|  |         return ImVec2(p.x + 1.0f, p.y); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -681,6 +681,7 @@ namespace ImGui | |||||||
|     //  - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). |     //  - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). | ||||||
|     //  - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). |     //  - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). | ||||||
|     //  - Use IsWindowAppearing() after BeginPopup() to tell if a window just opened. |     //  - Use IsWindowAppearing() after BeginPopup() to tell if a window just opened. | ||||||
|  |     //  - IMPORTANT: Notice that for OpenPopupOnItemClick() we exceptionally default flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter | ||||||
|     IMGUI_API void          OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0);                     // call to mark popup as open (don't call every frame!). |     IMGUI_API void          OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0);                     // call to mark popup as open (don't call every frame!). | ||||||
|     IMGUI_API void          OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags = 0);                             // id overload to facilitate calling from nested stacks |     IMGUI_API void          OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags = 0);                             // id overload to facilitate calling from nested stacks | ||||||
|     IMGUI_API void          OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);   // helper to open popup when clicked on last item. Default to ImGuiPopupFlags_MouseButtonRight == 1. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) |     IMGUI_API void          OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);   // helper to open popup when clicked on last item. Default to ImGuiPopupFlags_MouseButtonRight == 1. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) | ||||||
| @@ -690,7 +691,7 @@ namespace ImGui | |||||||
|     //  - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. |     //  - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. | ||||||
|     //  - They are convenient to easily create context menus, hence the name. |     //  - They are convenient to easily create context menus, hence the name. | ||||||
|     //  - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. |     //  - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. | ||||||
|     //  - IMPORTANT: we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. |     //  - IMPORTANT: Notice that we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. | ||||||
|     IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked on last item. Use str_id==NULL to associate the popup to previous item. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! |     IMGUI_API bool          BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked on last item. Use str_id==NULL to associate the popup to previous item. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! | ||||||
|     IMGUI_API bool          BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. |     IMGUI_API bool          BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. | ||||||
|     IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked in void (where there are no windows). |     IMGUI_API bool          BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);  // open+begin popup when clicked in void (where there are no windows). | ||||||
|   | |||||||
| @@ -7570,8 +7570,8 @@ static void ShowExampleAppCustomRendering(bool* p_open) | |||||||
|  |  | ||||||
|             // Context menu (under default mouse threshold) |             // Context menu (under default mouse threshold) | ||||||
|             ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); |             ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); | ||||||
|             if (opt_enable_context_menu && ImGui::IsMouseReleased(ImGuiMouseButton_Right) && drag_delta.x == 0.0f && drag_delta.y == 0.0f) |             if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f) | ||||||
|                 ImGui::OpenPopupOnItemClick("context"); |                 ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|             if (ImGui::BeginPopup("context")) |             if (ImGui::BeginPopup("context")) | ||||||
|             { |             { | ||||||
|                 if (adding_line) |                 if (adding_line) | ||||||
|   | |||||||
| @@ -4924,7 +4924,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | |||||||
|                 value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); |                 value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); | ||||||
|             } |             } | ||||||
|             if (!(flags & ImGuiColorEditFlags_NoOptions)) |             if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||||
|                 OpenPopupOnItemClick("context"); |                 OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) |     else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) | ||||||
| @@ -4952,7 +4952,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | |||||||
|             IM_UNUSED(r); // Fixes C6031: Return value ignored: 'sscanf'. |             IM_UNUSED(r); // Fixes C6031: Return value ignored: 'sscanf'. | ||||||
|         } |         } | ||||||
|         if (!(flags & ImGuiColorEditFlags_NoOptions)) |         if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||||
|             OpenPopupOnItemClick("context"); |             OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ImGuiWindow* picker_active_window = NULL; |     ImGuiWindow* picker_active_window = NULL; | ||||||
| @@ -4969,11 +4969,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | |||||||
|                 // Store current color and open a picker |                 // Store current color and open a picker | ||||||
|                 g.ColorPickerRef = col_v4; |                 g.ColorPickerRef = col_v4; | ||||||
|                 OpenPopup("picker"); |                 OpenPopup("picker"); | ||||||
|                 SetNextWindowPos(g.LastItemData.Rect.GetBL() + ImVec2(-1, style.ItemSpacing.y)); |                 SetNextWindowPos(g.LastItemData.Rect.GetBL() + ImVec2(0.0f, style.ItemSpacing.y)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (!(flags & ImGuiColorEditFlags_NoOptions)) |         if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||||
|             OpenPopupOnItemClick("context"); |             OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|  |  | ||||||
|         if (BeginPopup("picker")) |         if (BeginPopup("picker")) | ||||||
|         { |         { | ||||||
| @@ -5187,7 +5187,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if (!(flags & ImGuiColorEditFlags_NoOptions)) |         if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||||
|             OpenPopupOnItemClick("context"); |             OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|     } |     } | ||||||
|     else if (flags & ImGuiColorEditFlags_PickerHueBar) |     else if (flags & ImGuiColorEditFlags_PickerHueBar) | ||||||
|     { |     { | ||||||
| @@ -5204,7 +5204,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | |||||||
|             value_changed = value_changed_sv = true; |             value_changed = value_changed_sv = true; | ||||||
|         } |         } | ||||||
|         if (!(flags & ImGuiColorEditFlags_NoOptions)) |         if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||||
|             OpenPopupOnItemClick("context"); |             OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); | ||||||
|  |  | ||||||
|         // Hue bar logic |         // Hue bar logic | ||||||
|         SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); |         SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user