Add some basic editing facilities

This commit is contained in:
Savanni D'Gerinel 2024-05-06 01:53:27 -04:00
parent 54b34d81ec
commit a2146a0168
2 changed files with 48 additions and 0 deletions

View File

@ -57,6 +57,18 @@ impl AppState {
KeyCode::Left => { KeyCode::Left => {
self.cursor_left(); self.cursor_left();
} }
KeyCode::Backspace => {
self.contents.backspace(&mut self.cursor);
}
KeyCode::Delete => {
self.contents.delete_at(&mut self.cursor);
}
KeyCode::Enter => {
self.contents.new_line(&mut self.cursor);
}
KeyCode::Char(c) => {
self.contents.insert_at(&mut self.cursor, c);
}
_ => {} _ => {}
}; };
} }

View File

@ -1,3 +1,7 @@
// TODO: I'm increasingly feeling that cursors are per-document, not per-application. So I think I
// want to move the cursor into here, and then rendering requires asking for the cursor for the
// current document.
#[derive(Default)] #[derive(Default)]
pub struct Document { pub struct Document {
rows: Vec<String> rows: Vec<String>
@ -24,6 +28,38 @@ impl Document {
pub fn row_count(&self) -> usize { pub fn row_count(&self) -> usize {
self.rows.len() self.rows.len()
} }
pub fn insert_at(&mut self, cursor: &mut Cursor, c: char){
let (row, column) = cursor.addr();
self.rows[row].insert(column, c);
cursor.cursor_right(self);
}
pub fn backspace(&mut self, cursor: &mut Cursor) {
let (row, column) = cursor.addr();
if cursor.column > 0 {
let _ = self.rows[row].remove(column - 1);
cursor.cursor_left();
}
}
pub fn delete_at(&mut self, cursor: &mut Cursor) {
let (row, column) = cursor.addr();
if cursor.column < self.rows[row].len() {
self.rows[row].remove(column);
cursor.correct_columns(self);
}
}
pub fn new_line(&mut self, cursor: &mut Cursor) {
// when doing a newline, take everything to the right of the cursor from the current line
// and move it to the next line.
let (row, _) = cursor.addr();
self.rows.insert(row, String::new());
cursor.cursor_down(&self);
}
} }
#[derive(Default)] #[derive(Default)]