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); | ||||
|  | ||||
|     // 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) | ||||
|     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() | ||||
| //------------------------------------------------------------------------- | ||||
|  | ||||
| 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(); | ||||
|     if (window->SkipItems) | ||||
|         return; | ||||
|         return -1; | ||||
|  | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     const ImGuiStyle& style = g.Style; | ||||
|     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)); | ||||
|     ItemSize(total_bb, style.FramePadding.y); | ||||
|     if (!ItemAdd(total_bb, 0, &frame_bb)) | ||||
|         return; | ||||
|         return -1; | ||||
|     const bool hovered = ItemHoverable(frame_bb, id); | ||||
|  | ||||
|     // 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); | ||||
|  | ||||
|     const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; | ||||
|     int idx_hovered = -1; | ||||
|     if (values_count >= values_count_min) | ||||
|     { | ||||
|         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); | ||||
|  | ||||
|         // Tooltip on hover | ||||
|         int v_hovered = -1; | ||||
|         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); | ||||
| @@ -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); | ||||
|             else if (plot_type == ImGuiPlotType_Histogram) | ||||
|                 SetTooltip("%d: %8.4g", v_idx, v0); | ||||
|             v_hovered = v_idx; | ||||
|             idx_hovered = v_idx; | ||||
|         } | ||||
|  | ||||
|         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)); | ||||
|             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) | ||||
|             { | ||||
|                 if (pos1.x >= pos0.x + 2.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; | ||||
| @@ -5947,6 +5947,10 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge | ||||
|  | ||||
|     if (label_size.x > 0.0f) | ||||
|         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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user