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

56 lines
No EOL
1.9 KiB
C++

#include "logger_sink.h"
#include "core/style.h"
#include "imgui/imgui.h"
namespace satdump
{
namespace widgets
{
void LoggerSinkWidget::receive(slog::LogMsg log)
{
if (log.lvl >= sink_lvl)
{
mtx.lock();
new_item = true;
all_lines.push_back({log.lvl, format_log(log, false)});
if (all_lines.size() == max_lines)
all_lines.pop_front();
mtx.unlock();
}
}
void LoggerSinkWidget::draw()
{
mtx.lock();
for (LogLine &ll : all_lines)
{
std::string timestamp = ll.str.substr(0, 24);
std::string text = ll.str.substr(24, ll.str.size());
ImGui::Text("%s", timestamp.c_str());
ImGui::SameLine();
if (ll.lvl == slog::LOG_TRACE)
ImGui::TextUnformatted(text.c_str());
else if (ll.lvl == slog::LOG_DEBUG)
ImGui::TextColored(style::theme.cyan, "%s", text.c_str());
else if (ll.lvl == slog::LOG_INFO)
ImGui::TextColored(style::theme.green, "%s", text.c_str());
else if (ll.lvl == slog::LOG_WARN)
ImGui::TextColored(style::theme.yellow, "%s", text.c_str());
else if (ll.lvl == slog::LOG_ERROR)
ImGui::TextColored(style::theme.red, "%s", text.c_str());
else if (ll.lvl == slog::LOG_CRIT)
ImGui::TextColored(style::theme.fuchsia, "%s", text.c_str());
}
if (new_item)
{
ImGui::SetScrollHereY(1.0f);
new_item = false;
}
if (ImGui::IsWindowAppearing())
new_item = true;
mtx.unlock();
}
} // namespace widgets
} // namespace satdump