mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Refactor: Internals: Moved Tooltip functions in imgui.cpp in their own section + comments. (#2036)
This commit is contained in:
		
							
								
								
									
										138
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -2035,6 +2035,7 @@ bool ImGuiListClipper::Step() | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // ImGuiWindow | ||||
| // (This type has very few helper methods but otherwise is mostly a dumb struct) | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) | ||||
| @@ -2145,7 +2146,8 @@ ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Internal API exposed in imgui_internal.h | ||||
| // MAIN CODE | ||||
| // (this category is still too large and badly ordered, needs some tidying up) | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| static void SetCurrentWindow(ImGuiWindow* window) | ||||
| @@ -3969,71 +3971,6 @@ static ImRect GetViewportRect() | ||||
|     return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); | ||||
| } | ||||
|  | ||||
| // Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first. | ||||
| void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     char window_name[16]; | ||||
|     ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); | ||||
|     if (override_previous_tooltip) | ||||
|         if (ImGuiWindow* window = FindWindowByName(window_name)) | ||||
|             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->HiddenFramesRegular = 1; | ||||
|                 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|ImGuiWindowFlags_NoNav; | ||||
|     Begin(window_name, NULL, flags | extra_flags); | ||||
| } | ||||
|  | ||||
| void ImGui::SetTooltipV(const char* fmt, va_list args) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.DragDropWithinSourceOrTarget) | ||||
|         BeginTooltip(); | ||||
|     else | ||||
|         BeginTooltipEx(0, true); | ||||
|     TextV(fmt, args); | ||||
|     EndTooltip(); | ||||
| } | ||||
|  | ||||
| void ImGui::SetTooltip(const char* fmt, ...) | ||||
| { | ||||
|     va_list args; | ||||
|     va_start(args, fmt); | ||||
|     SetTooltipV(fmt, args); | ||||
|     va_end(args); | ||||
| } | ||||
|  | ||||
| void ImGui::BeginTooltip() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.DragDropWithinSourceOrTarget) | ||||
|     { | ||||
|         // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) | ||||
|         // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. | ||||
|         // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. | ||||
|         //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; | ||||
|         ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); | ||||
|         SetNextWindowPos(tooltip_pos); | ||||
|         SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); | ||||
|         //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( | ||||
|         BeginTooltipEx(0, true); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         BeginTooltipEx(0, false); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ImGui::EndTooltip() | ||||
| { | ||||
|     IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip);   // Mismatched BeginTooltip()/EndTooltip() calls | ||||
|     End(); | ||||
| } | ||||
|  | ||||
| static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
| @@ -6399,6 +6336,75 @@ void ImGui::Unindent(float indent_w) | ||||
|     window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // TOOLTIP | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| void ImGui::BeginTooltip() | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.DragDropWithinSourceOrTarget) | ||||
|     { | ||||
|         // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) | ||||
|         // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. | ||||
|         // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. | ||||
|         //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; | ||||
|         ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); | ||||
|         SetNextWindowPos(tooltip_pos); | ||||
|         SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); | ||||
|         //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( | ||||
|         BeginTooltipEx(0, true); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         BeginTooltipEx(0, false); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first. | ||||
| void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     char window_name[16]; | ||||
|     ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); | ||||
|     if (override_previous_tooltip) | ||||
|         if (ImGuiWindow* window = FindWindowByName(window_name)) | ||||
|             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->HiddenFramesRegular = 1; | ||||
|                 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|ImGuiWindowFlags_NoNav; | ||||
|     Begin(window_name, NULL, flags | extra_flags); | ||||
| } | ||||
|  | ||||
| void ImGui::EndTooltip() | ||||
| { | ||||
|     IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip);   // Mismatched BeginTooltip()/EndTooltip() calls | ||||
|     End(); | ||||
| } | ||||
|  | ||||
| void ImGui::SetTooltipV(const char* fmt, va_list args) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.DragDropWithinSourceOrTarget) | ||||
|         BeginTooltip(); | ||||
|     else | ||||
|         BeginTooltipEx(0, true); | ||||
|     TextV(fmt, args); | ||||
|     EndTooltip(); | ||||
| } | ||||
|  | ||||
| void ImGui::SetTooltip(const char* fmt, ...) | ||||
| { | ||||
|     va_list args; | ||||
|     va_start(args, fmt); | ||||
|     SetTooltipV(fmt, args); | ||||
|     va_end(args); | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // POPUPS | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
		Reference in New Issue
	
	Block a user