Port indeterminate progress bar

This commit is contained in:
Asriel Camora
2024-11-28 15:17:51 -08:00
parent e86ca2aed4
commit 96968969e3
3 changed files with 63 additions and 7 deletions
+16 -1
View File
@@ -22,6 +22,12 @@ internal static unsafe class ImGuiExtras
[DllImport("cimgui", CallingConvention = CallingConvention.Cdecl)]
private static extern bool igItemSize_Vec2(Vector2 size, float text_baseline_y = -1.0f);
[DllImport("cimgui", CallingConvention = CallingConvention.Cdecl)]
private static extern void igRenderFrame(Vector2 p_min, Vector2 p_max, uint fill_col, bool border = true, float rounding = 0.0f);
[DllImport("cimgui", CallingConvention = CallingConvention.Cdecl)]
private static extern void igRenderRectFilledRangeH(ImDrawList* draw_list, Vector4* rect, uint col, float x_start_norm, float x_end_norm, float rounding);
[DllImport("cimgui", CallingConvention = CallingConvention.Cdecl)]
private static extern ImGuiItemFlags igGetItemFlags();
@@ -149,7 +155,10 @@ internal static unsafe class ImGuiExtras
return result != 0;
}
public static unsafe bool ItemAdd(Vector4 bb, uint id, out Vector4 navBb, uint flags)
public static unsafe bool ItemAdd(Vector4 bb, uint id) =>
ItemAdd(bb, id, out _);
public static unsafe bool ItemAdd(Vector4 bb, uint id, out Vector4 navBb, uint flags = 0)
{
fixed (Vector4* navBbPtr = &navBb)
{
@@ -166,6 +175,12 @@ internal static unsafe class ImGuiExtras
}
}
public static unsafe void RenderFrame(Vector2 p_min, Vector2 p_max, uint fill_col, bool border = true, float rounding = 0.0f) =>
igRenderFrame(p_min, p_max, fill_col, border, rounding);
public static unsafe void RenderRectFilledRangeH(ImDrawListPtr draw_list, Vector4 rect, uint col, float x_start_norm, float x_end_norm, float rounding) =>
igRenderRectFilledRangeH(draw_list.NativePtr, &rect, col, x_start_norm, x_end_norm, rounding);
public static unsafe bool ItemSize(Vector2 size, float text_baseline_y = -1.0f) =>
igItemSize_Vec2(size, text_baseline_y);
+32
View File
@@ -247,6 +247,38 @@ internal static class ImGuiUtils
Arc(startAngle, endAngle, radius, ratio, backgroundColor, filledColor);
}
public static void ProgressBar(float value, Vector2 size)
{
var style = ImGui.GetStyle();
var pos = ImGui.GetCursorScreenPos();
//size = ImGuiExtras.CalcItemSize(size, ImGui.CalcItemWidth(), ImGui.GetFontSize() + style.FramePadding.Y * 2.0f);
var bbMin = pos;
var bbMax = pos + size;
ImGuiExtras.ItemSize(size, style.FramePadding.Y);
if (!ImGuiExtras.ItemAdd(new(bbMin.X, bbMin.Y, bbMax.X, bbMax.Y), 0))
return;
var bar_begin = 0.0f;
var bar_end = Math.Clamp(value, 0, 1);
var indeterminate = value < 0.0f;
if (indeterminate)
{
const float bar_fraction = 0.2f;
bar_begin = (-value % 1.0f * (1.0f + bar_fraction)) - bar_fraction;
bar_end = bar_begin + bar_fraction;
}
ImGuiExtras.RenderFrame(bbMin, bbMax, ImGui.GetColorU32(ImGuiCol.FrameBg), true, style.FrameRounding);
bbMin += new Vector2(style.FrameBorderSize);
bbMax -= new Vector2(style.FrameBorderSize);
ImGuiExtras.RenderRectFilledRangeH(ImGui.GetWindowDrawList(), new(bbMin.X, bbMin.Y, bbMax.X, bbMax.Y), ImGui.GetColorU32(ImGuiCol.PlotHistogram), bar_begin, bar_end, style.FrameRounding);
}
public sealed class ViolinData
{
public struct Point(float x, float y, float y2)
+15 -6
View File
@@ -88,7 +88,7 @@ internal static class DynamicBars
var pos = ImGui.GetCursorPos();
var screenPos = ImGui.GetCursorScreenPos();
using (var color = ImRaii.PushColor(ImGuiCol.PlotHistogram, bar.Color))
ImGui.ProgressBar(Math.Clamp(bar.Value / bar.Max, 0, 1), new(barSize, ImGui.GetFrameHeight()), string.Empty);
ImGuiUtils.ProgressBar(Math.Clamp(bar.Value / bar.Max, 0, 1), new(barSize, ImGui.GetFrameHeight()));
if (bar.Collectability is { } collectability)
{
var i = 0;
@@ -188,19 +188,28 @@ internal static class DynamicBars
}
var percentWidth = ImGui.CalcTextSize("100%").X;
var progressWidth = availSpace.Value - percentWidth - spacing;
var progressWidth = availSpace.Value;
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
fraction = Math.Clamp(fraction, 0, 1);
if (!solver.IsIndeterminate)
progressWidth -= percentWidth + spacing;
else
fraction = (float)-ImGui.GetTime() * .5f;
using (ImRaii.PushColor(ImGuiCol.FrameBg, progressColors.Background))
using (ImRaii.PushColor(ImGuiCol.PlotHistogram, progressColors.Foreground))
ImGui.ProgressBar(solver.IsIndeterminate ? (float)-ImGui.GetTime() : fraction, new(progressWidth, ImGui.GetFrameHeight()), string.Empty);
ImGuiUtils.ProgressBar(fraction, new(progressWidth, ImGui.GetFrameHeight()));
if (ImGui.IsItemHovered())
DrawProgressBarTooltip(solver);
ImGui.SameLine(0, spacing);
ImGui.AlignTextToFramePadding();
ImGuiUtils.TextRight($"{fraction * 100:N0}%", percentWidth);
if (!solver.IsIndeterminate)
{
ImGui.SameLine(0, spacing);
ImGui.AlignTextToFramePadding();
ImGuiUtils.TextRight($"{fraction * 100:N0}%", percentWidth);
}
}
public static void DrawProgressBarTooltip(Solver.Solver solver)