Skip to content

Commit 614b21b

Browse files
fix: code cell outlines
1 parent 3a1800b commit 614b21b

File tree

2 files changed

+67
-25
lines changed

2 files changed

+67
-25
lines changed

quadratic-core/src/controller/active_transactions/pending_transaction.rs

+47
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,53 @@ impl PendingTransaction {
345345
offsets_modified.insert((None, Some(row)), size.unwrap_or(0.0));
346346
}
347347
}
348+
349+
pub fn add_updates_from_transaction(&mut self, transaction: PendingTransaction) {
350+
self.generate_thumbnail |= transaction.generate_thumbnail;
351+
352+
self.validations.extend(transaction.validations);
353+
354+
for (sheet_id, dirty_hashes) in transaction.dirty_hashes {
355+
self.dirty_hashes
356+
.entry(sheet_id)
357+
.or_default()
358+
.extend(dirty_hashes);
359+
}
360+
361+
self.sheet_borders.extend(transaction.sheet_borders);
362+
363+
for (sheet_id, code_cells) in transaction.code_cells {
364+
self.code_cells
365+
.entry(sheet_id)
366+
.or_default()
367+
.extend(code_cells);
368+
}
369+
370+
for (sheet_id, html_cells) in transaction.html_cells {
371+
self.html_cells
372+
.entry(sheet_id)
373+
.or_default()
374+
.extend(html_cells);
375+
}
376+
377+
for (sheet_id, image_cells) in transaction.image_cells {
378+
self.image_cells
379+
.entry(sheet_id)
380+
.or_default()
381+
.extend(image_cells);
382+
}
383+
384+
self.fill_cells.extend(transaction.fill_cells);
385+
386+
self.sheet_info.extend(transaction.sheet_info);
387+
388+
for (sheet_id, offsets_modified) in transaction.offsets_modified {
389+
self.offsets_modified
390+
.entry(sheet_id)
391+
.or_default()
392+
.extend(offsets_modified);
393+
}
394+
}
348395
}
349396

350397
#[cfg(test)]

quadratic-core/src/controller/execution/receive_multiplayer.rs

+20-25
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl GridController {
3232
}
3333

3434
/// Rolls back unsaved transactions to apply earlier transactions received from the server.
35-
fn rollback_unsaved_transactions(&mut self) {
35+
fn rollback_unsaved_transactions(&mut self, transaction: &mut PendingTransaction) {
3636
if self.transactions.unsaved_transactions.is_empty() {
3737
return;
3838
}
@@ -50,10 +50,11 @@ impl GridController {
5050
};
5151
self.start_transaction(&mut rollback);
5252
rollback.send_transaction();
53+
transaction.add_updates_from_transaction(rollback);
5354
}
5455

5556
/// Reapplies the rolled-back unsaved transactions after adding earlier transactions.
56-
fn reapply_unsaved_transactions(&mut self) {
57+
fn reapply_unsaved_transactions(&mut self, transaction: &mut PendingTransaction) {
5758
if self.transactions.unsaved_transactions.is_empty() {
5859
return;
5960
}
@@ -74,6 +75,7 @@ impl GridController {
7475
};
7576
self.start_transaction(&mut reapply);
7677
reapply.send_transaction();
78+
transaction.add_updates_from_transaction(reapply);
7779
}
7880

7981
/// Used by the server to apply transactions. Since the server owns the sequence_num,
@@ -123,7 +125,11 @@ impl GridController {
123125

124126
/// Check the out_of_order_transactions to see if they are next in order. If so, we remove them from
125127
/// out_of_order_transactions and apply their operations.
126-
fn apply_out_of_order_transactions(&mut self, mut sequence_num: u64) {
128+
fn apply_out_of_order_transactions(
129+
&mut self,
130+
transaction: &mut PendingTransaction,
131+
mut sequence_num: u64,
132+
) {
127133
// nothing to do here
128134
if self.transactions.out_of_order_transactions.is_empty() {
129135
self.transactions.last_sequence_num = sequence_num;
@@ -154,7 +160,7 @@ impl GridController {
154160
};
155161
self.start_transaction(&mut out_of_order_transaction);
156162
out_of_order_transaction.send_transaction();
157-
163+
transaction.add_updates_from_transaction(out_of_order_transaction);
158164
self.transactions.last_sequence_num = sequence_num;
159165
}
160166

@@ -176,23 +182,23 @@ impl GridController {
176182
if index == 0 {
177183
self.transactions.unsaved_transactions.remove(index);
178184
self.mark_transaction_sent(transaction.id);
179-
self.apply_out_of_order_transactions(sequence_num);
185+
self.apply_out_of_order_transactions(transaction, sequence_num);
180186
}
181187
// otherwise we need to rollback all transaction and properly apply it
182188
else {
183-
self.rollback_unsaved_transactions();
189+
self.rollback_unsaved_transactions(transaction);
184190
self.transactions.unsaved_transactions.remove(index);
185191
self.mark_transaction_sent(transaction.id);
186192
self.start_transaction(transaction);
187-
self.apply_out_of_order_transactions(sequence_num);
188-
self.reapply_unsaved_transactions();
193+
self.apply_out_of_order_transactions(transaction, sequence_num);
194+
self.reapply_unsaved_transactions(transaction);
189195
}
190196
} else {
191197
// If the transaction is not one of ours, then we just apply the transaction after rolling back any unsaved transactions
192-
self.rollback_unsaved_transactions();
198+
self.rollback_unsaved_transactions(transaction);
193199
self.start_transaction(transaction);
194-
self.apply_out_of_order_transactions(sequence_num);
195-
self.reapply_unsaved_transactions();
200+
self.apply_out_of_order_transactions(transaction, sequence_num);
201+
self.reapply_unsaved_transactions(transaction);
196202

197203
// We do not need to render a thumbnail unless we have outstanding unsaved transactions.
198204
// Note: this may result in a thumbnail being unnecessarily generated by a user who's
@@ -228,7 +234,7 @@ impl GridController {
228234
transaction_type: TransactionType::Multiplayer,
229235
..Default::default()
230236
};
231-
self.rollback_unsaved_transactions();
237+
self.rollback_unsaved_transactions(&mut results);
232238

233239
// combine all transaction into one transaction
234240
transactions.into_iter().for_each(|t| {
@@ -245,25 +251,14 @@ impl GridController {
245251
};
246252

247253
self.client_apply_transaction(&mut transaction, t.sequence_num);
248-
results.generate_thumbnail |= transaction.generate_thumbnail;
249-
results.validations.extend(transaction.validations);
250-
results.dirty_hashes.extend(transaction.dirty_hashes);
251-
results.sheet_borders.extend(transaction.sheet_borders);
252-
results.code_cells.extend(transaction.code_cells);
253-
results.html_cells.extend(transaction.html_cells);
254-
results.image_cells.extend(transaction.image_cells);
255-
results.fill_cells.extend(transaction.fill_cells);
256-
results.sheet_info.extend(transaction.sheet_info);
257-
results
258-
.offsets_modified
259-
.extend(transaction.offsets_modified);
254+
results.add_updates_from_transaction(transaction);
260255
} else {
261256
dbgjs!(
262257
"Unable to decompress and deserialize operations in received_transactions()"
263258
);
264259
}
265260
});
266-
self.reapply_unsaved_transactions();
261+
self.reapply_unsaved_transactions(&mut results);
267262
self.finalize_transaction(results);
268263
}
269264

0 commit comments

Comments
 (0)