From deb40f522abe16ab405e032b4899f3640f23c699 Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 1 Jan 2024 12:26:38 +0100 Subject: [PATCH] Fix panic when moving over multicharacter graphemes (#236) --- src/views/text_input.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/views/text_input.rs b/src/views/text_input.rs index 0ce99b75..77ce84d7 100644 --- a/src/views/text_input.rs +++ b/src/views/text_input.rs @@ -204,18 +204,26 @@ impl TextInput { fn move_cursor(&mut self, move_kind: Movement, direction: Direction) -> bool { match (move_kind, direction) { (Movement::Glyph, Direction::Left) => { - if self.cursor_glyph_idx >= 1 { - self.cursor_glyph_idx -= 1; - return true; + let untracked_buffer = self.buffer.get_untracked(); + let mut grapheme_iter = untracked_buffer[..self.cursor_glyph_idx].graphemes(true); + match grapheme_iter.next_back() { + None => false, + Some(prev_character) => { + self.cursor_glyph_idx -= prev_character.len(); + true + } } - false } (Movement::Glyph, Direction::Right) => { - if self.cursor_glyph_idx < self.buffer.with_untracked(|buff| buff.len()) { - self.cursor_glyph_idx += 1; - return true; + let untracked_buffer = self.buffer.get_untracked(); + let mut grapheme_iter = untracked_buffer[self.cursor_glyph_idx..].graphemes(true); + match grapheme_iter.next() { + None => false, + Some(next_character) => { + self.cursor_glyph_idx += next_character.len(); + true + } } - false } (Movement::Line, Direction::Right) => { if self.cursor_glyph_idx < self.buffer.with_untracked(|buff| buff.len()) {