use eframe::egui; use crate::file_tab::FileTab; use crate::theme; use crate::theme::ColorPalette; use crate::types::HighlightRule; use crate::ui::{render_log_view, LogViewContext}; pub fn render_filter_panel(tab: &mut FileTab, ctx: &egui::Context, highlight_rules: &Vec, export_clicked: &mut bool){ if !tab.filtered_lines.is_empty() { let palette = theme::get_palette(); egui::TopBottomPanel::bottom("filtered_view") .resizable(true) .default_height(250.0) .min_height(150.0) .show(ctx, |ui| { // Styled header render_filter_panel_header(ui, &palette, tab, export_clicked); ui.separator(); render_log_view( ui, LogViewContext { tab, highlight_rules, show_all: false, }, ); }); } } pub fn render_main_log_panel(ctx: &egui::Context, highlight_rules: &Vec, active_tab: Option<&mut FileTab>) { egui::CentralPanel::default().show(ctx, |ui| { let palette = theme::get_palette(); if let Some(tab) = active_tab { // Styled header render_file_header(ui, palette, tab); ui.separator(); render_log_view( ui, LogViewContext { tab, highlight_rules: &highlight_rules, show_all: true, }, ); } else { render_no_file_opened_view(ui, palette); } }); } fn render_filter_panel_header(ui: &mut egui::Ui, palette: &ColorPalette, tab: &FileTab, export_clicked: &mut bool){ let header_frame = egui::Frame::none() .fill(palette.bg_secondary) .inner_margin(egui::Margin::symmetric(12.0, 8.0)); header_frame.show(ui, |ui| { ui.horizontal(|ui| { let icon = egui::RichText::new("🔍") .size(16.0); ui.label(icon); let title = egui::RichText::new("Search Results") .size(16.0) .color(palette.text_primary) .strong(); ui.label(title); let count = egui::RichText::new(format!("({} matches)", tab.filtered_lines.len())) .size(14.0) .color(palette.accent_bright); ui.label(count); ui.add_space(16.0); // Export button if ui.button("📤 Export").clicked() { *export_clicked = true; } }); }); } fn render_file_header(ui: &mut egui::Ui, palette: ColorPalette, tab: &FileTab) { let header_frame = egui::Frame::none() .fill(palette.bg_secondary) .inner_margin(egui::Margin::symmetric(12.0, 8.0)); header_frame.show(ui, |ui| { ui.horizontal(|ui| { let icon = egui::RichText::new("📄") .size(16.0); ui.label(icon); let title = egui::RichText::new("Log View") .size(16.0) .color(palette.text_primary) .strong(); ui.label(title); // Show filename if let Some(filename) = tab.file_path.file_name() { ui.add_space(8.0); let filename_text = egui::RichText::new(format!("• {}", filename.to_string_lossy())) .size(14.0) .color(palette.text_secondary); ui.label(filename_text); } // Show line count ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { let line_count = egui::RichText::new(format!("{} lines", tab.line_index.total_lines)) .size(13.0) .color(palette.text_muted); ui.label(line_count); }); }); }); } fn render_no_file_opened_view(ui: &mut egui::Ui, palette: ColorPalette) { ui.centered_and_justified(|ui| { ui.vertical_centered(|ui| { ui.add_space(40.0); let icon = egui::RichText::new("📂") .size(48.0); ui.label(icon); ui.add_space(16.0); let text = egui::RichText::new("No file loaded") .size(18.0) .color(palette.text_secondary); ui.label(text); ui.add_space(8.0); let hint = egui::RichText::new("Click 'Open File' in the menu to get started") .size(14.0) .color(palette.text_muted); ui.label(hint); }); }); }