logmeow/event_loop.cpp

72 lines
2.4 KiB
C++
Raw Normal View History

#include <imgui.h>
2023-01-22 14:28:14 +00:00
2023-01-05 10:27:14 +00:00
#include "log.h"
#include "config.h"
2023-01-18 16:34:17 +00:00
#include "logcat_thread.h"
2023-01-23 08:44:16 +00:00
#include "windows/logs.h"
#include "windows/settings.h"
#include "windows/main.h"
#ifndef NDEBUG
#include "windows/debug.h"
#endif
2023-01-21 08:52:55 +00:00
static inline void write_config_and_update_structures(const Config& config) {
try {
write_config(config);
} catch (const std::exception& e) {
2023-01-16 04:08:35 +00:00
log(std::string("Failed to write config: ") + e.what());
2023-01-05 10:27:14 +00:00
return;
}
}
2023-01-21 08:41:30 +00:00
static inline void check_for_logcat_items(LogcatThread& logcat_thread, std::vector<LogcatEntry>& filtered_logcat_entries) {
2023-01-18 16:34:17 +00:00
LogcatThreadItem* logcat_thread_item;
while ((logcat_thread_item = logcat_thread.atomic_ring_buffer.get())) {
if (std::holds_alternative<std::string>(*logcat_thread_item)) {
2023-01-20 15:22:21 +00:00
log_raw(std::move(std::get<std::string>(*logcat_thread_item)), false);
2023-01-19 16:34:03 +00:00
} else if (std::holds_alternative<LogcatEntry>(*logcat_thread_item)) {
2023-01-21 08:41:30 +00:00
filtered_logcat_entries.push_back(std::move(std::get<LogcatEntry>(*logcat_thread_item)));
2023-01-18 16:34:17 +00:00
} else {
throw std::runtime_error("Cannot handle all possible logcat thread item variants");
}
logcat_thread.atomic_ring_buffer.increment_read();
}
}
2023-01-05 10:27:14 +00:00
2023-01-18 16:34:17 +00:00
void event_loop(ImFont* monospace_font, Config& config, float* config_write_timer, LogcatThread& logcat_thread, bool* run_event_loop) {
2023-01-05 09:05:09 +00:00
static bool show_settings_window = false;
2023-01-05 10:27:14 +00:00
static bool show_logs_window = false;
static size_t log_entries_read = 0;
2023-01-21 08:41:30 +00:00
static std::vector<LogcatEntry> filtered_logcat_entries;
2023-01-05 09:05:09 +00:00
2023-01-21 08:41:30 +00:00
check_for_logcat_items(logcat_thread, filtered_logcat_entries);
2023-01-18 16:34:17 +00:00
2023-01-18 16:37:37 +00:00
#ifndef NDEBUG
debug_window(logcat_thread);
2023-01-18 16:37:37 +00:00
#endif
2023-01-05 10:27:14 +00:00
if (show_settings_window) {
settings_window(config, config_write_timer, &show_settings_window);
}
if (*config_write_timer > 0.0f) {
*config_write_timer -= ImGui::GetIO().DeltaTime;
if (*config_write_timer <= 0.0f) {
write_config_and_update_structures(config);
}
}
2023-01-05 10:27:14 +00:00
if (show_logs_window) {
bool autoscrolling = false;
2023-01-06 16:27:39 +00:00
logs_window(monospace_font, &autoscrolling, &show_logs_window);
if (autoscrolling) {
log_entries_read = log_entries.size();
}
2023-01-05 10:27:14 +00:00
}
// log_entries must not be mutated until the show logs button
2023-01-21 08:41:30 +00:00
main_window(log_entries_read == log_entries.size(), monospace_font, filtered_logcat_entries, &show_settings_window, &show_logs_window, run_event_loop);
}