From 85644944b7533491519d938882db7bce7cb5e4fb Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 31 Mar 2026 20:04:06 +0200 Subject: [PATCH] Add command for importing background image asset --- .../import-background-image-asset-command.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/commands/import-background-image-asset-command.ts diff --git a/src/commands/import-background-image-asset-command.ts b/src/commands/import-background-image-asset-command.ts new file mode 100644 index 00000000..e4c0f91c --- /dev/null +++ b/src/commands/import-background-image-asset-command.ts @@ -0,0 +1,56 @@ +import { createOpaqueId } from "../core/ids"; +import { cloneWorldSettings, type WorldSettings } from "../document/world-settings"; +import { cloneProjectAssetRecord, type ImageAssetRecord } from "../assets/project-assets"; + +import type { EditorCommand } from "./command"; + +interface ImportBackgroundImageAssetCommandOptions { + asset: ImageAssetRecord; + world: WorldSettings; + label?: string; +} + +export function createImportBackgroundImageAssetCommand(options: ImportBackgroundImageAssetCommandOptions): EditorCommand { + const nextAsset = cloneProjectAssetRecord(options.asset); + const nextWorld = cloneWorldSettings(options.world); + let previousWorld: WorldSettings | null = null; + + return { + id: createOpaqueId("command"), + label: options.label ?? `Import ${nextAsset.sourceName} as background`, + execute(context) { + const currentDocument = context.getDocument(); + + if (currentDocument.assets[nextAsset.id] !== undefined) { + throw new Error(`Asset ${nextAsset.id} already exists.`); + } + + if (previousWorld === null) { + previousWorld = cloneWorldSettings(currentDocument.world); + } + + context.setDocument({ + ...currentDocument, + assets: { + ...currentDocument.assets, + [nextAsset.id]: cloneProjectAssetRecord(nextAsset) + }, + world: cloneWorldSettings(nextWorld) + }); + }, + undo(context) { + const currentDocument = context.getDocument(); + const nextAssets = { + ...currentDocument.assets + }; + + delete nextAssets[nextAsset.id]; + + context.setDocument({ + ...currentDocument, + assets: nextAssets, + world: previousWorld === null ? cloneWorldSettings(currentDocument.world) : cloneWorldSettings(previousWorld) + }); + } + }; +}