73 lines
4.1 KiB
Markdown
73 lines
4.1 KiB
Markdown
# docs/25 文件管理四项:拖拽移动 / 草稿跨窗口 / 未命名默认保存 / 重命名与定位
|
||
|
||
## 1. 左侧栏拖拽移动
|
||
|
||
- 文件、文件夹均可拖到任意文件夹上松手完成移动(底层走 rename_path);
|
||
拖到顶部根目录标题行 = 移回工作区根目录。
|
||
- 投放合法性在拖拽悬停时就判定,不合法的目标不亮、不接受投放:
|
||
- **拖回原文件夹**(原位置)→ 不接受(无操作,避免无意义的报错与刷新);
|
||
- 拖到自己身上 → 不接受;
|
||
- 文件夹拖进自己或自己的子文件夹 → 不接受(App 侧执行时再校验一遍,
|
||
并拦截目标已有同名的情况,报错不覆盖)。
|
||
- 投放目标高亮(accent 描边+弱底色),被拖条目半透明。
|
||
- 移动后已打开的标签路径跟随(含文件夹内的子文档)、最近列表与恢复
|
||
记录键统一换位(remapAfterRelocate,改名共用同一套)。
|
||
|
||
## 2. 新窗口不再重复弹「未保存草稿」
|
||
|
||
根因:恢复记录在全应用共享的 SQLite 里,每个窗口启动都全量扫描并
|
||
按 planRecovery 提示;文档还开在另一个窗口里编辑时,它的自动保存
|
||
记录也被当成了崩溃草稿。
|
||
|
||
修复(services/windowClaims.ts):跨窗口认领注册表(localStorage,
|
||
多窗口同源共享)——每个窗口把「打开中的文档键 + 正在提示的草稿键」
|
||
登记并 10 秒心跳保鲜、关闭时注销;启动扫描滤掉被其他存活窗口认领
|
||
的记录。窗口崩溃残留的认领 45 秒后过期,真正的崩溃草稿不会被吞。
|
||
|
||
## 3. 未命名文档保存默认落工作区根目录
|
||
|
||
- 普通保存(Ctrl+S):有工作区时直接写到根目录的「未命名.md」,
|
||
同名自动避让为「未命名 1.md / 2.md…」(上限 100,仍撞名退回弹框);
|
||
没有工作区才弹保存框(与原来一致)。
|
||
- 另存为仍弹框,但默认位置预填到工作区根目录。
|
||
|
||
## 4. 重命名与打开所在位置
|
||
|
||
- 重命名本来就有(文件/文件夹右键均有),这次补齐短板:改文件夹名时,
|
||
其内已打开的子文档标签、最近列表、恢复记录一并换位(此前只跟随
|
||
恰好同路径的单个文件标签,文件夹内的标签会指向失效路径)。
|
||
- 右键新增「打开所在位置」:新增 Rust 命令 reveal_in_explorer,
|
||
用 explorer /select 打开父目录并选中该文件/文件夹(文件、文件夹
|
||
均有此项)。
|
||
|
||
## 验证
|
||
|
||
- vitest 106+2(新增:window-claims 3 例、路径助手 2 例、文件树拖放
|
||
与定位菜单 5 例);tsc 0 错误;构建通过。
|
||
- 无头浏览器实测:应用启动后认领注册表落盘、打开文档的键即时登记,
|
||
无页面错误。
|
||
- Rust 命令沙箱无工具链未编译(按 commands.rs 既有风格编写),
|
||
待 Windows 构建验证。
|
||
|
||
## 待真机复验
|
||
|
||
- 拖拽手感(WebView2 下 HTML5 拖放)与各拦截提示;
|
||
- 双窗口:窗口 A 编辑未保存 → 开新窗口不再弹草稿;A 崩溃/强杀后
|
||
新窗口仍能收到草稿提示;
|
||
- 未命名保存直接落根目录、避让命名;
|
||
- 「打开所在位置」资源管理器定位效果。
|
||
|
||
## 真机回修(2026-11-14 晚)
|
||
|
||
1. **未命名保存后文件树不刷新**:saveTab 只在新建/新建文件夹流程里刷
|
||
树,保存落点变化(未命名首次保存、另存为)时没刷。已补:writeTextFile
|
||
成功且路径变化时 setTreeRefresh +1。
|
||
2. **侧栏拖拽显示禁止符号、drop 不触发**:实现本身(HTML5 DnD)在
|
||
DOM 层测试是通过的,真机失效的根因是 Tauri 窗口默认开启
|
||
`dragDropEnabled` 原生拖放拦截——它会吞掉 WebView 内的 HTML5 拖拽
|
||
事件(本应用没有任何功能在用原生拖放事件)。主窗口配置
|
||
(tauri.conf.json)与运行时新窗口(WebviewWindow 参数)均已设
|
||
`dragDropEnabled: false`。附带好处:编辑器内 ProseMirror 的文本拖放
|
||
同样被拦截所禁,一并恢复。若真机仍不行,下一步改指针式拖拽
|
||
(pointer events 自绘),不再依赖 HTML5 DnD。
|