Skip to content

Commit 87716e0

Browse files
author
DavidQ
committed
Missed
1 parent 98f7210 commit 87716e0

3 files changed

Lines changed: 35 additions & 25 deletions

File tree

src/engine/persistence/FilePersistenceService.js

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,24 @@ export async function writeFileHandleText(fileHandle, content, {
7272
return true;
7373
}
7474

75-
export function downloadTextFile(content, fileName, {
75+
export function downloadBlobFile(blob, fileName, {
7676
appendToBody = false,
7777
documentRef = null,
78-
mimeType = "application/json",
7978
windowRef = null
8079
} = {}) {
8180
const browserWindow = resolveWindowRef(windowRef);
8281
const documentObject = resolveDocumentRef(documentRef, browserWindow);
83-
const BlobCtor = browserWindow.Blob || globalThis.Blob;
8482
const urlApi = browserWindow.URL || browserWindow.webkitURL || globalThis.URL;
8583
if (
86-
!documentObject
84+
!blob
85+
|| !documentObject
8786
|| typeof documentObject.createElement !== "function"
88-
|| typeof BlobCtor !== "function"
8987
|| typeof urlApi?.createObjectURL !== "function"
9088
|| typeof urlApi?.revokeObjectURL !== "function"
9189
) {
9290
return false;
9391
}
9492

95-
const blob = new BlobCtor([String(content)], { type: mimeType });
9693
const url = urlApi.createObjectURL(blob);
9794
const link = documentObject.createElement("a");
9895
link.href = url;
@@ -108,3 +105,27 @@ export function downloadTextFile(content, fileName, {
108105
urlApi.revokeObjectURL(url);
109106
return true;
110107
}
108+
109+
export function downloadTextFile(content, fileName, {
110+
appendToBody = false,
111+
documentRef = null,
112+
mimeType = "application/json",
113+
windowRef = null
114+
} = {}) {
115+
const browserWindow = resolveWindowRef(windowRef);
116+
const documentObject = resolveDocumentRef(documentRef, browserWindow);
117+
const BlobCtor = browserWindow.Blob || globalThis.Blob;
118+
const urlApi = browserWindow.URL || browserWindow.webkitURL || globalThis.URL;
119+
if (
120+
!documentObject
121+
|| typeof documentObject.createElement !== "function"
122+
|| typeof BlobCtor !== "function"
123+
|| typeof urlApi?.createObjectURL !== "function"
124+
|| typeof urlApi?.revokeObjectURL !== "function"
125+
) {
126+
return false;
127+
}
128+
129+
const blob = new BlobCtor([String(content)], { type: mimeType });
130+
return downloadBlobFile(blob, fileName, { appendToBody, documentRef, windowRef });
131+
}

src/engine/persistence/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ export { default as LocalStorageService } from './LocalStorageService.js';
1010
export { default as SessionStorageService } from './SessionStorageService.js';
1111
export { default as CookieStorageService } from './CookieStorageService.js';
1212
export { default as SaveSlotManager } from './SaveSlotManager.js';
13-
export { downloadTextFile, readFileHandleText, readFileText, writeFileHandleText } from './FilePersistenceService.js';
13+
export { downloadBlobFile, downloadTextFile, readFileHandleText, readFileText, writeFileHandleText } from './FilePersistenceService.js';
1414
export { compressText, decompressText, compressJson, decompressJson } from './CompressionService.js';
1515
export { serializeWorldState, deserializeWorldState } from './WorldSerializer.js';

tools/Sprite Editor/modules/spriteEditorApp.js

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
PROJECT_FORMAT,
1717
TOOL_IDS
1818
} from "./constants.js";
19-
import { readFileText } from "../../../src/engine/persistence/index.js";
19+
import { downloadBlobFile, readFileText } from "../../../src/engine/persistence/index.js";
2020
import { colorToPickerValue, dedupeColors, isTransparent, normalizeColor, rgbaToHex } from "./colorUtils.js";
2121
import {
2222
cloneFrame,
@@ -274,17 +274,6 @@ function resolvePaletteFromAssetRegistry(state) {
274274
return true;
275275
}
276276

277-
function downloadBlob(blob, filename) {
278-
const link = document.createElement("a");
279-
const url = URL.createObjectURL(blob);
280-
link.href = url;
281-
link.download = filename;
282-
document.body.appendChild(link);
283-
link.click();
284-
document.body.removeChild(link);
285-
URL.revokeObjectURL(url);
286-
}
287-
288277
function summarizeGraphFindings(findings) {
289278
return Array.isArray(findings) && findings.length > 0
290279
? ` Graph findings: ${findings.length}.`
@@ -1890,7 +1879,7 @@ async function exportCurrentFramePng(state) {
18901879
const frameCanvas = createImageFromFrame(frame, state.project.width, state.project.height);
18911880
const blob = await canvasToBlob(frameCanvas);
18921881
const filename = `sprite-frame-${state.project.currentFrameIndex + 1}-${state.project.width}x${state.project.height}.png`;
1893-
downloadBlob(blob, filename);
1882+
downloadBlobFile(blob, filename, { appendToBody: true });
18941883
setStatus(state, `Exported ${filename} (${state.project.width}x${state.project.height}).`);
18951884
}
18961885

@@ -1901,7 +1890,7 @@ async function exportSpriteSheetPng(state) {
19011890
const sheetCanvas = createSpriteSheetCanvas(state.project);
19021891
const blob = await canvasToBlob(sheetCanvas);
19031892
const filename = `sprite-sheet-${state.project.frames.length}f-${state.project.width}x${state.project.height}.png`;
1904-
downloadBlob(blob, filename);
1893+
downloadBlobFile(blob, filename, { appendToBody: true });
19051894
setStatus(state, `Exported ${filename} (${sheetCanvas.width}x${sheetCanvas.height}).`);
19061895
}
19071896

@@ -1935,8 +1924,8 @@ async function packageSpriteProject(state) {
19351924
return false;
19361925
}
19371926
const baseName = `${state.assetRegistry.projectId || "sprite-project"}.package`;
1938-
downloadBlob(new Blob([`${JSON.stringify(packageResult.manifest, null, 2)}\n`], { type: "application/json" }), `${baseName}.json`);
1939-
downloadBlob(new Blob([`${packageResult.reportText}\n`], { type: "text/plain" }), `${baseName}.report.txt`);
1927+
downloadBlobFile(new Blob([`${JSON.stringify(packageResult.manifest, null, 2)}\n`], { type: "application/json" }), `${baseName}.json`, { appendToBody: true });
1928+
downloadBlobFile(new Blob([`${packageResult.reportText}\n`], { type: "text/plain" }), `${baseName}.report.txt`, { appendToBody: true });
19401929
setStatus(state, `${summarizeProjectPackaging(packageResult)} Manifest and report exported.`);
19411930
return true;
19421931
}
@@ -1951,7 +1940,7 @@ async function saveAssetRegistryJson(state) {
19511940
const payload = createRegistryDownloadPayload(state.assetRegistry);
19521941
const blob = new Blob([payload], { type: "application/json" });
19531942
const fileName = "project.assets.json";
1954-
downloadBlob(blob, fileName);
1943+
downloadBlobFile(blob, fileName, { appendToBody: true });
19551944
setStatus(
19561945
state,
19571946
`Saved ${fileName} with ${state.assetRegistry.sprites.length} sprite entries.${summarizeGraphFindings(findings)} Validation: ${summarizeAssetValidation(validation)}.`
@@ -1993,7 +1982,7 @@ async function saveProjectJson(state) {
19931982
};
19941983
const json = `${JSON.stringify(payload, null, 2)}\n`;
19951984
const blob = new Blob([json], { type: "application/json" });
1996-
downloadBlob(blob, fileName);
1985+
downloadBlobFile(blob, fileName, { appendToBody: true });
19971986
setStatus(
19981987
state,
19991988
`Saved ${fileName} (frame ${state.project.currentFrameIndex + 1} active, asset refs: palette=${state.project.assetRefs.paletteId || "none"}, sprite=${state.project.assetRefs.spriteId || "none"}).${summarizeGraphFindings(findings)} Validation: ${summarizeAssetValidation(validation)}.`

0 commit comments

Comments
 (0)