logmeow/windows/logs.cpp

78 lines
2.7 KiB
C++
Raw Normal View History

2023-01-29 08:21:22 +00:00
#include <ctime>
2023-01-23 08:44:16 +00:00
#include <imgui.h>
2023-01-29 10:08:27 +00:00
#include "../misc.h"
2023-01-23 08:44:16 +00:00
#include "../log.h"
#include "logs.h"
2023-01-29 08:21:22 +00:00
static inline void render_table(ImFont* monospace_font, bool* autoscrolling) {
ImGui::TableSetupScrollFreeze(0, 1);
ImGui::TableSetupColumn("Time", ImGuiTableColumnFlags_None);
ImGui::TableSetupColumn("Message", ImGuiTableColumnFlags_None);
ImGui::TableHeadersRow();
ImGui::PushFont(monospace_font);
2023-01-23 08:44:16 +00:00
ImGuiListClipper clipper;
2023-01-29 08:21:22 +00:00
clipper.Begin(static_cast<int>(log_entries.size()));
2023-01-23 08:44:16 +00:00
while (clipper.Step()) {
for (int i_u = clipper.DisplayStart; i_u < clipper.DisplayEnd; i_u++) {
// what'd we do if we log the error about an error failing to show logs
assert(i_u >= 0);
size_t i = static_cast<size_t>(i_u);
2023-01-29 08:21:22 +00:00
const LogEntry* log_entry = &log_entries[i];
2023-02-03 04:59:51 +00:00
struct tm tm;
2023-01-29 08:21:22 +00:00
char time_as_str[128] = {0};
2023-02-03 04:59:51 +00:00
strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&log_entry->time, &tm));
2023-01-29 08:21:22 +00:00
ImGui::TableNextRow();
2023-01-29 11:59:33 +00:00
if (ImGui::TableSetColumnIndex(0)) ImGui::TextUnformatted(time_as_str);
if (ImGui::TableSetColumnIndex(1)) ImGui::TextUnformatted(log_entry->message);
2023-01-23 08:44:16 +00:00
}
}
clipper.End();
ImGui::PopFont();
if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) {
*autoscrolling = true;
ImGui::SetScrollHereY(1.0f);
}
2023-01-29 08:21:22 +00:00
ImGui::EndTable();
2023-01-23 08:44:16 +00:00
}
void logs_window(ImFont* monospace_font, bool* __restrict autoscrolling, bool* __restrict p_open) {
2023-02-04 07:31:50 +00:00
if (!ImGui::BeginWithCloseShortcut("LogMeow Logs", p_open)) {
2023-01-23 08:44:16 +00:00
ImGui::End();
return;
}
if (ImGui::Button("Clear")) {
log_entries.clear();
}
ImGui::SameLine();
if (ImGui::Button("Copy")) {
2023-01-29 08:21:22 +00:00
std::string text;
for (const LogEntry& entry : log_entries) {
if (!text.empty()) {
text += '\n';
}
text += format_log(entry);
}
ImGui::SetClipboardText(text.c_str());
2023-01-23 08:44:16 +00:00
}
ImGui::Separator();
// copied from imgui/imgui_demo.cpp: [SECTION] Example App: Debug Console / ShowExampleAppConsole()
// and [SECTION] Example App: Long Text / ShowExampleAppLongText()
// and [SECTION] Example App: Debug Log / ShowExampleAppLog()
2023-01-29 08:21:22 +00:00
// and Tables/Vertical scrolling, with clipping
const constexpr ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_ScrollX | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable;
if (ImGui::BeginTable("logs", 2, flags)) {
render_table(monospace_font, autoscrolling);
2023-01-23 08:44:16 +00:00
}
ImGui::End();
}