From 214cba5aa33c8d9e386935c629171b3428b7d0d4 Mon Sep 17 00:00:00 2001 From: candle Date: Tue, 15 Jul 2025 10:43:41 -0400 Subject: [PATCH] better wording, defaults, fix double click selection --- src/app/state/default.rs | 2 +- src/ui/central_panel.rs | 41 ++++++++++++++++++++++++++++++------ src/ui/menu_bar.rs | 25 ++++++++++++++-------- src/ui/preferences_window.rs | 2 +- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/app/state/default.rs b/src/app/state/default.rs index 2044f9f..e94fbce 100644 --- a/src/app/state/default.rs +++ b/src/app/state/default.rs @@ -19,7 +19,7 @@ impl Default for TextEditor { show_line_numbers: false, word_wrap: true, auto_hide_toolbar: false, - auto_hide_tab_bar: false, + auto_hide_tab_bar: true, theme: Theme::default(), line_side: false, font_family: "Proportional".to_string(), diff --git a/src/ui/central_panel.rs b/src/ui/central_panel.rs index 4867a50..bc1da77 100644 --- a/src/ui/central_panel.rs +++ b/src/ui/central_panel.rs @@ -23,10 +23,19 @@ pub(crate) fn central_panel(app: &mut TextEditor, ctx: &egui::Context) { let editor_height = panel_rect.height(); if !show_line_numbers || app.get_active_tab().is_none() { - egui::ScrollArea::vertical() + let scroll_response = egui::ScrollArea::vertical() .auto_shrink([false; 2]) .show(ui, |ui| { - editor_view_ui(ui, app); + // Create an invisible interaction area for context menu that covers the whole area + let full_rect = ui.available_rect_before_wrap(); + let context_response = ui.allocate_response(full_rect.size(), egui::Sense::click()); + + // Reset cursor to render editor at the top + ui.allocate_ui_at_rect(full_rect, |ui| { + editor_view_ui(ui, app); + }); + + show_context_menu(ui, app, &context_response); }); return; } @@ -87,7 +96,16 @@ pub(crate) fn central_panel(app: &mut TextEditor, ctx: &egui::Context) { egui::vec2(editor_dimensions.text_width, editor_height), egui::Layout::left_to_right(egui::Align::TOP), |ui| { - editor_view_ui(ui, app); + // Create an invisible interaction area for context menu + let full_rect = ui.available_rect_before_wrap(); + let context_response = ui.allocate_response(full_rect.size(), egui::Sense::click()); + + // Reset cursor to render editor at the top + ui.allocate_ui_at_rect(full_rect, |ui| { + editor_view_ui(ui, app); + }); + + show_context_menu(ui, app, &context_response); }, ); separator_widget(ui); @@ -103,14 +121,26 @@ pub(crate) fn central_panel(app: &mut TextEditor, ctx: &egui::Context) { |ui| { line_numbers_widget(ui); separator_widget(ui); - editor_view_ui(ui, app); + + // Create an invisible interaction area for context menu + let editor_area = ui.available_rect_before_wrap(); + let context_response = ui.allocate_response(editor_area.size(), egui::Sense::click()); + + // Reset cursor to render editor at the current position + ui.allocate_ui_at_rect(editor_area, |ui| { + editor_view_ui(ui, app); + }); + + show_context_menu(ui, app, &context_response); }, ); } }); }); +} - output.response.context_menu(|ui| { +fn show_context_menu(ui: &mut egui::Ui, app: &mut TextEditor, context_response: &egui::Response) { + context_response.context_menu(|ui| { let text_len = app.get_active_tab().unwrap().content.len(); let reset_zoom_key = egui::Id::new("editor_reset_zoom"); @@ -159,5 +189,4 @@ pub(crate) fn central_panel(app: &mut TextEditor, ctx: &egui::Context) { ui.close_menu(); } }); - } diff --git a/src/ui/menu_bar.rs b/src/ui/menu_bar.rs index 6dcd98b..c47437d 100644 --- a/src/ui/menu_bar.rs +++ b/src/ui/menu_bar.rs @@ -179,7 +179,14 @@ pub(crate) fn menu_bar(app: &mut TextEditor, ctx: &egui::Context) { ui.close_menu(); } if ui - .checkbox(&mut app.word_wrap, "Toggle Word Wrap") + .checkbox(&mut app.word_wrap, "Word Wrap") + .clicked() + { + app.save_config(); + ui.close_menu(); + } + if ui + .checkbox(&mut app.auto_hide_tab_bar, "Hide Tab Bar") .clicked() { app.save_config(); @@ -192,13 +199,6 @@ pub(crate) fn menu_bar(app: &mut TextEditor, ctx: &egui::Context) { app.save_config(); ui.close_menu(); } - if ui - .checkbox(&mut app.auto_hide_tab_bar, "Auto Hide Tab Bar") - .clicked() - { - app.save_config(); - ui.close_menu(); - } ui.separator(); @@ -282,11 +282,18 @@ pub(crate) fn menu_bar(app: &mut TextEditor, ctx: &egui::Context) { }; let window_width = ctx.screen_rect().width(); + let font_id = ui.style().text_styles[&egui::TextStyle::Body].clone(); + + let tab_title = if app.get_active_tab().is_some_and(|tab| tab.is_modified) { + format!("{tab_title}*") + } else { + tab_title + }; let text_galley = ui.fonts(|fonts| { fonts.layout_job(egui::text::LayoutJob::simple_singleline( tab_title, - ui.style().text_styles[&egui::TextStyle::Body].clone(), + font_id, ui.style().visuals.text_color(), )) }); diff --git a/src/ui/preferences_window.rs b/src/ui/preferences_window.rs index be33a80..6291fc7 100644 --- a/src/ui/preferences_window.rs +++ b/src/ui/preferences_window.rs @@ -72,7 +72,7 @@ pub(crate) fn preferences_window(app: &mut TextEditor, ctx: &egui::Context) { app.font_size_input = Some(app.font_size.to_string()); } - let mut font_size_text = app.font_size_input.as_ref().unwrap().clone(); + let mut font_size_text = app.font_size_input.as_ref().unwrap_or(&"14".to_string()).clone(); let response = ui.add( egui::TextEdit::singleline(&mut font_size_text) .desired_width(50.0)