152 lines
4.6 KiB
Rust
152 lines
4.6 KiB
Rust
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<HighlightRule>, 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<HighlightRule>, 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);
|
|
});
|
|
});
|
|
} |