From 97ef386b7f6b174f7ccfee5b93cd62aa84aa2b55 Mon Sep 17 00:00:00 2001 From: umajho Date: Wed, 8 Apr 2026 17:49:37 +0800 Subject: [PATCH] Fix(egui): improve underline drawing --- crates/egui/src/text_selection/visuals.rs | 66 +++++++++++++++-------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/crates/egui/src/text_selection/visuals.rs b/crates/egui/src/text_selection/visuals.rs index 22c402e5f..003bac879 100644 --- a/crates/egui/src/text_selection/visuals.rs +++ b/crates/egui/src/text_selection/visuals.rs @@ -151,20 +151,53 @@ pub fn paint_ime_preedit_text_visuals( color: active_underline_stroke.color.linear_multiply(0.5), }; - paint_underlines( - pos, - painter, - galley, - galley.layout_from_cursor(preedit_range.start), - galley.layout_from_cursor(preedit_range.end), - inactive_underline_stroke, - ); + if let Some(relative_active_range) = &relative_active_range + && !relative_active_range.is_empty() + { + if relative_active_range.start.index > 0 { + paint_underlines( + pos, + painter, + galley, + galley.layout_from_cursor(preedit_range.start), + galley.layout_from_cursor(preedit_range.start + relative_active_range.start.index), + inactive_underline_stroke, + ); + } - let Some(relative_active_range) = relative_active_range else { - return; - }; + paint_underlines( + pos, + painter, + galley, + galley.layout_from_cursor(preedit_range.start + relative_active_range.start.index), + galley.layout_from_cursor(preedit_range.start + relative_active_range.end.index), + active_underline_stroke, + ); - if relative_active_range.is_empty() { + if relative_active_range.end < preedit_range.end - preedit_range.start.index { + paint_underlines( + pos, + painter, + galley, + galley.layout_from_cursor(preedit_range.start + relative_active_range.end.index), + galley.layout_from_cursor(preedit_range.end), + inactive_underline_stroke, + ); + } + } else { + paint_underlines( + pos, + painter, + galley, + galley.layout_from_cursor(preedit_range.start), + galley.layout_from_cursor(preedit_range.end), + inactive_underline_stroke, + ); + } + + if let Some(relative_active_range) = relative_active_range + && relative_active_range.is_empty() + { let active_cursor = preedit_range.start + relative_active_range.start.index; let cursor_rect = cursor_rect(galley, &active_cursor, row_height); @@ -174,15 +207,6 @@ pub fn paint_ime_preedit_text_visuals( cursor_rect.translate(pos.to_vec2()), time_since_last_interaction, ); - } else { - paint_underlines( - pos, - painter, - galley, - galley.layout_from_cursor(preedit_range.start + relative_active_range.start.index), - galley.layout_from_cursor(preedit_range.start + relative_active_range.end.index), - inactive_underline_stroke, - ); } }