Fix/修复ui editor选择逻辑 #270

Merged
kdletters merged 22 commits from fix/ui-editor-enexpected-select into master 2026-09-04 16:30:44 +08:00
Member

close #266
当前实现: 按下就重新选择

实际上应该: 松开而且没有发生拖动才重新选择

before:
shotmd-1788407266-compressed.webp

after:
shotmd-1788418953-compressed.webp

close #266 当前实现: 按下就重新选择 实际上应该: 松开而且没有发生拖动才重新选择 before: ![shotmd-1788407266-compressed.webp](/attachments/251eccf6-ae02-4ae6-b9d2-4eb1fbf67df3) after: ![shotmd-1788418953-compressed.webp](/attachments/5c05b506-ae08-4cb1-83c8-8da8e1590a7f)
k88936 self-assigned this 2026-09-03 15:03:37 +08:00
k88936 added this to the 陶泥儿gameAgent project 2026-09-03 15:03:37 +08:00
k88936 added 9 commits 2026-09-03 15:03:37 +08:00
按下阶段仅记录节点手势与命中目标

在干净松开时选择并处理拖动取消失焦边界

阻止拖动后的嵌套 click 重新选择
覆盖节点点击延迟到 pointerup 的选择时机

覆盖拖动嵌套节点缩放取消失焦和区域外松开

覆盖直接拖动节点不再由 click 单独选中
记录松开选择与二像素拖动阈值

补充嵌套节点和取消边界语义
拖动手势优先更新按下前已选中的节点

补充跨节点拖动回归测试并同步交互约定
为预览节点层增加 select-none 样式

拖动起始阶段阻止浏览器默认选择行为

补充原生选字防回归测试并同步文档
取消、失焦、树切换和无效几何统一清理点击抑制状态

补充 pointercancel 后点击状态回归测试

同步 UI 编辑器预览交互技术方案
复用同一接收条件驱动点击分支与指针处理器
覆盖越过移动阈值后 pointercancel 清理点击抑制
收紧预览取消事件接口
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Successful in 3m1s
Project CI / Native shell tests (pull_request) Successful in 23m12s
16dedbb4b7
将节点与缩放手势的 cancel 回调改为必填

更新所有 UiTreeRenderer 调用点显式传入取消处理
k88936 requested review from kdletters 2026-09-03 15:03:37 +08:00
k88936 added 1 commit 2026-09-03 15:05:19 +08:00
Merge remote-tracking branch 'origin/master' into fix/ui-editor-enexpected-select
Project CI / Frontend tests (pull_request) Successful in 3m36s
Project CI / Backend tests (pull_request) Successful in 7m9s
Project CI / Native shell tests (pull_request) Failing after 19m56s
Project CI / Repository checks (pull_request) Failing after 54s
ad3155d44c
k88936 added 1 commit 2026-09-03 16:08:34 +08:00
Merge branch 'master' into fix/ui-editor-enexpected-select
Project CI / Frontend tests (pull_request) Successful in 2m50s
Project CI / Native shell tests (pull_request) Successful in 21m0s
Project CI / Repository checks (pull_request) Successful in 2m25s
Project CI / Backend tests (pull_request) Successful in 6m38s
1d2bfc3763
kdletters requested changes 2026-09-03 19:36:31 +08:00
Dismissed
kdletters left a comment
Member

当前 head 的 UI 选择改动定向测试已通过,但不能合并:该分支相对最新 master 回退了 PR273 已修复的 Codex CLI BrokenPipe 处理。请先同步最新 master,保留 codex_cli.rs 的容错与退出码/stderr 采集逻辑,重新跑四项必需 CI 后再申请复审。

当前 head 的 UI 选择改动定向测试已通过,但不能合并:该分支相对最新 master 回退了 PR273 已修复的 Codex CLI BrokenPipe 处理。请先同步最新 master,保留 codex_cli.rs 的容错与退出码/stderr 采集逻辑,重新跑四项必需 CI 后再申请复审。
@@ -665,5 +665,5 @@
let executable = temp.path().join("fake-codex");
std::fs::write(
&executable,
r#"#!/bin/sh
prompt="$(cat)"
Member

这里把 PR273 的 BrokenPipe 容错回退成 write_all/shutdown 直接失败。Codex CLI 可能在 prompt 写完前退出;直接返回会跳过 child.wait() 以及脱敏 stderr 摘要采集,重新引入失败状态竞态。请保留 master 上的继续等待与错误汇总逻辑。

这里把 PR273 的 BrokenPipe 容错回退成 write_all/shutdown 直接失败。Codex CLI 可能在 prompt 写完前退出;直接返回会跳过 child.wait() 以及脱敏 stderr 摘要采集,重新引入失败状态竞态。请保留 master 上的继续等待与错误汇总逻辑。
k88936 marked this conversation as resolved
k88936 added 1 commit 2026-09-03 19:43:28 +08:00
解决 UI 编辑器预览手势合并冲突
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
708421259a
保留节点拖动时的子节点预览变换与提交取消行为。

将节点选择延迟到未拖动的指针松开,并抑制拖动后的 click。

保留窗口失焦、指针取消和缩放控制点的现有交互。
k88936 added 1 commit 2026-09-03 19:46:32 +08:00
Merge branch 'master' into fix/ui-editor-enexpected-select
Project CI / Repository checks (pull_request) Successful in 2m45s
Project CI / Frontend tests (pull_request) Successful in 3m3s
Project CI / Backend tests (pull_request) Successful in 7m21s
Project CI / Native shell tests (pull_request) Successful in 19m30s
55907efcde
kdletters requested changes 2026-09-03 19:47:13 +08:00
Dismissed
kdletters left a comment
Member

[PR270 review] head sha: 708421259a

Request changes:该 head 的定向 UI 测试当前无法通过。tests/uiEditorPreview.test.tsx 中前一测试遗留的 ExclusiveChildrenTabs 导致后续 getByRole 命中多个元素;请修复测试清理后再合并。

[PR270 review] head sha: 708421259a69ab591fd8c47eb2adcd1b4d1c84a7 Request changes:该 head 的定向 UI 测试当前无法通过。`tests/uiEditorPreview.test.tsx` 中前一测试遗留的 `ExclusiveChildrenTabs` 导致后续 `getByRole` 命中多个元素;请修复测试清理后再合并。
Member

[PR270 review] head sha: 708421259a69ab591fd8c47eb2adcd1b4d1c84a7\n\n阻塞合并(P1):新增的 tests/uiEditorPreview.test.tsx 测试会污染后续测试的 DOM。uses a highlighted tab bar 测试在第 307 行渲染 ExclusiveChildrenTabs 后没有 unmount;随后 keeps exclusive tab pointer gestures 测试使用 screen.getByRole(tab, name=child-b) 时会同时命中前一个测试遗留的 tab 和本测试的 tab,导致 Vitest 失败(实测 2 个测试失败,18 个中 16 个通过)。请在该测试中 unmount,或确保每个测试后 cleanup,并重新运行该测试文件。

[PR270 review] head sha: 708421259a69ab591fd8c47eb2adcd1b4d1c84a7\n\n阻塞合并(P1):新增的 tests/uiEditorPreview.test.tsx 测试会污染后续测试的 DOM。uses a highlighted tab bar 测试在第 307 行渲染 ExclusiveChildrenTabs 后没有 unmount;随后 keeps exclusive tab pointer gestures 测试使用 screen.getByRole(tab, name=child-b) 时会同时命中前一个测试遗留的 tab 和本测试的 tab,导致 Vitest 失败(实测 2 个测试失败,18 个中 16 个通过)。请在该测试中 unmount,或确保每个测试后 cleanup,并重新运行该测试文件。
Member

[PR270 review] head sha: 708421259a69ab591fd8c47eb2adcd1b4d1c84a7\n\n阻塞合并(P1):新增的 tests/uiEditorPreview.test.tsx 测试会污染后续测试的 DOM。uses a highlighted tab bar 测试在第 307 行渲染 ExclusiveChildrenTabs 后没有 unmount;随后 keeps exclusive tab pointer gestures 测试使用 screen.getByRole(tab, name=child-b) 时会同时命中前一个测试遗留的 tab 和本测试的 tab,导致 Vitest 失败(实测 2 个测试失败,18 个中 16 个通过)。请在该测试中 unmount,或确保每个测试后 cleanup,并重新运行该测试文件。

[PR270 review] head sha: 708421259a69ab591fd8c47eb2adcd1b4d1c84a7\n\n阻塞合并(P1):新增的 tests/uiEditorPreview.test.tsx 测试会污染后续测试的 DOM。uses a highlighted tab bar 测试在第 307 行渲染 ExclusiveChildrenTabs 后没有 unmount;随后 keeps exclusive tab pointer gestures 测试使用 screen.getByRole(tab, name=child-b) 时会同时命中前一个测试遗留的 tab 和本测试的 tab,导致 Vitest 失败(实测 2 个测试失败,18 个中 16 个通过)。请在该测试中 unmount,或确保每个测试后 cleanup,并重新运行该测试文件。
Member

[PR270 review] head sha: 55907efcde

P1(阻塞合并):该 head 的定向 UI 测试无法通过。新增的 disables native text selection... 测试调用 renderTree() 后没有 unmount();紧接着新增的 does not use click alone... 测试也没有清理。该 Vitest 文件未配置自动 cleanup,渲染树会留在 document.body,导致后续 shows final-preview...screen.getByText("child") 匹配多个元素,且 keeps exclusive tab...getByRole("tab", {name: "child-b"}) 也匹配多个元素。实际运行该 head 的定向测试结果为 2 failed / 22 passed。建议每个测试结束时 unmount,或统一配置 afterEach(cleanup)。问题位置:apps/ai-game-creator-shell/tests/uiEditorPreview.test.tsx:94

[PR270 review] head sha: 55907efcde2a4b3cb3fa8e148055133652c16813 P1(阻塞合并):该 head 的定向 UI 测试无法通过。新增的 `disables native text selection...` 测试调用 `renderTree()` 后没有 `unmount()`;紧接着新增的 `does not use click alone...` 测试也没有清理。该 Vitest 文件未配置自动 cleanup,渲染树会留在 document.body,导致后续 `shows final-preview...` 的 `screen.getByText("child")` 匹配多个元素,且 `keeps exclusive tab...` 的 `getByRole("tab", {name: "child-b"})` 也匹配多个元素。实际运行该 head 的定向测试结果为 2 failed / 22 passed。建议每个测试结束时 unmount,或统一配置 `afterEach(cleanup)`。问题位置:`apps/ai-game-creator-shell/tests/uiEditorPreview.test.tsx:94`。
kdletters requested changes 2026-09-03 19:51:48 +08:00
kdletters left a comment
Member

[PR270 review] head sha: 55907efcde

Request changes:定向测试当前失败(2 failed / 22 passed),详见总评论 3389。

[PR270 review] head sha: 55907efcde2a4b3cb3fa8e148055133652c16813 Request changes:定向测试当前失败(2 failed / 22 passed),详见总评论 3389。
k88936 added 5 commits 2026-09-03 20:08:10 +08:00
卸载 ExclusiveChildrenTabs 测试实例,避免后续 tab 查询命中残留 DOM。
为预览测试统一注册 afterEach cleanup,避免测试间残留 DOM。

保留原有 UI 选择与拖拽交互行为。
Merge remote-tracking branch 'origin/master' into fix/ui-editor-enexpected-select
Project CI / Repository checks (pull_request) Successful in 2m49s
Project CI / Frontend tests (pull_request) Successful in 3m6s
Project CI / Backend tests (pull_request) Successful in 6m34s
Project CI / Native shell tests (pull_request) Successful in 19m51s
101eb78ca3
k88936 requested review from kdletters 2026-09-03 20:08:21 +08:00
kdletters requested changes 2026-09-04 11:51:35 +08:00
kdletters left a comment
Member

当前 head 的 UI 测试清理问题和 codex_cli.rs 回退问题已修复,但仍有一个会造成预览状态残留的阻塞问题,另有一项交互契约回归。请修复后重新运行四项必需 CI,并在同步最新 master 后再申请复审。

当前 head 的 UI 测试清理问题和 codex_cli.rs 回退问题已修复,但仍有一个会造成预览状态残留的阻塞问题,另有一项交互契约回归。请修复后重新运行四项必需 CI,并在同步最新 master 后再申请复审。
@@ -224,3 +275,3 @@
kind: 'drag',
treeId: activeImageId,
nodeId: node.id,
nodeId: dragNode.id,
Member

这里将实际拖动目标改为按下前已选中的节点,但下面的 previewNodeIds 仍按命中的 node.id 计算。开启“保持子节点位置”并选中父节点、从某个子节点开始拖动时,emitPreviewTransforms 会写入选中父节点及其全部子节点;cancelGesture 却只清理命中子树,其他子节点的临时变换会在取消/失焦后残留并覆盖真实布局。请按 dragNode.id 计算并补充该场景的取消清理回归测试。

这里将实际拖动目标改为按下前已选中的节点,但下面的 previewNodeIds 仍按命中的 node.id 计算。开启“保持子节点位置”并选中父节点、从某个子节点开始拖动时,emitPreviewTransforms 会写入选中父节点及其全部子节点;cancelGesture 却只清理命中子树,其他子节点的临时变换会在取消/失焦后残留并覆盖真实布局。请按 dragNode.id 计算并补充该场景的取消清理回归测试。
k88936 marked this conversation as resolved
k88936 added 3 commits 2026-09-04 14:47:14 +08:00
按实际拖动目标清理父节点及子节点预览变换

补充保持子节点位置时的取消回归测试

恢复拖动手势阻止浏览器原生文字选择
拖动命中其它节点时保持变换提交到按下前选中节点

补充跨节点拖动不重新选择命中节点的回归测试

避免无效选中节点提前捕获指针
Merge remote-tracking branch 'origin/master' into fix/ui-editor-enexpected-select
Project CI / Repository checks (pull_request) Successful in 8m58s
Project CI / Frontend tests (pull_request) Successful in 25m52s
Project CI / Backend tests (pull_request) Failing after 17m22s
Project CI / Native shell tests (pull_request) Successful in 29m15s
ff599a1b09
Member

[PR270 review] head sha: ff599a1b09

结论:未发现明确问题。已审查实际 base/head diff;定向 UI 测试 21/21 通过,ai-game-creator-shell typecheck 通过。

[PR270 review] head sha: ff599a1b09e209615289af94a65b948df2a35bcd 结论:未发现明确问题。已审查实际 base/head diff;定向 UI 测试 21/21 通过,ai-game-creator-shell typecheck 通过。
k88936 added 1 commit 2026-09-04 15:30:54 +08:00
清理节点指针抬起的无效取消判断
Project CI / Repository checks (pull_request) Successful in 3m16s
Project CI / Frontend tests (pull_request) Successful in 3m34s
Project CI / Backend tests (pull_request) Successful in 8m29s
Project CI / Native shell tests (pull_request) Successful in 20m27s
f3e5849027
移除 onNodePointerUp 中永远不会成立的 pointercancel 类型判断

保留移动且存在待提交变换时的正式更新逻辑
k88936 requested review from kdletters 2026-09-04 15:33:36 +08:00
kdletters merged commit f9e1e5d2a7 into master 2026-09-04 16:30:44 +08:00
kdletters deleted branch fix/ui-editor-enexpected-select 2026-09-04 16:30:44 +08:00
Sign in to join this conversation.