113 lines
4.5 KiB
Rust
113 lines
4.5 KiB
Rust
|
|
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);
|
||
|
|
},
|
||
|
|
);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|