From 749d9e1f77bce3e9dc67915fec65b3f106997403 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sun, 31 Dec 2023 20:21:28 +0000 Subject: [PATCH] Enough editing keys for a single-line editor. --- src/editor.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/src/editor.rs b/src/editor.rs index 4be69e1..bc85f2c 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -114,6 +114,36 @@ impl EditorCore { self.point += self.paste_buffer.len(); } + fn beginning_of_buffer(&mut self) { + self.point = 0; + } + + fn end_of_buffer(&mut self) { + self.point = self.text.len(); + } + + fn cut(&mut self, start: usize, end: usize) { + assert!(self.is_char_boundary(start)); + assert!(self.is_char_boundary(end)); + assert!(end >= start); + + if end == start { + return; + } + + let new_point = if self.point <= start { + self.point + } else if self.point <= end { + start + } else { + self.point + start - end + }; + + self.paste_buffer = self.text[start..end].to_owned(); + self.text = self.text[..start].to_owned() + &self.text[end..]; + self.point = new_point; + } + fn handle_keypress(&mut self, key: OurKey) { match key { Left | Ctrl('B') => { self.backward(); }, @@ -221,8 +251,44 @@ fn test_insert() { assert_eq!(&ec.text, "Besźel"); assert_eq!(ec.point, 6); + // But then moving backwards one character goes back over the + // combining char and the printing one before it + assert_eq!(ec.backward(), true); + assert_eq!(ec.point, 3); + ec.paste_buffer = "PASTE".to_owned(); ec.paste(); - assert_eq!(&ec.text, "BesźPASTEel"); - assert_eq!(ec.point, 11); + assert_eq!(&ec.text, "BesPASTEźel"); + assert_eq!(ec.point, 8); +} + +pub struct SingleLineEditor { + core: EditorCore, +} + +impl SingleLineEditor { + pub fn new() -> Self { + SingleLineEditor { + core: EditorCore { + text: "".to_owned(), + point: 0, + paste_buffer: "".to_owned(), + }, + } + } + + fn cut_to_end(&mut self) { + self.core.cut(self.core.point, self.core.text.len()); + } + + pub fn handle_keypress(&mut self, key: OurKey) -> bool { + match key { + Ctrl('A') => { self.core.beginning_of_buffer(); }, + Ctrl('E') => { self.core.end_of_buffer(); }, + Ctrl('K') => { self.cut_to_end(); }, + Return => { return true; }, + _ => { self.core.handle_keypress(key); } + } + return false; + } } -- 2.30.2