From 13ce6aa6d5454d9d8403d1eaa230b9370ea28688 Mon Sep 17 00:00:00 2001 From: rhysd Date: Wed, 15 Nov 2023 01:57:48 +0900 Subject: [PATCH] fix selected text is not deleted on paste --- src/textarea.rs | 1 + tests/textarea.rs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/textarea.rs b/src/textarea.rs index 0f260a9..0579565 100644 --- a/src/textarea.rs +++ b/src/textarea.rs @@ -1276,6 +1276,7 @@ impl<'a> TextArea<'a> { /// assert_eq!(textarea.lines(), [" bbb cccaaa"]); /// ``` pub fn paste(&mut self) -> bool { + self.delete_selection(false); match self.yank.clone() { YankText::Piece(s) => self.insert_piece(s), YankText::Chunk(c) => self.insert_chunk(c), diff --git a/tests/textarea.rs b/tests/textarea.rs index e18f60f..701bbf2 100644 --- a/tests/textarea.rs +++ b/tests/textarea.rs @@ -1432,6 +1432,27 @@ fn test_select_all() { assert_undo_redo((2, 3), &["aaa", "bbb", "ccc"], &[""], &mut t, ""); } +#[test] +fn test_paste_while_selection() { + let mut t = TextArea::from(["ab", "cd"]); + t.move_cursor(CursorMove::Jump(0, 1)); + t.start_selection(); + t.move_cursor(CursorMove::Jump(1, 1)); + t.set_yank_text("x\ny"); + assert!(t.paste()); + assert_eq!(t.lines(), ["ax", "yd"]); + assert_eq!(t.cursor(), (1, 1)); + assert!(!t.is_selecting()); + + let mut t = TextArea::from(["ab", "cd"]); + t.select_all(); + t.set_yank_text("xy\nzw"); + assert!(t.paste()); + assert_eq!(t.lines(), ["xy", "zw"]); + assert_eq!(t.cursor(), (1, 2)); + assert!(!t.is_selecting()); +} + struct DeleteTester(&'static [&'static str], fn(&mut TextArea) -> bool); impl DeleteTester { fn test(&self, before: (usize, usize), after: (usize, usize, &[&str], &str)) {