修复 PR #316 review(前端 TS/TSX):图片编辑器素材弹窗

- ImageCanvasProjectAssetPickerDialog.tsx:打开时的重置 effect 只依赖 `open`,父级每次渲染重建 `selectedAssetIds` 不再清空进行中的搜索 / 筛选 / 选择
- ImageCanvasProjectAssetPickerDialog.tsx:素材卡媒体渲染抽成 `AssetCardMedia`,顺带去掉该处嵌套三元
- projectAssetReferencePickerModel.ts:`image-sequence` 单列一类(新增「序列帧」页签),不再混进「图片」——参考图链路只接受 `mediaType === 'image'`,混进去就是「按图片选中、按图片文案拒掉」;缩略图口径由 `projectAssetPickerUsesThumbnail` 收口
- 用例:父级重渲染不清空在选状态;序列帧分类归属与其被参考图链路过滤掉的事实
This commit is contained in:
2026-09-12 20:49:37 +08:00
parent d1581892d7
commit a9a5fba92b
4 changed files with 170 additions and 18 deletions
@@ -7,8 +7,17 @@ import {
/**
* 参考图弹窗的分类口径:只按素材的媒体类型分组,与画布的「功能分类」各自独立
* (画布用 manifest `category`,这里是编辑器素材库自己的可读分类)。
*
* `image-sequence` 单列一类,不并进「图片」:序列帧是逐帧动画资产,不是静态图片,
* 而参考图链路(`appendLimitedImageReferences`)只接受 `mediaType === 'image'`。
* 混进「图片」会变成「按图片选中、按图片的文案拒掉」——用户看到的分类与它为什么被拒
* 互相矛盾。单列之后行为与音频 / 视频一致:看得见、选得中、给了明确提示。
*/
export type ProjectAssetPickerMediaCategory = 'image' | 'video' | 'audio';
export type ProjectAssetPickerMediaCategory =
| 'image'
| 'video'
| 'audio'
| 'image-sequence';
export type ProjectAssetPickerCategory =
| 'all'
@@ -20,6 +29,7 @@ export const PROJECT_ASSET_PICKER_CATEGORY_OPTIONS: readonly PlatformResourceFil
{ id: 'image', label: '图片' },
{ id: 'video', label: '视频' },
{ id: 'audio', label: '音频' },
{ id: 'image-sequence', label: '序列帧' },
];
export function projectAssetPickerCategory(
@@ -28,9 +38,23 @@ export function projectAssetPickerCategory(
const mediaType = asset.mediaType ?? 'image';
if (mediaType === 'video') return 'video';
if (mediaType === 'audio') return 'audio';
if (mediaType === 'image-sequence') return 'image-sequence';
return 'image';
}
/**
* 卡片缩略图能不能直接画:图片与序列帧的 `src` 都是图片字节
* (序列帧是首帧 / 当前帧),其它媒体类型退回类型图标。
*
* 这条只决定「怎么画」,不决定「能不能当参考图」——后者由参考图链路按
* `mediaType === 'image'` 收口。
*/
export function projectAssetPickerUsesThumbnail(
category: ProjectAssetPickerMediaCategory,
): boolean {
return category === 'image' || category === 'image-sequence';
}
/**
* 弹窗筛选判据:分类 + 搜索词,两者叠加。
* 与资源画布、`@` 面板的筛选状态无关,调用方各自持有输入值。