ced/src/ui/central_panel.rs

113 lines
4.5 KiB
Rust
Raw Normal View History

2025-07-05 14:42:45 -04:00
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);
},
);
}
});
});
}