satdump/src-core/common/widgets/CircularProgressBar.cpp

38 lines
1.4 KiB
C++
Raw Permalink Normal View History

2026-01-29 23:10:31 +01:00
#include "CircularProgressBar.h"
void CircularProgressBar(const char *label, float progress, ImVec2 size, ImVec4 color)
{
ImGuiWindow *window = ImGui::GetCurrentWindow();
if (window->SkipItems)
return;
ImGui::BeginGroup();
ImGui::PushID(label);
ImVec2 pos = ImGui::GetCursorScreenPos();
float circleRadius = ImMin(size.x, size.y) * 0.5f;
ImVec2 center = ImVec2(pos.x + circleRadius, pos.y + circleRadius);
float arcAngle = 2.0f * IM_PI * progress;
const ImU32 bgColor = ImGui::GetColorU32(ImVec4(0.2f, 0.2f, 0.2f, 0.8f));
window->DrawList->AddCircleFilled(center, circleRadius + 5, bgColor, 32);
if (progress > 0.0f)
{
ImVec2 innerPos(center.x - circleRadius, center.y - circleRadius);
ImVec2 outerPos(center.x + circleRadius, center.y + circleRadius);
window->DrawList->PathArcTo(center, circleRadius, -IM_PI * 0.5f, -IM_PI * 0.5f + arcAngle, 32);
window->DrawList->PathStroke(ImGui::GetColorU32(color), false, 10.0f);
}
char textBuffer[32];
snprintf(textBuffer, sizeof(textBuffer), "%.0f%%", progress * 100.0f);
ImVec2 textSize = ImGui::CalcTextSize(textBuffer);
ImVec2 textPos = ImVec2(center.x - textSize.x * 0.5f, center.y - textSize.y * 0.5f);
window->DrawList->AddText(textPos, ImGui::GetColorU32(ImGuiCol_Text), textBuffer);
ImGui::PopID();
ImGui::EndGroup();
}