61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <imgui.h>
 | |
| 
 | |
| #include "log.h"
 | |
| #include "config.h"
 | |
| #include "logcat_thread.h"
 | |
| 
 | |
| #include "windows/logs.h"
 | |
| #include "windows/settings.h"
 | |
| #include "windows/main.h"
 | |
| #ifndef NDEBUG
 | |
|     #include "windows/debug.h"
 | |
| #endif
 | |
| 
 | |
| static inline void check_for_logcat_items(LogcatThread& logcat_thread, std::vector<LogcatEntry>& filtered_logcat_entries) {
 | |
|     LogcatThreadItem* logcat_thread_item;
 | |
| 
 | |
|     while ((logcat_thread_item = logcat_thread.atomic_ring_buffer.get())) {
 | |
|         if (std::holds_alternative<std::string>(*logcat_thread_item)) {
 | |
|             log_raw(std::move(std::get<std::string>(*logcat_thread_item)), false);
 | |
|         } else if (std::holds_alternative<LogcatEntry>(*logcat_thread_item)) {
 | |
|             filtered_logcat_entries.push_back(std::move(std::get<LogcatEntry>(*logcat_thread_item)));
 | |
|         } else {
 | |
|             throw std::runtime_error("Cannot handle all possible logcat thread item variants");
 | |
|         }
 | |
|         logcat_thread.atomic_ring_buffer.increment_read();
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| void event_loop(ImFont* monospace_font, Config& active_config, LogcatThread& logcat_thread, bool* run_event_loop) {
 | |
|     static Config inactive_config;
 | |
|     static bool show_settings_window = false;
 | |
|     static bool show_logs_window = false;
 | |
|     static size_t log_entries_read = 0;
 | |
|     static std::vector<LogcatEntry> filtered_logcat_entries;
 | |
| 
 | |
|     check_for_logcat_items(logcat_thread, filtered_logcat_entries);
 | |
| 
 | |
| #ifndef NDEBUG
 | |
|     debug_window(logcat_thread);
 | |
| #endif
 | |
| 
 | |
|     if (show_settings_window) {
 | |
|         settings_window(active_config, inactive_config, &show_settings_window);
 | |
|     }
 | |
| 
 | |
|     if (show_logs_window) {
 | |
|         bool autoscrolling = false;
 | |
|         logs_window(monospace_font, &autoscrolling, &show_logs_window);
 | |
|         if (autoscrolling) {
 | |
|             log_entries_read = log_entries.size();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // log_entries must not be mutated until the show logs button
 | |
|     main_window(log_entries_read == log_entries.size(),
 | |
|         monospace_font, filtered_logcat_entries,
 | |
|         active_config, inactive_config, &show_settings_window,
 | |
|         &show_logs_window, run_event_loop);
 | |
| }
 |