Push transaction into multi-buffer to allow undoing of a code action

This commit is contained in:
Antonio Scandurra 2022-02-10 09:55:03 +01:00
parent dd223f93ec
commit d1f1563278
2 changed files with 39 additions and 1 deletions

View file

@ -63,6 +63,7 @@ struct Transaction {
buffer_transactions: HashSet<(usize, text::TransactionId)>,
first_edit_at: Instant,
last_edit_at: Instant,
suppress_grouping: bool,
}
pub trait ToOffset: 'static + fmt::Debug {
@ -442,6 +443,7 @@ impl MultiBuffer {
}
pub fn finalize_last_transaction(&mut self, cx: &mut ModelContext<Self>) {
self.history.finalize_last_transaction();
for BufferState { buffer, .. } in self.buffers.borrow().values() {
buffer.update(cx, |buffer, _| {
buffer.finalize_last_transaction();
@ -449,6 +451,15 @@ impl MultiBuffer {
}
}
pub fn push_transaction<'a, T>(&mut self, buffer_transactions: T)
where
T: IntoIterator<Item = (&'a ModelHandle<Buffer>, &'a language::Transaction)>,
{
self.history
.push_transaction(buffer_transactions, Instant::now());
self.history.finalize_last_transaction();
}
pub fn set_active_selections(
&mut self,
selections: &[Selection<Anchor>],
@ -2205,6 +2216,7 @@ impl History {
buffer_transactions: Default::default(),
first_edit_at: now,
last_edit_at: now,
suppress_grouping: false,
});
Some(id)
} else {
@ -2234,6 +2246,29 @@ impl History {
}
}
fn push_transaction<'a, T>(&mut self, buffer_transactions: T, now: Instant)
where
T: IntoIterator<Item = (&'a ModelHandle<Buffer>, &'a language::Transaction)>,
{
assert_eq!(self.transaction_depth, 0);
self.undo_stack.push(Transaction {
id: self.next_transaction_id.tick(),
buffer_transactions: buffer_transactions
.into_iter()
.map(|(buffer, transaction)| (buffer.id(), transaction.id))
.collect(),
first_edit_at: now,
last_edit_at: now,
suppress_grouping: false,
});
}
fn finalize_last_transaction(&mut self) {
if let Some(transaction) = self.undo_stack.last_mut() {
transaction.suppress_grouping = true;
}
}
fn pop_undo(&mut self) -> Option<&Transaction> {
assert_eq!(self.transaction_depth, 0);
if let Some(transaction) = self.undo_stack.pop() {
@ -2260,7 +2295,9 @@ impl History {
if let Some(mut transaction) = transactions.next_back() {
while let Some(prev_transaction) = transactions.next_back() {
if transaction.first_edit_at - prev_transaction.last_edit_at <= self.group_interval
if !prev_transaction.suppress_grouping
&& transaction.first_edit_at - prev_transaction.last_edit_at
<= self.group_interval
{
transaction = prev_transaction;
new_len -= 1;