mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Added ProgressBar() (#333)
This commit is contained in:
parent
76ab5587e4
commit
5084f90a0d
35
imgui.cpp
35
imgui.cpp
@ -6777,6 +6777,41 @@ void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data,
|
|||||||
PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);
|
PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size
|
||||||
|
void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay)
|
||||||
|
{
|
||||||
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
if (window->SkipItems)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ImGuiState& g = *GImGui;
|
||||||
|
const ImGuiStyle& style = g.Style;
|
||||||
|
|
||||||
|
ImVec2 pos = window->DC.CursorPos;
|
||||||
|
const ImRect bb(pos, pos + CalcItemSize(size_arg, CalcItemWidth() + style.FramePadding.x*2.0f, g.FontSize + style.FramePadding.y*2.0f));
|
||||||
|
ItemSize(bb, style.FramePadding.y);
|
||||||
|
if (!ItemAdd(bb, NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Render
|
||||||
|
fraction = ImSaturate(fraction);
|
||||||
|
const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y);
|
||||||
|
RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
|
||||||
|
RenderFrame(bb.Min, fill_br, GetColorU32(ImGuiCol_PlotHistogram), false, style.FrameRounding);
|
||||||
|
|
||||||
|
// Default displaying the fraction as percentage string, but user can override it
|
||||||
|
char overlay_buf[32];
|
||||||
|
if (!overlay)
|
||||||
|
{
|
||||||
|
ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction*100+0.01f);
|
||||||
|
overlay = overlay_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImVec2 overlay_size = CalcTextSize(overlay, NULL);
|
||||||
|
if (overlay_size.x > 0.0f)
|
||||||
|
RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImGuiAlign_Left|ImGuiAlign_VCenter, &bb.Min, &bb.Max);
|
||||||
|
}
|
||||||
|
|
||||||
bool ImGui::Checkbox(const char* label, bool* v)
|
bool ImGui::Checkbox(const char* label, bool* v)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
1
imgui.h
1
imgui.h
@ -265,6 +265,7 @@ namespace ImGui
|
|||||||
IMGUI_API void PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
IMGUI_API void PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
||||||
IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
|
IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0), int stride = sizeof(float));
|
||||||
IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
||||||
|
IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);
|
||||||
|
|
||||||
// Widgets: Drags (tip: ctrl+click on a drag box to input text)
|
// Widgets: Drags (tip: ctrl+click on a drag box to input text)
|
||||||
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
|
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
|
||||||
|
@ -707,13 +707,15 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
|
|
||||||
if (ImGui::CollapsingHeader("Graphs widgets"))
|
if (ImGui::CollapsingHeader("Graphs widgets"))
|
||||||
{
|
{
|
||||||
|
static bool animate = true;
|
||||||
|
ImGui::Checkbox("Animate", &animate);
|
||||||
|
|
||||||
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
||||||
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
||||||
|
|
||||||
static bool pause;
|
|
||||||
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
|
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
|
||||||
static int values_offset = 0;
|
static int values_offset = 0;
|
||||||
if (!pause)
|
if (animate)
|
||||||
{
|
{
|
||||||
static float refresh_time = ImGui::GetTime(); // Create dummy data at fixed 60 hz rate for the demo
|
static float refresh_time = ImGui::GetTime(); // Create dummy data at fixed 60 hz rate for the demo
|
||||||
for (; ImGui::GetTime() > refresh_time + 1.0f/60.0f; refresh_time += 1.0f/60.0f)
|
for (; ImGui::GetTime() > refresh_time + 1.0f/60.0f; refresh_time += 1.0f/60.0f)
|
||||||
@ -724,12 +726,7 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
phase += 0.10f*values_offset;
|
phase += 0.10f*values_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::PlotLines("##Lines", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotLines("Lines", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
|
||||||
ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
||||||
ImGui::BeginGroup();
|
|
||||||
ImGui::Text("Lines");
|
|
||||||
ImGui::Checkbox("pause", &pause);
|
|
||||||
ImGui::EndGroup();
|
|
||||||
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
|
||||||
|
|
||||||
// Use functions to generate output
|
// Use functions to generate output
|
||||||
@ -747,6 +744,26 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
|
float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
|
||||||
ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
|
||||||
ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0,80));
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
// Animate a simple progress bar
|
||||||
|
static float progress = 0.0f, progress_dir = 1.0f;
|
||||||
|
if (animate)
|
||||||
|
{
|
||||||
|
progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime;
|
||||||
|
if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; }
|
||||||
|
if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
|
||||||
|
ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f));
|
||||||
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
||||||
|
ImGui::Text("Progress Bar");
|
||||||
|
|
||||||
|
float progress_saturated = (progress < 0.0f) ? 0.0f : (progress > 1.0f) ? 1.0f : progress;
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%d/%d", (int)(progress_saturated*1753), 1753);
|
||||||
|
ImGui::ProgressBar(progress, ImVec2(0.f,0.f), buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::CollapsingHeader("Layout"))
|
if (ImGui::CollapsingHeader("Layout"))
|
||||||
|
Loading…
Reference in New Issue
Block a user