From 9fe465cc4a95c499d852772e651dbbf0fba3b32a Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Thu, 20 May 2021 12:26:34 -0500 Subject: [PATCH] Various fixes. * Only dispatch `SelectionChanged` if the selection actually changes. * Fix missing focus events. --- egui/src/widgets/text_edit.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/egui/src/widgets/text_edit.rs b/egui/src/widgets/text_edit.rs index 0ebe92c4..b3cf262c 100644 --- a/egui/src/widgets/text_edit.rs +++ b/egui/src/widgets/text_edit.rs @@ -449,6 +449,7 @@ impl<'t> TextEdit<'t> { } let mut text_cursor = None; + let prev_text_cursor = state.cursorp; if ui.memory().has_focus(id) && enabled { ui.memory().lock_focus(id, lock_focus); @@ -660,9 +661,19 @@ impl<'t> TextEdit<'t> { ui.memory().id_data.insert(id, state); + let selection_changed = if let (Some(text_cursor), Some(prev_text_cursor)) = + (text_cursor, prev_text_cursor) + { + text_cursor.primary.ccursor.index != prev_text_cursor.primary.ccursor.index + || text_cursor.secondary.ccursor.index != prev_text_cursor.secondary.ccursor.index + } else { + false + }; + if response.changed { response.widget_info(|| WidgetInfo::text_edit(&*prev_text, &*text)); - } else if let Some(text_cursor) = text_cursor { + } else if selection_changed { + let text_cursor = text_cursor.unwrap(); let char_range = text_cursor.primary.ccursor.index..=text_cursor.secondary.ccursor.index; let info = WidgetInfo::text_selection_changed(char_range, &*text); @@ -671,6 +682,8 @@ impl<'t> TextEdit<'t> { .output() .events .push(OutputEvent::TextSelectionChanged(info)); + } else { + response.widget_info(|| WidgetInfo::text_edit(&*prev_text, &*text)); } response }