Skip to content

fix(state): 拖动窗格内最后一个 tab 到自身边缘会直接丢失该 tab - #763

Open
nanami-0713 wants to merge 1 commit into
omdsh-dev:mainfrom
nanami-0713:fix/movetab-self-edge
Open

nanami-0713 wants to merge 1 commit into
omdsh-dev:mainfrom
nanami-0713:fix/movetab-self-edge

Conversation

@nanami-0713

Copy link
Copy Markdown

问题

moveTabToEdge(src/client/state.ts)对边缘 zone(left/right/up/down)的处理顺序是先摘 tab、后切分:

  1. 把 tab 从源窗格移除;若源窗格因此清空,removeLeafAt 立即把该叶子从树上删除
  2. 之后 insertLeafAt 以 toPane 为目标插入新叶子

当 fromPane === toPane(把窗格内唯一的 tab 拖到它自己窗格的边缘热区——小窗格下四边 25% 的边缘带很容易误触)时,第 1 步已把目标叶子删除,第 2 步的 mapLeaf 找不到该 id,原样返回树——携带着被拖 tab 的新叶子成为孤儿被整体丢弃。

实际后果:tab 从会话中彻底消失(未保存的 CodeMirror 草稿一并丢失),activePane 悬挂为不存在的 id,且布局在 200ms 防抖后把无 tab 状态持久化到 localStorage,刷新无法恢复。

现有测试(tests/state.spec.ts 的 moveTabToEdge 用例)只覆盖了跨窗格、center 与幽灵窗格场景,未覆盖自拖边缘。

修复

边缘 zone 改为先切分、后摘 tab:insertLeafAt 完成时目标叶子仍在树上(自身拖拽时以 target 副本保留原 id),随后的摘除与清空删除逻辑不变;center 路径行为保持原样。

测试

  • 单 tab 自拖边缘:旧代码丢 tab(测试在未修复代码上失败),新代码原地切分为新叶子,activePane 指向新叶子
  • 多 tab 自拖边缘:被拖 tab 进入新叶子,其余留在原叶子(与既有行为一致)

…ses the tab

moveTabToEdge 对边缘 zone 先把 tab 从源窗格摘除:若源窗格因此清空,
removeLeafAt 会把该叶子从树上删除;随后的 insertLeafAt 再以同一 id
为目标时已找不到叶子,携带被拖 tab 的新叶子成为孤儿被整体丢弃——
tab 从会话中消失(未保存的编辑器草稿一并丢失),activePane 悬挂,
且布局在 200ms 防抖后把无 tab 状态持久化到 localStorage。

改为边缘 zone 先切分目标窗格、再摘 tab:insertLeafAt 完成后目标
叶子仍在树上(自身拖拽时以 target 副本保留原 id),摘除/清空删除
逻辑不变;center 路径行为保持原样。

新增回归测试:单 tab 自拖边缘(旧代码丢 tab,新代码原地切分)、
多 tab 自拖边缘(被拖 tab 进入新叶子,其余留在原叶子)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant