mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2026-04-18 22:32:44 +00:00
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
#include <gui/widgets/symbol_diagram.h>
|
|
|
|
namespace ImGui {
|
|
SymbolDiagram::SymbolDiagram(float scale, int count) {
|
|
_scale = scale;
|
|
sampleCount = count;
|
|
|
|
buffer = new float[count];
|
|
|
|
memset(buffer, 0, sampleCount * sizeof(float));
|
|
}
|
|
|
|
SymbolDiagram::~SymbolDiagram() {
|
|
delete[] buffer;
|
|
}
|
|
|
|
void SymbolDiagram::draw(const ImVec2& size_arg) {
|
|
std::lock_guard<std::mutex> lck(bufferMtx);
|
|
ImGuiWindow* window = GetCurrentWindow();
|
|
ImGuiStyle& style = GetStyle();
|
|
float pad = style.FramePadding.y;
|
|
ImVec2 min = window->DC.CursorPos;
|
|
ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), 100);
|
|
ImRect bb(min, ImVec2(min.x+size.x, min.y+size.y));
|
|
float lineHeight = size.y;
|
|
|
|
ItemSize(size, style.FramePadding.y);
|
|
if (!ItemAdd(bb, 0)) {
|
|
return;
|
|
}
|
|
|
|
window->DrawList->AddRectFilled(min, ImVec2(min.x+size.x, min.y+size.y), IM_COL32(0,0,0,255));
|
|
ImU32 col = ImGui::GetColorU32(ImGuiCol_CheckMark, 0.7f);
|
|
float increment = size.x / (float)sampleCount;
|
|
float val;
|
|
for (int i = 0; i < sampleCount; i++) {
|
|
val = buffer[i] * _scale;
|
|
if (val > 1.0f || val < -1.0f) { continue; }
|
|
window->DrawList->AddCircleFilled(ImVec2(((float)i * increment) + min.x, ((val + 1) * (size.y*0.5f)) + min.y), 2, col);
|
|
}
|
|
}
|
|
|
|
float* SymbolDiagram::acquireBuffer() {
|
|
bufferMtx.lock();
|
|
return buffer;
|
|
}
|
|
|
|
void SymbolDiagram::releaseBuffer() {
|
|
bufferMtx.unlock();
|
|
}
|
|
|
|
} |