0ef1a4ec15
- index.tsx:新增 resourceFilterOpen 与 resourceFilterTags 两个 state,区域不新增 state(唯一新增的筛选相关 state 是已选标签) - index.tsx:可见资源由内联关键词过滤改为调用 filterCanvasResources,维度为区域 / 标签 / 关键词;区域由 resourceBookState 派生(不在分页栏目里时为「全部区域」),因此用户用滚轮 / 总览卡片 / 下一页换栏目时区域自动跟随,无需双向同步 - index.tsx:标签库按「区域 + 关键词」派生并故意不含已选标签——若拿已按标签收窄的集合派生,选了一个标签后列表只剩该标签,用户再也选不出第二个标签,AND 多选会形同废掉 - index.tsx:Dock 上紧邻搜索按钮新增筛选按钮,复用 game-resource-book-zoom-button 与 is-active 口径;两个浮层共用同一个右下角锚点,因此开筛选即收起搜索、开搜索即收起筛选 - index.tsx:挂载 ResourceFilterPanel,区域变更转交既有 openResourceBookChild(与栏目切换同一条路径),关键词与搜索浮层共用同一份 searchText - resourceCanvasFilterModel.ts:resourceFilterIsActive 只看关键词与标签、不含区域——区域就是画布当前栏目,用户换栏时它照样在变,算进高亮会让按钮在「只是换了一栏看」时也常亮 - 新增 resourceFloatingPanelModel.ts 与其测试:资源卡旁「快速编辑」与「生成动画」的互斥规则收在一处并被两个开启入口共用,修掉「先开生成动画再点快速编辑两个浮层并存」的缺口;关闭仍只关自己,生成收尾不会吞掉用户刚打开的另一个面板 - 断言:新增 5 条互斥用例(含两个方向各自一条与来回点击序列),加上既有筛选用例;变异验证实测——把互斥模型的 closed 写成恒为 quick-edit(等价只修一个方向)→ 4 failed,还原后 5 passed
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
/**
|
|
* 资源卡旁那一组浮层——「快速编辑」与「生成动画」——的开关合成。
|
|
*
|
|
* 两者挂在同一个选中资源卡旁、同一位置:同时打开就会叠在一起。**互斥规则只有一处**,
|
|
* 两个开启入口都读它,因此「开动画→点快速编辑」与「开快速编辑→点动画」不会只修好一边。
|
|
*/
|
|
export type ResourceCardFloatingPanelKind =
|
|
| 'quick-edit'
|
|
| 'character-animation';
|
|
|
|
/** 另一个浮层是什么。互斥就是「开 A 必然关 B」,所以只要求出 B 即可。 */
|
|
export function opposingResourceCardFloatingPanel(
|
|
kind: ResourceCardFloatingPanelKind,
|
|
): ResourceCardFloatingPanelKind {
|
|
return kind === 'quick-edit' ? 'character-animation' : 'quick-edit';
|
|
}
|
|
|
|
/**
|
|
* 开启某个浮层时,两个浮层各自应当处于什么状态。
|
|
*
|
|
* 返回的 `open` 就是被点开的那个,`closed` 是必然被收起的另一个;因此结果里
|
|
* **永远不可能两个都为真**。
|
|
*/
|
|
export function openResourceCardFloatingPanelState(
|
|
kind: ResourceCardFloatingPanelKind,
|
|
): {
|
|
open: ResourceCardFloatingPanelKind;
|
|
closed: ResourceCardFloatingPanelKind;
|
|
} {
|
|
return { open: kind, closed: opposingResourceCardFloatingPanel(kind) };
|
|
}
|