1
0
Fork 0
mirror of https://github.com/gwm17/implot.git synced 2024-11-26 20:28:50 -05:00

add ozlb's legend highlighting

This commit is contained in:
Evan Pezent 2020-04-28 00:38:52 -05:00
parent d372e1a1a5
commit 50f4e94833
2 changed files with 33 additions and 11 deletions

View File

@ -192,6 +192,7 @@ struct ImPlotItem {
ImPlotItem(); ImPlotItem();
~ImPlotItem() { ID = 0; } ~ImPlotItem() { ID = 0; }
bool Show; bool Show;
bool Highlight;
ImVec4 Color; ImVec4 Color;
int NameOffset; int NameOffset;
bool Active; bool Active;
@ -402,7 +403,14 @@ struct ImPlotContext {
/// Global plot context /// Global plot context
static ImPlotContext gp; static ImPlotContext gp;
ImPlotItem::ImPlotItem() { Show = true; Color = gp.NextColor(); NameOffset = -1; Active = true; ID = 0; } ImPlotItem::ImPlotItem() {
Show = true;
Highlight = false;
Color = gp.NextColor();
NameOffset = -1;
Active = true;
ID = 0;
}
//============================================================================= //=============================================================================
// Tick Utils // Tick Utils
@ -1034,6 +1042,16 @@ void EndPlot() {
ImRect icon_bb; ImRect icon_bb;
icon_bb.Min = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(2, 2); icon_bb.Min = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(2, 2);
icon_bb.Max = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(legend_icon_size - 2, legend_icon_size - 2); icon_bb.Max = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(legend_icon_size - 2, legend_icon_size - 2);
ImRect label_bb;
label_bb.Min = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(2, 2);
label_bb.Max = legend_content_bb.Min + legend_padding + ImVec2(0, i * txt_ht) + ImVec2(legend_content_bb.Max.x, legend_icon_size - 2);
ImU32 col_hl_txt;
if (HasFlag(plot.Flags, ImPlotFlags_Highlight) && hov_legend && (icon_bb.Contains(IO.MousePos) || label_bb.Contains(IO.MousePos))) {
item->Highlight = true;
col_hl_txt = GetColorU32(ImLerp(G.Style.Colors[ImGuiCol_Text], item->Color, 0.25f));
}
else
item->Highlight = false;
ImU32 iconColor; ImU32 iconColor;
if (hov_legend && icon_bb.Contains(IO.MousePos)) { if (hov_legend && icon_bb.Contains(IO.MousePos)) {
auto colAlpha = item->Color; auto colAlpha = item->Color;
@ -1049,7 +1067,8 @@ void EndPlot() {
const char* label = gp.GetLegendLabel(i); const char* label = gp.GetLegendLabel(i);
const char* text_display_end = FindRenderedTextEnd(label, NULL); const char* text_display_end = FindRenderedTextEnd(label, NULL);
if (label != text_display_end) if (label != text_display_end)
DrawList.AddText(legend_content_bb.Min + legend_padding + ImVec2(legend_icon_size, i * txt_ht), item->Show ? gp.Col_Txt : gp.Col_TxtDis, label, text_display_end); DrawList.AddText(legend_content_bb.Min + legend_padding + ImVec2(legend_icon_size, i * txt_ht),
item->Show ? (item->Highlight ? col_hl_txt : gp.Col_Txt) : gp.Col_TxtDis, label, text_display_end);
} }
} }
@ -1541,6 +1560,8 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
ImGui::PushClipRect(gp.BB_Grid.Min, gp.BB_Grid.Max, true); ImGui::PushClipRect(gp.BB_Grid.Min, gp.BB_Grid.Max, true);
bool cull = HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_CullData); bool cull = HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_CullData);
const float line_weight = item->Highlight ? gp.Style.LineWeight * 2 : gp.Style.LineWeight;
// render line segments // render line segments
if (count > 1 && rend_line) { if (count > 1 && rend_line) {
const int segments = count - 1; const int segments = count - 1;
@ -1553,7 +1574,7 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
p2 = gp.ToPixels(getter(data, i2)); p2 = gp.ToPixels(getter(data, i2));
i1 = i2; i1 = i2;
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2)) if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2))
DrawList.AddLine(p1, p2, col_line, gp.Style.LineWeight); DrawList.AddLine(p1, p2, col_line, line_weight);
} }
} }
else { else {
@ -1571,8 +1592,8 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
float dx = p2.x - p1.x; float dx = p2.x - p1.x;
float dy = p2.y - p1.y; float dy = p2.y - p1.y;
IM_NORMALIZE2F_OVER_ZERO(dx, dy); IM_NORMALIZE2F_OVER_ZERO(dx, dy);
dx *= (gp.Style.LineWeight * 0.5f); dx *= (line_weight * 0.5f);
dy *= (gp.Style.LineWeight * 0.5f); dy *= (line_weight * 0.5f);
DrawList._VtxWritePtr[0].pos.x = p1.x + dy; DrawList._VtxWritePtr[0].pos.x = p1.x + dy;
DrawList._VtxWritePtr[0].pos.y = p1.y - dx; DrawList._VtxWritePtr[0].pos.y = p1.y - dx;
DrawList._VtxWritePtr[0].uv = uv; DrawList._VtxWritePtr[0].uv = uv;

View File

@ -39,12 +39,13 @@ typedef int ImMarker;
enum ImPlotFlags_ { enum ImPlotFlags_ {
ImPlotFlags_MousePos = 1 << 0, // the mouse position, in plot coordinates, will be displayed in the bottom-right ImPlotFlags_MousePos = 1 << 0, // the mouse position, in plot coordinates, will be displayed in the bottom-right
ImPlotFlags_Legend = 1 << 1, // a legend will be displayed in the top-left ImPlotFlags_Legend = 1 << 1, // a legend will be displayed in the top-left
ImPlotFlags_Selection = 1 << 2, // the user will be able to box-select with right-mouse ImPlotFlags_Highlight = 1 << 2, // plot items will be highlighted when their legend entry is hovered
ImPlotFlags_ContextMenu = 1 << 3, // the user will be able to open a context menu with double-right click ImPlotFlags_Selection = 1 << 3, // the user will be able to box-select with right-mouse
ImPlotFlags_Crosshairs = 1 << 4, // the default mouse cursor will be replaced with a crosshair when hovered ImPlotFlags_ContextMenu = 1 << 4, // the user will be able to open a context menu with double-right click
ImPlotFlags_CullData = 1 << 5, // plot data outside the plot area will be culled from rendering ImPlotFlags_Crosshairs = 1 << 5, // the default mouse cursor will be replaced with a crosshair when hovered
ImPlotFlags_AntiAliased = 1 << 6, // lines and fills will be anti-aliased (not recommended) ImPlotFlags_CullData = 1 << 6, // plot data outside the plot area will be culled from rendering
ImPlotFlags_Default = ImPlotFlags_MousePos | ImPlotFlags_Legend | ImPlotFlags_Selection | ImPlotFlags_ContextMenu | ImPlotFlags_CullData ImPlotFlags_AntiAliased = 1 << 7, // lines and fills will be anti-aliased (not recommended)
ImPlotFlags_Default = ImPlotFlags_MousePos | ImPlotFlags_Legend | ImPlotFlags_Highlight | ImPlotFlags_Selection | ImPlotFlags_ContextMenu | ImPlotFlags_CullData
}; };
// Options for plot axes (X and Y) // Options for plot axes (X and Y)