mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	BeginTooltip: Added 'bool' return value to BeginTooltip() for API consistency. Updated demo.
Add SetWindowHiddendAndSkipItemsForCurrentFrame().
This commit is contained in:
		| @@ -44,6 +44,10 @@ Breaking Changes: | ||||
|    OK:     #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui.h" / #include "imgui_internal.h" | ||||
|    Error:  #include "imgui.h" / #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui_internal.h" | ||||
|   Added a dedicated compile-time check message to help diagnose this. | ||||
| - Tooltips: Added 'bool' return value to BeginTooltip() for API consistency. | ||||
|   Please only submit contents and call EndTooltip() if BeginTooltip() returns true. | ||||
|   In reality the function will _currently_ always return true, but further changes down the | ||||
|   line may change this, best to clarify API sooner. Updated demo code accordingly. | ||||
|  | ||||
| Other changes: | ||||
|  | ||||
| @@ -66,6 +70,7 @@ Other changes: | ||||
| - Backends: SDL2, SDL3:  Accept SDL_GetPerformanceCounter() not returning a monotonically | ||||
|   increasing value. (#6189, #6114, #3644) [@adamkewley] | ||||
| - Examples: Android: Fixed example build for Gradle 8. (#6229, #6227) [@duddel] | ||||
| - Demo: Updated to test return value of BeginTooltip(). | ||||
|  | ||||
|  | ||||
| ----------------------------------------------------------------------- | ||||
|   | ||||
							
								
								
									
										42
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -387,6 +387,7 @@ CODE | ||||
|  When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. | ||||
|  You can read releases logs https://github.com/ocornut/imgui/releases for more details. | ||||
|  | ||||
|  - 2023/03/09 (1.89.4) - tooltips: Added 'bool' return value to BeginTooltip() for API consistency. Please only submit contents and call EndTooltip() if BeginTooltip() returns true. In reality the function will _currently_ always return true, but further changes down the line may change this, best to clarify API sooner. | ||||
|  - 2023/02/15 (1.89.4) - moved the optional "courtesy maths operators" implementation from imgui_internal.h in imgui.h. | ||||
|                          Even though we encourage using your own maths types and operators by setting up IM_VEC2_CLASS_EXTRA, | ||||
|                          it has been frequently requested by people to use our own. We had an opt-in define which was | ||||
| @@ -7281,6 +7282,12 @@ void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const I | ||||
|     window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); | ||||
| } | ||||
|  | ||||
| void ImGui::SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window) | ||||
| { | ||||
|     window->Hidden = window->SkipItems = true; | ||||
|     window->HiddenFramesCanSkipItems = 1; | ||||
| } | ||||
|  | ||||
| void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) | ||||
| { | ||||
|     SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); | ||||
| @@ -9875,12 +9882,12 @@ void ImGui::SetScrollHereY(float center_y_ratio) | ||||
| // [SECTION] TOOLTIPS | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| void ImGui::BeginTooltip() | ||||
| bool ImGui::BeginTooltip() | ||||
| { | ||||
|     BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); | ||||
|     return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); | ||||
| } | ||||
|  | ||||
| void ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) | ||||
| bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|  | ||||
| @@ -9904,12 +9911,17 @@ void ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags ext | ||||
|             if (window->Active) | ||||
|             { | ||||
|                 // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. | ||||
|                 window->Hidden = true; | ||||
|                 window->HiddenFramesCanSkipItems = 1; // FIXME: This may not be necessary? | ||||
|                 SetWindowHiddendAndSkipItemsForCurrentFrame(window); | ||||
|                 ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); | ||||
|             } | ||||
|     ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; | ||||
|     Begin(window_name, NULL, flags | extra_window_flags); | ||||
|     // 2023-03-09: Added bool return value to the API, but currently always returning true. | ||||
|     // If this ever returns false we need to update BeginDragDropSource() accordingly. | ||||
|     //if (!ret) | ||||
|     //    End(); | ||||
|     //return ret; | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void ImGui::EndTooltip() | ||||
| @@ -12030,13 +12042,12 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) | ||||
|         { | ||||
|             // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) | ||||
|             // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. | ||||
|             BeginTooltip(); | ||||
|             bool ret = BeginTooltip(); | ||||
|             IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame(). | ||||
|             IM_UNUSED(ret); | ||||
|  | ||||
|             if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) | ||||
|             { | ||||
|                 ImGuiWindow* tooltip_window = g.CurrentWindow; | ||||
|                 tooltip_window->Hidden = tooltip_window->SkipItems = true; | ||||
|                 tooltip_window->HiddenFramesCanSkipItems = 1; | ||||
|             } | ||||
|                 SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow); | ||||
|         } | ||||
|  | ||||
|         if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) | ||||
| @@ -13228,9 +13239,8 @@ void ImGui::DebugTextEncoding(const char* str) | ||||
| static void MetricsHelpMarker(const char* desc) | ||||
| { | ||||
|     ImGui::TextDisabled("(?)"); | ||||
|     if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort)) | ||||
|     if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) | ||||
|     { | ||||
|         ImGui::BeginTooltip(); | ||||
|         ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); | ||||
|         ImGui::TextUnformatted(desc); | ||||
|         ImGui::PopTextWrapPos(); | ||||
| @@ -13994,9 +14004,8 @@ void ImGui::DebugNodeFont(ImFont* font) | ||||
|                 if (!glyph) | ||||
|                     continue; | ||||
|                 font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n)); | ||||
|                 if (IsMouseHoveringRect(cell_p1, cell_p2)) | ||||
|                 if (IsMouseHoveringRect(cell_p1, cell_p2) && BeginTooltip()) | ||||
|                 { | ||||
|                     BeginTooltip(); | ||||
|                     DebugNodeFontGlyph(font, glyph); | ||||
|                     EndTooltip(); | ||||
|                 } | ||||
| @@ -14333,7 +14342,8 @@ void ImGui::UpdateDebugToolItemPicker() | ||||
|         if (change_mapping && IsMouseClicked(mouse_button)) | ||||
|             g.DebugItemPickerMouseButton = (ImU8)mouse_button; | ||||
|     SetNextWindowBgAlpha(0.70f); | ||||
|     BeginTooltip(); | ||||
|     if (!BeginTooltip()) | ||||
|         return; | ||||
|     Text("HoveredId: 0x%08X", hovered_id); | ||||
|     Text("Press ESC to abort picking."); | ||||
|     const char* mouse_button_names[] = { "Left", "Right", "Middle" }; | ||||
|   | ||||
							
								
								
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -665,8 +665,8 @@ namespace ImGui | ||||
|  | ||||
|     // Tooltips | ||||
|     // - Tooltip are windows following the mouse. They do not take focus away. | ||||
|     IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). | ||||
|     IMGUI_API void          EndTooltip(); | ||||
|     IMGUI_API bool          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). | ||||
|     IMGUI_API void          EndTooltip();                                                       // only call EndTooltip() if BeginTooltip() returns true! | ||||
|     IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). | ||||
|     IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); | ||||
|  | ||||
|   | ||||
| @@ -211,9 +211,8 @@ static void ShowDemoWindowInputs(); | ||||
| static void HelpMarker(const char* desc) | ||||
| { | ||||
|     ImGui::TextDisabled("(?)"); | ||||
|     if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort)) | ||||
|     if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) | ||||
|     { | ||||
|         ImGui::BeginTooltip(); | ||||
|         ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); | ||||
|         ImGui::TextUnformatted(desc); | ||||
|         ImGui::PopTextWrapPos(); | ||||
| @@ -629,9 +628,8 @@ static void ShowDemoWindowWidgets() | ||||
|  | ||||
|             ImGui::SameLine(); | ||||
|             ImGui::SmallButton("Fancy"); | ||||
|             if (ImGui::IsItemHovered()) | ||||
|             if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) | ||||
|             { | ||||
|                 ImGui::BeginTooltip(); | ||||
|                 ImGui::Text("I am a fancy tooltip"); | ||||
|                 static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; | ||||
|                 ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); | ||||
| @@ -1047,9 +1045,8 @@ static void ShowDemoWindowWidgets() | ||||
|             ImVec4 tint_col = use_text_color_for_tint ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f);   // No tint | ||||
|             ImVec4 border_col = ImGui::GetStyleColorVec4(ImGuiCol_Border); | ||||
|             ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); | ||||
|             if (ImGui::IsItemHovered()) | ||||
|             if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) | ||||
|             { | ||||
|                 ImGui::BeginTooltip(); | ||||
|                 float region_sz = 32.0f; | ||||
|                 float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; | ||||
|                 float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; | ||||
| @@ -3722,9 +3719,8 @@ static void EditTableSizingFlags(ImGuiTableFlags* p_flags) | ||||
|     } | ||||
|     ImGui::SameLine(); | ||||
|     ImGui::TextDisabled("(?)"); | ||||
|     if (ImGui::IsItemHovered()) | ||||
|     if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) | ||||
|     { | ||||
|         ImGui::BeginTooltip(); | ||||
|         ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); | ||||
|         for (int m = 0; m < IM_ARRAYSIZE(policies); m++) | ||||
|         { | ||||
| @@ -6318,10 +6314,11 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) | ||||
|  | ||||
|             // When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles. | ||||
|             ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp); | ||||
|             if (ImGui::IsItemActive()) | ||||
|             { | ||||
|             const bool show_samples = ImGui::IsItemActive(); | ||||
|             if (show_samples) | ||||
|                 ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos()); | ||||
|                 ImGui::BeginTooltip(); | ||||
|             if (show_samples && ImGui::BeginTooltip()) | ||||
|             { | ||||
|                 ImGui::TextUnformatted("(R = radius, N = number of segments)"); | ||||
|                 ImGui::Spacing(); | ||||
|                 ImDrawList* draw_list = ImGui::GetWindowDrawList(); | ||||
|   | ||||
| @@ -2723,6 +2723,7 @@ namespace ImGui | ||||
|     IMGUI_API void          SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); | ||||
|     IMGUI_API void          SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); | ||||
|     IMGUI_API void          SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); | ||||
|     IMGUI_API void          SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window); | ||||
|     inline ImRect           WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } | ||||
|     inline ImRect           WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } | ||||
|  | ||||
| @@ -2843,7 +2844,7 @@ namespace ImGui | ||||
|     IMGUI_API void          ClosePopupsExceptModals(); | ||||
|     IMGUI_API bool          IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); | ||||
|     IMGUI_API bool          BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); | ||||
|     IMGUI_API void          BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); | ||||
|     IMGUI_API bool          BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); | ||||
|     IMGUI_API ImRect        GetPopupAllowedExtentRect(ImGuiWindow* window); | ||||
|     IMGUI_API ImGuiWindow*  GetTopMostPopupModal(); | ||||
|     IMGUI_API ImGuiWindow*  GetTopMostAndVisiblePopupModal(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut