From 2697d412640c3d48fcd9186cc242733c96d84a72 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Wed, 10 Mar 2021 14:37:58 -0500 Subject: [PATCH] Row splitting and joining --- src/document.rs | 32 +++++++++++++++++++++++++++++--- src/row.rs | 15 +++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/document.rs b/src/document.rs index 391895d..773c474 100644 --- a/src/document.rs +++ b/src/document.rs @@ -37,6 +37,11 @@ impl Document { } pub fn insert(&mut self, at: &Position, c: char) { + if c == '\n' { + self.insert_newline(at); + return; + } + if at.y == self.len() { let mut row = Row::default(); row.insert(0, c); @@ -48,11 +53,32 @@ impl Document { } pub fn delete(&mut self, at: &Position) { - if at.y >= self.len() { + let len = self.len(); + if at.y >= len { return } - let row = self.rows.get_mut(at.y).unwrap(); - row.delete(at.x); + if at.x == self.rows.get_mut(at.y).unwrap().len() && at.y < len - 1 { + let next_row = self.rows.remove(at.y + 1); + let row = self.rows.get_mut(at.y).unwrap(); + row.append(&next_row); + } else { + let row = self.rows.get_mut(at.y).unwrap(); + row.delete(at.x); + } + } + + fn insert_newline(&mut self, at: &Position) { + if at.y > self.len() { + return; + } + + if at.y == self.len() { + self.rows.push(Row::default()); + return; + } + + let new_row = self.rows.get_mut(at.y).unwrap().split(at.x); + self.rows.insert(at.y + 1, new_row); } } \ No newline at end of file diff --git a/src/row.rs b/src/row.rs index e089122..b13166e 100644 --- a/src/row.rs +++ b/src/row.rs @@ -83,4 +83,19 @@ impl Row { self.update_len(); } + + pub fn append(&mut self, new: &Self) { + self.string = format!("{}{}", self.string, new.string); + self.update_len(); + } + + pub fn split(&mut self, at: usize) -> Self { + let beginning: String = self.string[..].graphemes(true).take(at).collect(); + let remainder: String = self.string[..].graphemes(true).skip(at).collect(); + + self.string = beginning; + self.update_len(); + + Self::from(&remainder[..]) + } } \ No newline at end of file