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

add public API for horizontal and vertical guide lines

This commit is contained in:
epezent 2020-09-17 09:58:33 -05:00
parent 39328e1106
commit 13927c608d
3 changed files with 85 additions and 33 deletions

View File

@ -1185,7 +1185,7 @@ bool BeginPlot(const char* title, const char* x_label, const char* y_label, cons
// capture scroll with a child region // capture scroll with a child region
if (!ImHasFlag(plot.Flags, ImPlotFlags_NoChild)) { if (!ImHasFlag(plot.Flags, ImPlotFlags_NoChild)) {
ImGui::BeginChild(title, ImVec2(size.x == 0 ? IMPLOT_DEFAULT_W : size.x, size.y == 0 ? IMPLOT_DEFAULT_H : size.y)); ImGui::BeginChild(title, ImVec2(size.x == 0 ? IMPLOT_DEFAULT_W : size.x, size.y == 0 ? IMPLOT_DEFAULT_H : size.y), false, ImGuiWindowFlags_NoScrollbar);
Window = ImGui::GetCurrentWindow(); Window = ImGui::GetCurrentWindow();
Window->ScrollMax.y = 1.0f; Window->ScrollMax.y = 1.0f;
gp.ChildWindowMade = true; gp.ChildWindowMade = true;
@ -2479,6 +2479,68 @@ ImPlotLimits GetPlotQuery(int y_axis_in) {
return result; return result;
} }
bool HorizontalGuide(const char* id, double* value, const ImVec4& col, float thickness) {
ImPlotContext& gp = *GImPlot;
IM_ASSERT_USER_ERROR(gp.CurrentPlot != NULL, "HorizontalGuide() needs to be called between BeginPlot() and EndPlot()!");
const float grab_size = 2*thickness;
float xl = gp.BB_Plot.Min.x;
float xr = gp.BB_Plot.Max.x;
float y = PlotToPixels(0, *value).y;
ImU32 col32 = IsColorAuto(col) ? GetStyleColorU32(ImPlotCol_Query) : ImGui::ColorConvertFloat4ToU32(col);
PushPlotClipRect();
GetPlotDrawList()->AddLine(ImVec2(xl,y), ImVec2(xr,y), col32, thickness);
PopPlotClipRect();
const bool outside = (y < gp.BB_Plot.Min.y - grab_size / 2 || y > gp.BB_Plot.Max.y + grab_size / 2);
if (outside)
return false;
ImVec2 old_cursor_pos = ImGui::GetCursorScreenPos();
ImVec2 new_cursor_pos = ImVec2(xl, y - grab_size / 2.0f);
ImGui::SetItemAllowOverlap();
ImGui::SetCursorScreenPos(new_cursor_pos);
ImGui::InvisibleButton(id, ImVec2(xr - xl, grab_size));
ImGui::SetCursorScreenPos(old_cursor_pos);
if (ImGui::IsItemHovered() || ImGui::IsItemActive()) {
ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS);
}
bool dragging = false;
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0)) {
*value = ImPlot::GetPlotMousePos().y;
dragging = true;
}
return dragging;
}
bool VerticalGuide(const char* id, double* value, const ImVec4& col, float thickness) {
ImPlotContext& gp = *GImPlot;
IM_ASSERT_USER_ERROR(gp.CurrentPlot != NULL, "VerticalGuide() needs to be called between BeginPlot() and EndPlot()!");
const float grab_size = 2*thickness;
float yt = gp.BB_Plot.Min.y;
float yb = gp.BB_Plot.Max.y;
float x = PlotToPixels(*value,0).x;
ImU32 col32 = IsColorAuto(col) ? GetStyleColorU32(ImPlotCol_Query) : ImGui::ColorConvertFloat4ToU32(col);
PushPlotClipRect();
GetPlotDrawList()->AddLine(ImVec2(x,yt), ImVec2(x,yb), col32, thickness);
PopPlotClipRect();
const bool outside = (x < gp.BB_Plot.Min.x - grab_size / 2 || x > gp.BB_Plot.Max.x + grab_size / 2);
if (outside)
return false;
ImVec2 old_cursor_pos = ImGui::GetCursorScreenPos();
ImVec2 new_cursor_pos = ImVec2(x - grab_size / 2.0f, yt);
ImGui::SetItemAllowOverlap();
ImGui::SetCursorScreenPos(new_cursor_pos);
ImGui::InvisibleButton(id, ImVec2(grab_size, yb-yt));
ImGui::SetCursorScreenPos(old_cursor_pos);
if (ImGui::IsItemHovered() || ImGui::IsItemActive()) {
ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW);
}
bool dragging = false;
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0)) {
*value = ImPlot::GetPlotMousePos().x;
dragging = true;
}
return dragging;
}
bool IsLegendEntryHovered(const char* label_id) { bool IsLegendEntryHovered(const char* label_id) {
ImPlotContext& gp = *GImPlot; ImPlotContext& gp = *GImPlot;
IM_ASSERT_USER_ERROR(gp.CurrentPlot != NULL, "IsPlotItemHighlight() needs to be called between BeginPlot() and EndPlot()!"); IM_ASSERT_USER_ERROR(gp.CurrentPlot != NULL, "IsPlotItemHighlight() needs to be called between BeginPlot() and EndPlot()!");

View File

@ -459,6 +459,11 @@ IMPLOT_API bool IsPlotQueried();
// Returns the current plot query bounds. // Returns the current plot query bounds.
IMPLOT_API ImPlotLimits GetPlotQuery(int y_axis = IMPLOT_AUTO); IMPLOT_API ImPlotLimits GetPlotQuery(int y_axis = IMPLOT_AUTO);
// Shows a draggable horizontal guide line.
IMPLOT_API bool HorizontalGuide(const char* id, double* value, const ImVec4& col = IMPLOT_AUTO_COL, float thickness = 2);
// Shows a draggable vertical guide line.
IMPLOT_API bool VerticalGuide(const char* id, double* value, const ImVec4& col = IMPLOT_AUTO_COL, float thickness = 2);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Plot and Item Styling // Plot and Item Styling
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -785,6 +785,23 @@ void ShowDemoWindow(bool* p_open) {
} }
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
if (ImGui::CollapsingHeader("Guide Lines")) {
static double v1 = 0.2;
static double v2 = 0.6;
static double h1 = 0.25;
static double h2 = 0.75;
static double h3 = 0.5;
if (ImPlot::BeginPlot("##guides",0,0,ImVec2(-1,0),ImPlotFlags_YAxis2)) {
ImPlot::VerticalGuide("v1",&v1, ImVec4(0,1,0,1));
ImPlot::VerticalGuide("v2",&v2, ImVec4(0,1,0,1));
ImPlot::HorizontalGuide("h1",&h1, ImVec4(1,0,0,1));
ImPlot::HorizontalGuide("h2",&h2, ImVec4(1,0,0,1));
ImPlot::SetPlotYAxis(1);
ImPlot::HorizontalGuide("h3",&h3, ImVec4(1,1,0,1));
ImPlot::EndPlot();
}
}
//-------------------------------------------------------------------------
if (ImGui::CollapsingHeader("Drag and Drop")) { if (ImGui::CollapsingHeader("Drag and Drop")) {
const int K_CHANNELS = 9; const int K_CHANNELS = 9;
srand((int)(10000000 * DEMO_TIME)); srand((int)(10000000 * DEMO_TIME));
@ -1218,38 +1235,6 @@ void ShowDemoWindow(bool* p_open) {
} }
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
if (ImGui::CollapsingHeader("Custom Dragable Lines")) {
static float line_value = 0.5f;
const float line_width = 3.0f;
const float grabbable_width = 5.0f;
if (ImPlot::BeginPlot("Dragable Lines")) {
auto x0 = ImPlot::GetPlotPos().x;
auto x1 = ImPlot::GetPlotPos().x + ImPlot::GetPlotSize().x;
auto y = ImPlot::PlotToPixels(0, line_value).y;
ImPlot::PushPlotClipRect();
ImPlot::GetPlotDrawList()->AddLine({ x0, y }, { x1, y }, IM_COL32_WHITE, line_width);
ImPlot::PopPlotClipRect();
ImVec2 old_cursor_pos = ImGui::GetCursorScreenPos();
ImVec2 new_cursor_pos = ImVec2(x0, y - grabbable_width / 2.0f);
ImGui::SetItemAllowOverlap();
ImGui::SetCursorScreenPos(new_cursor_pos);
ImGui::InvisibleButton("horizontal_line", ImVec2(x1 - x0, grabbable_width));
ImGui::SetCursorScreenPos(old_cursor_pos);
if (ImGui::IsItemHovered() || ImGui::IsItemActive()) {
ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS);
}
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0)) {
line_value = ImPlot::GetPlotMousePos().y;
}
ImPlot::EndPlot();
}
}
//-------------------------------------------------------------------------
ImGui::End(); ImGui::End();
} }