「整理画布」移出「资源排列方式」分组,成为独立动作按钮
- index.tsx:把「整理画布」从 aria-label=\"资源排列方式\" 的 role=group 里搬出来,
紧跟排序 tab 之后、作为 game-workbench-view-actions 动作区里的独立按钮,
外观直接复用该容器既有动作按钮样式(有边圆角 + secondary 填充),不新增 CSS
- index.tsx:语义与行为一字未改——aria-label=\"整理画布\"、disabled={!resourceLayoutReady}、
aria-busy={resourceLayoutSaving}、onClick 仍调 activeResourceLayout.rederiveNow(),
成功/失败反馈仍复用既有 resourceLayoutNotice / resourceLayoutSaving,changed 门保留
- resourceCanvasManualLayout.test.tsx:新增结构断言——「资源排列方式」分组里只有
「按依赖 / 按类型」两枚按钮、「整理画布」不在该容器内也不在 .game-resource-sort-tabs 里,
同时仍是动作区内可用按钮(布局就绪后不再 disabled)
This commit is contained in:
@@ -7198,22 +7198,27 @@ export default function ProjectDevelopmentView({
|
||||
<ListFilter size={15} aria-hidden="true" />
|
||||
类型
|
||||
</button>
|
||||
{/*
|
||||
画布不再自动重排,整张整理只由这一次显式动作发起:丢掉全部自动坐标、
|
||||
按当前资源与拓扑重算(手动拖过的卡原地不动)。进行中的保存/重算仍然由
|
||||
既有的「保存中 / 布局已保存」状态位反馈。
|
||||
*/}
|
||||
<button
|
||||
type="button"
|
||||
aria-label="整理画布"
|
||||
disabled={!resourceLayoutReady}
|
||||
aria-busy={resourceLayoutSaving}
|
||||
onClick={() => activeResourceLayout.rederiveNow()}
|
||||
>
|
||||
<LayoutGrid size={15} aria-hidden="true" />
|
||||
整理画布
|
||||
</button>
|
||||
</div>
|
||||
{/*
|
||||
「整理画布」是本行的动作按钮,不是第三种排列方式:它留在
|
||||
`game-workbench-view-actions` 这个动作区里、紧跟模式切换之后,外观直接复用
|
||||
该容器既有的动作按钮样式(有边圆角 + secondary 填充),与分段的 pill 模式
|
||||
切换一眼可分;因此不新增任何 CSS。
|
||||
|
||||
画布不再自动重排,整张整理只由这一次显式动作发起:丢掉全部自动坐标、按当前
|
||||
资源与拓扑重算(手动拖过的卡原地不动)。进行中的保存/重算仍然由既有的
|
||||
「保存中 / 布局已保存」状态位反馈。
|
||||
*/}
|
||||
<button
|
||||
type="button"
|
||||
aria-label="整理画布"
|
||||
disabled={!resourceLayoutReady}
|
||||
aria-busy={resourceLayoutSaving}
|
||||
onClick={() => activeResourceLayout.rederiveNow()}
|
||||
>
|
||||
<LayoutGrid size={15} aria-hidden="true" />
|
||||
整理画布
|
||||
</button>
|
||||
</>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
@@ -23,6 +23,7 @@ import {
|
||||
React,
|
||||
render,
|
||||
screen,
|
||||
within,
|
||||
} from './appSurface/harness';
|
||||
|
||||
/**
|
||||
@@ -752,6 +753,53 @@ describe('资源画布手动重排口径', () => {
|
||||
expect(typeWrites(tauri)).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('「整理画布」不属于「资源排列方式」这组模式切换,而是一枚独立动作按钮', async () => {
|
||||
const projectPath = '/tmp/manual-layout-surface-project';
|
||||
const tauri = installLayoutTauri({
|
||||
projectIdsByPath: { [projectPath]: 'manual-layout-surface-project' },
|
||||
});
|
||||
render(
|
||||
<LayoutWorkbench
|
||||
projects={[
|
||||
{
|
||||
projectId: 'manual-layout-surface-project',
|
||||
projectPath,
|
||||
assets: [pngAsset('asset-art-b', 'art-b.png')],
|
||||
},
|
||||
]}
|
||||
/>,
|
||||
);
|
||||
|
||||
const sortGroup = await screen.findByRole('group', {
|
||||
name: '资源排列方式',
|
||||
});
|
||||
// 这组里只有两种排列方式:用户不该把「整理画布」读成第三种排列方式。
|
||||
expect(
|
||||
within(sortGroup)
|
||||
.getAllByRole('button')
|
||||
.map((button) => button.getAttribute('aria-label')),
|
||||
).toEqual(['按依赖', '按类型']);
|
||||
expect(
|
||||
within(sortGroup).queryByRole('button', { name: '整理画布' }),
|
||||
).toBeNull();
|
||||
|
||||
// 它仍在同一行、仍是同一枚动作按钮,只是搬出了那个 group。
|
||||
const rederiveButton = screen.getByRole('button', { name: '整理画布' });
|
||||
expect(sortGroup.contains(rederiveButton)).toBe(false);
|
||||
expect(rederiveButton.closest('.game-resource-sort-tabs')).toBeNull();
|
||||
expect(
|
||||
rederiveButton.closest('.game-workbench-view-actions'),
|
||||
).not.toBeNull();
|
||||
// 语义没变:可点性只跟布局就绪绑定,布局读完后它就是可点的。
|
||||
await waitFor(() =>
|
||||
expect(
|
||||
screen
|
||||
.getByRole('button', { name: '整理画布' })
|
||||
.hasAttribute('disabled'),
|
||||
).toBe(false),
|
||||
);
|
||||
});
|
||||
|
||||
it('首次打开项目与切项目都不触发新素材聚焦跳转', async () => {
|
||||
const tauri = installLayoutTauri({
|
||||
projectIdsByPath: {
|
||||
|
||||
Reference in New Issue
Block a user