use crate::components::event_logger::log_colors::LogColors;
use crate::components::event_logger::log_type::LogType;
use crate::components::event_logger::messages::{LogEntry, Message};
use egui::RichText;
use std::collections::VecDeque;
pub const MAX_LOGS: usize = 1000;
#[derive(Clone)]
pub struct LoggerState {
pub logs: VecDeque<LogEntry>,
pub colors: LogColors,
pub show_timestamps: bool,
pub show_messages: bool,
}
impl Default for LoggerState {
fn default() -> Self {
Self {
logs: VecDeque::with_capacity(MAX_LOGS),
colors: LogColors::default(),
show_timestamps: true,
show_messages: true,
}
}
}
impl LoggerState {
pub fn new(colors: LogColors) -> Self {
Self {
logs: VecDeque::with_capacity(MAX_LOGS),
colors,
show_timestamps: true,
show_messages: true,
}
}
pub fn add_log(&mut self, entry: LogEntry) {
self.logs.push_back(entry);
if self.logs.len() >= MAX_LOGS {
self.logs.pop_front();
}
}
pub fn clear(&mut self) {
self.logs.clear();
}
pub fn update_colors(&mut self, new_colors: LogColors) {
self.colors = new_colors;
}
pub fn toggle_timestamps(&mut self, show: bool) {
self.show_timestamps = show;
}
pub fn toggle_messages(&mut self, show: bool) {
self.show_messages = show;
}
pub fn export_recent(&self, count: usize) -> Vec<LogEntry> {
let count = std::cmp::min(count, self.logs.len());
let start_index = self.logs.len().saturating_sub(count);
self.logs.iter().skip(start_index).cloned().collect()
}
pub fn format_log_entry(&self, entry: &LogEntry) -> (RichText, RichText) {
let time_str = entry.timestamp.format("%H:%M:%S%.3f").to_string();
let time_color = self.colors.time_format;
let timestamp_rich = RichText::new(time_str).color(time_color);
let msg_color = match entry.style_type {
LogType::Slider => self.colors.slider,
LogType::OptionA => self.colors.option_a,
LogType::OptionB => self.colors.option_b,
LogType::OptionC => self.colors.option_c,
LogType::CustomEvent => self.colors.custom_event,
LogType::Checkbox => self.colors.custom_event,
LogType::RunStop => self.colors.run_stop_log,
LogType::Timestamp => self.colors.time_format,
LogType::Default => egui::Color32::WHITE,
LogType::Primary => self.colors.clock,
LogType::Secondary => self.colors.custom_event,
};
let severity_color = match &entry.message {
Message::Info(_) => self.colors.info_text,
Message::Warn(_) => self.colors.warn_text,
Message::Debug(_) => self.colors.debug_text,
Message::Error(_) => self.colors.error_text,
};
let msg_type = entry.message.type_name();
let sender_name = entry.sender.display_name();
let prefix = format!("[{msg_type}] [{sender_name}] ");
let content = entry.message.content();
let formatted_msg = format!("{prefix}{content}");
let final_color = if self.colors.prioritize_style_colors {
msg_color
} else {
severity_color
};
let message_rich = RichText::new(&formatted_msg).color(final_color);
(timestamp_rich, message_rich)
}
}