From a46c474a000315197145d20d4216ec3393dcadfa Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Wed, 10 Mar 2021 13:48:21 -0500 Subject: [PATCH] Basic insertion and deletion --- src/document.rs | 21 +++++++++++++++++++++ src/editor.rs | 11 +++++++++++ src/row.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/document.rs b/src/document.rs index 69cfde0..391895d 100644 --- a/src/document.rs +++ b/src/document.rs @@ -1,3 +1,4 @@ +use crate::Position; use crate::Row; use std::fs; @@ -34,4 +35,24 @@ impl Document { pub fn len(&self) -> usize { self.rows.len() } + + pub fn insert(&mut self, at: &Position, c: char) { + if at.y == self.len() { + let mut row = Row::default(); + row.insert(0, c); + self.rows.push(row); + } else if at.y < self.len() { + let row = self.rows.get_mut(at.y).unwrap(); + row.insert(at.x, c); + } + } + + pub fn delete(&mut self, at: &Position) { + if at.y >= self.len() { + return + } + + let row = self.rows.get_mut(at.y).unwrap(); + row.delete(at.x); + } } \ No newline at end of file diff --git a/src/editor.rs b/src/editor.rs index 9559085..4918507 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -145,6 +145,17 @@ impl Editor { let pressed_key = Terminal::read_key()?; match pressed_key { Key::Ctrl('q') => self.should_quit = true, + Key::Char(c) => { + self.document.insert(&self.cursor_position, c); + self.move_cursor(Key::Right); + }, + Key::Delete => self.document.delete(&self.cursor_position), + Key::Backspace => { + if self.cursor_position.x > 0 || self.cursor_position.y > 0 { + self.move_cursor(Key::Left); + self.document.delete(&self.cursor_position); + } + } Key::Up | Key::Down | Key::Left diff --git a/src/row.rs b/src/row.rs index ad0de0e..e089122 100644 --- a/src/row.rs +++ b/src/row.rs @@ -1,6 +1,7 @@ use std::cmp; use unicode_segmentation::UnicodeSegmentation; +#[derive(Default)] pub struct Row { string: String, len: usize, @@ -51,4 +52,35 @@ impl Row { fn update_len(&mut self) { self.len = self.string[..].graphemes(true).count(); } + + pub fn insert(&mut self, at: usize, c: char) { + if at >= self.len() { + self.string.push(c); + } else { + let mut result: String = self.string[..].graphemes(true).take(at).collect(); + let remainder: String = self.string[..].graphemes(true).skip(at).collect(); + + result.push(c); + result.push_str(&remainder); + + self.string = result; + } + + self.update_len(); + } + + pub fn delete(&mut self, at: usize) { + if at >= self.len() { + return + } else { + let mut result: String = self.string[..].graphemes(true).take(at).collect(); + let remainder: String = self.string[..].graphemes(true).skip(at + 1).collect(); + + result.push_str(&remainder); + + self.string = result; + } + + self.update_len(); + } } \ No newline at end of file