mod editor; mod find_highlight; mod line_numbers; use crate::app::TextEditor; use eframe::egui; use self::editor::editor_view_ui; use self::line_numbers::{get_visual_line_mapping, render_line_numbers}; pub(crate) fn central_panel(app: &mut TextEditor, ctx: &egui::Context) { let show_line_numbers = app.show_line_numbers; let word_wrap = app.word_wrap; let line_side = app.line_side; let font_size = app.font_size; egui::CentralPanel::default() .frame(egui::Frame::NONE) .show(ctx, |ui| { let bg_color = ui.visuals().extreme_bg_color; let panel_rect = ui.available_rect_before_wrap(); ui.painter().rect_filled(panel_rect, 0.0, bg_color); let editor_height = panel_rect.height(); if !show_line_numbers || app.get_active_tab().is_none() { egui::ScrollArea::vertical() .auto_shrink([false; 2]) .show(ui, |ui| { editor_view_ui(ui, app); }); return; } let line_count = app.get_text_processing_result().line_count; let editor_dimensions = app.calculate_editor_dimensions(ui); let line_number_width = editor_dimensions.line_number_width; let visual_line_mapping = if word_wrap { let available_text_width = editor_dimensions.text_width; if let Some(active_tab) = app.get_active_tab() { get_visual_line_mapping( ui, &active_tab.content, available_text_width, font_size, ) } else { vec![] } } else { vec![] }; let line_numbers_widget = |ui: &mut egui::Ui| { render_line_numbers( ui, line_count, &visual_line_mapping, line_number_width, word_wrap, font_size, ); }; let separator_widget = |ui: &mut egui::Ui| { ui.add_space(3.0); let separator_x = ui.cursor().left(); let mut y_range = ui.available_rect_before_wrap().y_range(); y_range.max += 2.0 * font_size; // Extend separator to cover more vertical space ui.painter() .vline(separator_x, y_range, ui.visuals().window_stroke); ui.add_space(4.0); }; egui::ScrollArea::vertical() .auto_shrink([false; 2]) .show(ui, |ui| { if line_side { // Line numbers on the right let text_editor_width = editor_dimensions.text_width + editor_dimensions.total_reserved_width; ui.allocate_ui_with_layout( egui::vec2(text_editor_width, editor_height), egui::Layout::left_to_right(egui::Align::TOP), |ui| { // Constrain editor to specific width to leave space for line numbers ui.allocate_ui_with_layout( egui::vec2(editor_dimensions.text_width, editor_height), egui::Layout::left_to_right(egui::Align::TOP), |ui| { editor_view_ui(ui, app); }, ); separator_widget(ui); line_numbers_widget(ui); }, ); } else { // Line numbers on the left let text_editor_width = editor_dimensions.text_width + editor_dimensions.total_reserved_width; ui.allocate_ui_with_layout( egui::vec2(text_editor_width, editor_height), egui::Layout::left_to_right(egui::Align::TOP), |ui| { line_numbers_widget(ui); separator_widget(ui); editor_view_ui(ui, app); }, ); } }); }); }