diff --git a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasAssetTransferModel.ts b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasAssetTransferModel.ts index 96e1e6216..d25bd9946 100644 --- a/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasAssetTransferModel.ts +++ b/apps/ai-game-creator-shell/src/features/resource-canvas/resourceCanvasAssetTransferModel.ts @@ -28,6 +28,19 @@ export type ResourceCanvasPanelEntryInput = { previewError: string | null; }; +/** + * 资源能否落盘到用户本地。 + * + * 保存走的是本地文件复制(原生保存对话框 + Rust 分块拷贝),因此只要求有可读路径; + * 虚拟版本条目没有对应文件,拿不到路径就不放行。资源面板的「下载」与画布工具条的 + * 「下载按钮」共用这一条判据,不要在别处再写第二份。 + */ +export function isResourceCanvasExportable( + resource: Pick, +) { + return resource.version === undefined && resource.path !== ''; +} + export function resolveResourceCanvasPanelEntries( inputs: readonly ResourceCanvasPanelEntryInput[], ): ResourceCanvasPanelEntry[] { @@ -39,9 +52,7 @@ export function resolveResourceCanvasPanelEntries( path: input.resource.path, mediaType: input.resource.mediaType, selectable: true, - // 保存走本地文件复制,因此只要求有可读路径;虚拟版本条目没有文件,不能保存。 - downloadable: - input.resource.version === undefined && input.resource.path !== '', + downloadable: isResourceCanvasExportable(input.resource), previewIdentity: input.previewIdentity, previewSourceUrl: input.previewSourceUrl, previewStatus: input.previewStatus,