Add delete terrain command

This commit is contained in:
2026-04-18 19:47:32 +02:00
parent 8f5e33ef06
commit 30ec67c00c

View File

@@ -0,0 +1,73 @@
import { createOpaqueId } from "../core/ids";
import { cloneEditorSelection, type EditorSelection } from "../core/selection";
import type { ToolMode } from "../core/tool-mode";
import { cloneTerrain, type Terrain } from "../document/terrains";
import type { EditorCommand } from "./command";
export function createDeleteTerrainCommand(terrainId: string): EditorCommand {
let deletedTerrain: Terrain | null = null;
let previousSelection: EditorSelection | null = null;
let previousToolMode: ToolMode | null = null;
return {
id: createOpaqueId("command"),
label: "Delete terrain",
execute(context) {
const currentDocument = context.getDocument();
const terrain = currentDocument.terrains[terrainId];
if (terrain === undefined) {
throw new Error(`Terrain ${terrainId} does not exist.`);
}
if (deletedTerrain === null) {
deletedTerrain = cloneTerrain(terrain);
}
if (previousSelection === null) {
previousSelection = cloneEditorSelection(context.getSelection());
}
if (previousToolMode === null) {
previousToolMode = context.getToolMode();
}
const nextTerrains = {
...currentDocument.terrains
};
delete nextTerrains[terrainId];
context.setDocument({
...currentDocument,
terrains: nextTerrains
});
context.setSelection({
kind: "none"
});
context.setToolMode("select");
},
undo(context) {
if (deletedTerrain === null) {
return;
}
const currentDocument = context.getDocument();
context.setDocument({
...currentDocument,
terrains: {
...currentDocument.terrains,
[deletedTerrain.id]: cloneTerrain(deletedTerrain)
}
});
if (previousSelection !== null) {
context.setSelection(previousSelection);
}
if (previousToolMode !== null) {
context.setToolMode(previousToolMode);
}
}
};
}