Fix the editor to also crop the selection

This commit is contained in:
Eevee (Evelyn Woods) 2024-05-06 23:12:35 -06:00
parent 214eaad1f5
commit 246e56187c
2 changed files with 28 additions and 6 deletions

View File

@ -197,7 +197,7 @@ export class EditorLevelMetaOverlay extends DialogOverlay {
let size_x = Math.max(1, Math.min(100, parseInt(els.size_x.value, 10))); let size_x = Math.max(1, Math.min(100, parseInt(els.size_x.value, 10)));
let size_y = Math.max(1, Math.min(100, parseInt(els.size_y.value, 10))); let size_y = Math.max(1, Math.min(100, parseInt(els.size_y.value, 10)));
if (size_x !== stored_level.size_x || size_y !== stored_level.size_y) { if (size_x !== stored_level.size_x || size_y !== stored_level.size_y) {
this.conductor.editor.resize_level(size_x, size_y); this.conductor.editor.crop_level(0, 0, size_x, size_y);
} }
stored_level.blob_behavior = parseInt(els.blob_behavior.value, 10); stored_level.blob_behavior = parseInt(els.blob_behavior.value, 10);

View File

@ -1632,7 +1632,26 @@ export class Editor extends PrimaryView {
); );
} }
resize_level(size_x, size_y, x0 = 0, y0 = 0) { crop_level(x0, y0, size_x, size_y) {
let original_cells = this.stored_level.linear_cells;
let original_size_x = this.stored_level.size_x;
let original_size_y = this.stored_level.size_y;
let old_selection_cells, new_selection_cells;
if (this.selection) {
this.selection.commit_floating();
old_selection_cells = this.selection.cells;
new_selection_cells = new Set;
for (let n of old_selection_cells) {
let x = n % original_size_x - x0;
let y = Math.floor(n / original_size_x) - y0;
if (0 <= x && x < size_x && 0 <= y && y < size_y) {
new_selection_cells.add(x + y * size_x);
}
}
}
let new_cells = []; let new_cells = [];
for (let y = y0; y < y0 + size_y; y++) { for (let y = y0; y < y0 + size_y; y++) {
for (let x = x0; x < x0 + size_x; x++) { for (let x = x0; x < x0 + size_x; x++) {
@ -1640,21 +1659,24 @@ export class Editor extends PrimaryView {
} }
} }
let original_cells = this.stored_level.linear_cells;
let original_size_x = this.stored_level.size_x;
let original_size_y = this.stored_level.size_y;
this._do(() => { this._do(() => {
this.stored_level.linear_cells = new_cells; this.stored_level.linear_cells = new_cells;
this.stored_level.size_x = size_x; this.stored_level.size_x = size_x;
this.stored_level.size_y = size_y; this.stored_level.size_y = size_y;
this.update_after_size_change(); this.update_after_size_change();
if (this.selection) {
this.selection._set_from_set(new_selection_cells);
}
}, () => { }, () => {
this.stored_level.linear_cells = original_cells; this.stored_level.linear_cells = original_cells;
this.stored_level.size_x = original_size_x; this.stored_level.size_x = original_size_x;
this.stored_level.size_y = original_size_y; this.stored_level.size_y = original_size_y;
this.update_after_size_change(); this.update_after_size_change();
if (this.selection) {
this.selection._set_from_set(old_selection_cells);
}
}); });
this.commit_undo(); this.commit_undo();
} }