Files
new-markdown/docs/25-文件管理四项.md

73 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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。