From 225d2b506dce4a221464f0f4c25cc330d5dcaf59 Mon Sep 17 00:00:00 2001 From: Simon Werner Date: Tue, 11 Jan 2022 11:12:30 +1300 Subject: [PATCH] Split `Event::Text` into `Text` and `Paste` (#1058) * Split `Event::Text` into `Text` and `Paste` * Added explicit Event::Paste change See #1043 * Link to PR in changelog (not the issue) Co-authored-by: Emil Ernerfeldt --- CHANGELOG.md | 1 + egui-winit/src/lib.rs | 2 +- egui/src/data/input.rs | 4 +++- egui/src/widgets/text_edit/builder.rs | 9 +++++++++ egui_web/src/lib.rs | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be641726d73..76400471bd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ NOTE: [`epaint`](epaint/CHANGELOG.md), [`eframe`](eframe/CHANGELOG.md), [`egui_w ### Changed 🔧 * Renamed `Ui::visible` to `Ui::is_visible`. +* Split `Event::Text` into `Event::Text` and `Event::Paste` ([#1058](https://github.com/emilk/egui/pull/1058)). ### Fixed 🐛 * Context menu now respects the theme ([#1043](https://github.com/emilk/egui/pull/1043)) diff --git a/egui-winit/src/lib.rs b/egui-winit/src/lib.rs index 1fa2d22db8b..8bfdcc76d1e 100644 --- a/egui-winit/src/lib.rs +++ b/egui-winit/src/lib.rs @@ -484,7 +484,7 @@ impl State { if let Some(contents) = self.clipboard.get() { self.egui_input .events - .push(egui::Event::Text(contents.replace("\r\n", "\n"))); + .push(egui::Event::Paste(contents.replace("\r\n", "\n"))); } } } diff --git a/egui/src/data/input.rs b/egui/src/data/input.rs index 27a07a0ca82..a66c557ea3a 100644 --- a/egui/src/data/input.rs +++ b/egui/src/data/input.rs @@ -148,7 +148,9 @@ pub enum Event { Copy, /// The integration detected a "cut" event (e.g. Cmd+X). Cut, - /// Text input, e.g. via keyboard or paste action. + /// The integration detected a "paste" event (e.g. Cmd+V). + Paste(String), + /// Text input, e.g. via keyboard. /// /// When the user presses enter/return, do not send a `Text` (just [`Key::Enter`]). Text(String), diff --git a/egui/src/widgets/text_edit/builder.rs b/egui/src/widgets/text_edit/builder.rs index 95d911ab46a..c82b46f64cf 100644 --- a/egui/src/widgets/text_edit/builder.rs +++ b/egui/src/widgets/text_edit/builder.rs @@ -684,6 +684,15 @@ fn events( Some(CCursorRange::one(delete_selected(text, &cursor_range))) } } + Event::Paste(text_to_insert) => { + if !text_to_insert.is_empty() { + let mut ccursor = delete_selected(text, &cursor_range); + insert_text(&mut ccursor, text, text_to_insert); + Some(CCursorRange::one(ccursor)) + } else { + None + } + } Event::Text(text_to_insert) => { // Newlines are handled by `Key::Enter`. if !text_to_insert.is_empty() && text_to_insert != "\n" && text_to_insert != "\r" { diff --git a/egui_web/src/lib.rs b/egui_web/src/lib.rs index 36ea3f2472f..c953cfa2d9e 100644 --- a/egui_web/src/lib.rs +++ b/egui_web/src/lib.rs @@ -622,7 +622,7 @@ fn install_document_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { .input .raw .events - .push(egui::Event::Text(text.replace("\r\n", "\n"))); + .push(egui::Event::Paste(text.replace("\r\n", "\n"))); runner_lock.needs_repaint.set_true(); event.stop_propagation(); event.prevent_default();