From: Simon Tatham Date: Sun, 31 Dec 2023 20:21:28 +0000 (+0000) Subject: Enough editing keys for a single-line editor. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=749d9e1f77bce3e9dc67915fec65b3f106997403;p=mastodonochrome.git Enough editing keys for a single-line editor. --- 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; + } }