diff --git a/src/history.rs b/src/history.rs index a58ed03..540cb5e 100644 --- a/src/history.rs +++ b/src/history.rs @@ -8,8 +8,8 @@ pub enum EditKind { DeleteNewline(usize), InsertStr(String, usize), DeleteStr(String, usize), - InsertChunk(Vec, usize), - DeleteChunk(Vec, usize), + InsertChunk(Vec, usize, usize), + DeleteChunk(Vec, usize, usize), } impl EditKind { @@ -40,8 +40,9 @@ impl EditKind { let end = *i + s.len(); lines[row].replace_range(*i..end, ""); } - EditKind::InsertChunk(c, i) => { + EditKind::InsertChunk(c, row, i) => { debug_assert!(c.len() > 1, "Chunk size must be > 1: {:?}", c); + let row = *row; // Handle first line of chunk let first_line = &mut lines[row]; @@ -55,8 +56,9 @@ impl EditKind { // Handle last line of chunk lines.splice(row + 1..row + 1, c[1..c.len() - 1].iter().cloned()); } - EditKind::DeleteChunk(c, i) => { + EditKind::DeleteChunk(c, row, i) => { debug_assert!(c.len() > 1, "Chunk size must be > 1: {:?}", c); + let row = *row; lines[row].truncate(*i); let mut last_line = lines.drain(row + 1..row + c.len()).last().unwrap(); @@ -75,8 +77,8 @@ impl EditKind { DeleteNewline(i) => InsertNewline(i), InsertStr(s, i) => DeleteStr(s, i), DeleteStr(s, i) => InsertStr(s, i), - InsertChunk(c, i) => DeleteChunk(c, i), - DeleteChunk(c, i) => InsertChunk(c, i), + InsertChunk(c, r, i) => DeleteChunk(c, r, i), + DeleteChunk(c, r, i) => InsertChunk(c, r, i), } } } @@ -530,7 +532,7 @@ mod tests { let mut lines: Vec<_> = before.iter().map(|s| s.to_string()).collect(); let chunk: Vec<_> = input.iter().map(|s| s.to_string()).collect(); - let edit = EditKind::InsertChunk(chunk.clone(), offset); + let edit = EditKind::InsertChunk(chunk.clone(), row, offset); edit.apply(row, &mut lines); assert_eq!( &lines, expected, @@ -538,7 +540,7 @@ mod tests { before, pos, input, ); - let edit = EditKind::DeleteChunk(chunk, offset); + let edit = EditKind::DeleteChunk(chunk, row, offset); edit.apply(row, &mut lines); assert_eq!( &lines, &before, diff --git a/src/textarea.rs b/src/textarea.rs index 8270de5..3f7914d 100644 --- a/src/textarea.rs +++ b/src/textarea.rs @@ -676,7 +676,7 @@ impl<'a> TextArea<'a> { chunk[chunk.len() - 1].chars().count(), ); - let edit = EditKind::InsertChunk(chunk, i); + let edit = EditKind::InsertChunk(chunk, row, i); edit.apply(row, &mut self.lines); self.push_history(edit, (row, col)); @@ -794,7 +794,7 @@ impl<'a> TextArea<'a> { let edit = if deleted.len() == 1 { EditKind::DeleteStr(deleted.remove(0), first_start) } else { - EditKind::DeleteChunk(deleted, first_start) + EditKind::DeleteChunk(deleted, row, first_start) }; self.push_history(edit, self.cursor);