mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Plot: Internals: Added hovered index to PlotEx() function. (#2670)
This commit is contained in:
		| @@ -1887,7 +1887,7 @@ namespace ImGui | |||||||
|     IMGUI_API void          ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); |     IMGUI_API void          ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); | ||||||
|  |  | ||||||
|     // Plot |     // Plot | ||||||
|     IMGUI_API void          PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); |     IMGUI_API int           PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); | ||||||
|  |  | ||||||
|     // Shade functions (write over already created vertices) |     // Shade functions (write over already created vertices) | ||||||
|     IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); |     IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); | ||||||
|   | |||||||
| @@ -5835,13 +5835,13 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v | |||||||
| // - PlotHistogram() | // - PlotHistogram() | ||||||
| //------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||||
|  |  | ||||||
| void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size) | int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size) | ||||||
| { | { | ||||||
|  |     ImGuiContext& g = *GImGui; | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     if (window->SkipItems) |     if (window->SkipItems) | ||||||
|         return; |         return -1; | ||||||
|  |  | ||||||
|     ImGuiContext& g = *GImGui; |  | ||||||
|     const ImGuiStyle& style = g.Style; |     const ImGuiStyle& style = g.Style; | ||||||
|     const ImGuiID id = window->GetID(label); |     const ImGuiID id = window->GetID(label); | ||||||
|  |  | ||||||
| @@ -5856,7 +5856,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | |||||||
|     const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); |     const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); | ||||||
|     ItemSize(total_bb, style.FramePadding.y); |     ItemSize(total_bb, style.FramePadding.y); | ||||||
|     if (!ItemAdd(total_bb, 0, &frame_bb)) |     if (!ItemAdd(total_bb, 0, &frame_bb)) | ||||||
|         return; |         return -1; | ||||||
|     const bool hovered = ItemHoverable(frame_bb, id); |     const bool hovered = ItemHoverable(frame_bb, id); | ||||||
|  |  | ||||||
|     // Determine scale from values if not specified |     // Determine scale from values if not specified | ||||||
| @@ -5881,13 +5881,13 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | |||||||
|     RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); |     RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); | ||||||
|  |  | ||||||
|     const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; |     const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; | ||||||
|  |     int idx_hovered = -1; | ||||||
|     if (values_count >= values_count_min) |     if (values_count >= values_count_min) | ||||||
|     { |     { | ||||||
|         int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); |         int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); | ||||||
|         int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); |         int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); | ||||||
|  |  | ||||||
|         // Tooltip on hover |         // Tooltip on hover | ||||||
|         int v_hovered = -1; |  | ||||||
|         if (hovered && inner_bb.Contains(g.IO.MousePos)) |         if (hovered && inner_bb.Contains(g.IO.MousePos)) | ||||||
|         { |         { | ||||||
|             const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); |             const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); | ||||||
| @@ -5900,7 +5900,7 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | |||||||
|                 SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx+1, v1); |                 SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx+1, v1); | ||||||
|             else if (plot_type == ImGuiPlotType_Histogram) |             else if (plot_type == ImGuiPlotType_Histogram) | ||||||
|                 SetTooltip("%d: %8.4g", v_idx, v0); |                 SetTooltip("%d: %8.4g", v_idx, v0); | ||||||
|             v_hovered = v_idx; |             idx_hovered = v_idx; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const float t_step = 1.0f / (float)res_w; |         const float t_step = 1.0f / (float)res_w; | ||||||
| @@ -5927,13 +5927,13 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | |||||||
|             ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); |             ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); | ||||||
|             if (plot_type == ImGuiPlotType_Lines) |             if (plot_type == ImGuiPlotType_Lines) | ||||||
|             { |             { | ||||||
|                 window->DrawList->AddLine(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); |                 window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); | ||||||
|             } |             } | ||||||
|             else if (plot_type == ImGuiPlotType_Histogram) |             else if (plot_type == ImGuiPlotType_Histogram) | ||||||
|             { |             { | ||||||
|                 if (pos1.x >= pos0.x + 2.0f) |                 if (pos1.x >= pos0.x + 2.0f) | ||||||
|                     pos1.x -= 1.0f; |                     pos1.x -= 1.0f; | ||||||
|                 window->DrawList->AddRectFilled(pos0, pos1, v_hovered == v1_idx ? col_hovered : col_base); |                 window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             t0 = t1; |             t0 = t1; | ||||||
| @@ -5947,6 +5947,10 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | |||||||
|  |  | ||||||
|     if (label_size.x > 0.0f) |     if (label_size.x > 0.0f) | ||||||
|         RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); |         RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); | ||||||
|  |  | ||||||
|  |     // Return hovered index or -1 if none are hovered.  | ||||||
|  |     // This is currently not exposed in the public API because we need a larger redesign of the whole thing, but in the short-term we are making it available in PlotEx(). | ||||||
|  |     return idx_hovered; | ||||||
| } | } | ||||||
|  |  | ||||||
| struct ImGuiPlotArrayGetterData | struct ImGuiPlotArrayGetterData | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user