Get undo/redo tests passing

This commit is contained in:
Max Brunsfeld 2021-06-02 15:15:37 -07:00
parent 2c8d5973f3
commit bef93b319c

View file

@ -1346,44 +1346,55 @@ impl Buffer {
}
fn apply_undo(&mut self, undo: UndoOperation) -> Result<()> {
self.undo_map.insert(undo);
let edit = &self.history.ops[&undo.edit_id];
let version = Some(edit.version.clone());
let mut old_fragments = self.fragments.cursor::<VersionedOffset, VersionedOffset>();
old_fragments.seek(&VersionedOffset::Offset(0), SeekBias::Left, &version);
let mut new_fragments = SumTree::new();
let mut new_ropes =
RopeBuilder::new(self.visible_text.cursor(0), self.deleted_text.cursor(0));
self.undo_map.insert(undo);
let edit = &self.history.ops[&undo.edit_id];
let mut version_after_edit = edit.version.clone();
version_after_edit.observe(edit.id);
let version = Some(edit.version.clone());
for range in &edit.ranges {
let preceding_fragments = old_fragments.slice(
&VersionedOffset::Offset(range.start),
SeekBias::Right,
&version,
);
new_ropes.push_tree(preceding_fragments.summary().text);
new_fragments.push_tree(preceding_fragments, &None);
let mut end_offset = old_fragments.end(&version).offset();
while old_fragments.end(&version).offset() < range.end {
if end_offset < range.start {
let preceding_fragments = old_fragments.slice(
&VersionedOffset::Offset(range.start),
SeekBias::Left,
&version,
);
new_ropes.push_tree(preceding_fragments.summary().text);
new_fragments.push_tree(preceding_fragments, &None);
}
while end_offset <= range.end {
if let Some(fragment) = old_fragments.item() {
let mut fragment = fragment.clone();
let fragment_was_visible = fragment.visible;
if edit.version.observed(fragment.insertion_id) {
if version_after_edit.observed(fragment.insertion_id) {
fragment.visible = fragment.is_visible(&self.undo_map);
fragment.max_undos.observe(undo.id);
}
new_ropes.push_fragment(&fragment, fragment_was_visible);
new_fragments.push(fragment, &None);
old_fragments.next(&version);
end_offset = old_fragments.end(&version).offset();
// Skip over any fragments that were not present when the edit occurred.
let newer_fragments = old_fragments.slice(
&old_fragments.end(&version),
SeekBias::Right,
&version,
);
new_ropes.push_tree(newer_fragments.summary().text);
new_fragments.push_tree(newer_fragments, &None);
// let newer_fragments = old_fragments.slice(
// &old_fragments.end(&version),
// SeekBias::Right,
// &version,
// );
// new_ropes.push_tree(newer_fragments.summary().text);
// new_fragments.push_tree(newer_fragments, &None);
} else {
break;
}
@ -1399,73 +1410,6 @@ impl Buffer {
self.fragments = new_fragments;
self.visible_text = visible_text;
self.deleted_text = deleted_text;
// if edit.start_id == edit.end_id && edit.start_offset == edit.end_offset {
// let splits = &self.insertion_splits[&undo.edit_id];
// let mut insertion_splits = splits.cursor::<(), ()>().map(|s| &s.fragment_id).peekable();
// let first_split_id = insertion_splits.next().unwrap();
// new_fragments =
// fragments_cursor.slice(&FragmentIdRef::new(first_split_id), SeekBias::Left, &None);
// new_ropes.push_tree(new_fragments.summary().text);
// loop {
// let mut fragment = fragments_cursor.item().unwrap().clone();
// let was_visible = fragment.visible;
// fragment.visible = fragment.is_visible(&self.undo_map);
// fragment.max_undos.observe(undo.id);
// new_ropes.push_fragment(&fragment, was_visible);
// new_fragments.push(fragment.clone(), &None);
// fragments_cursor.next(&None);
// if let Some(split_id) = insertion_splits.next() {
// let slice = fragments_cursor.slice(
// &FragmentIdRef::new(split_id),
// SeekBias::Left,
// &None,
// );
// new_ropes.push_tree(slice.summary().text);
// new_fragments.push_tree(slice, &None);
// } else {
// break;
// }
// }
// } else {
// new_fragments = fragments_cursor.slice(
// &FragmentIdRef::new(&edit.),
// SeekBias::Left,
// &None,
// );
// new_ropes.push_tree(new_fragments.summary().text);
// while let Some(fragment) = fragments_cursor.item() {
// if fragment.id > end_fragment_id {
// break;
// } else {
// let mut fragment = fragment.clone();
// let fragment_was_visible = fragment.visible;
// if edit.version_in_range.observed(fragment.insertion.id)
// || fragment.insertion.id == undo.edit_id
// {
// fragment.visible = fragment.is_visible(&self.undo_map);
// fragment.max_undos.observe(undo.id);
// }
// new_ropes.push_fragment(&fragment, fragment_was_visible);
// new_fragments.push(fragment, &None);
// fragments_cursor.next(&None);
// }
// }
// }
// new_fragments.push_tree(fragments_cursor.suffix(&None), &None);
// let (visible_text, deleted_text) = new_ropes.finish();
// drop(fragments_cursor);
// self.fragments = new_fragments;
// self.visible_text = visible_text;
// self.deleted_text = deleted_text;
Ok(())
}
@ -2259,8 +2203,6 @@ impl<'a> sum_tree::Dimension<'a, FragmentSummary> for VersionedOffset {
{
*self = Self::InvalidVersion;
}
} else {
unreachable!();
}
}
}