4.1 KiB
4.1 KiB
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 晚)
- 未命名保存后文件树不刷新:saveTab 只在新建/新建文件夹流程里刷 树,保存落点变化(未命名首次保存、另存为)时没刷。已补:writeTextFile 成功且路径变化时 setTreeRefresh +1。
- 侧栏拖拽显示禁止符号、drop 不触发:实现本身(HTML5 DnD)在
DOM 层测试是通过的,真机失效的根因是 Tauri 窗口默认开启
dragDropEnabled原生拖放拦截——它会吞掉 WebView 内的 HTML5 拖拽 事件(本应用没有任何功能在用原生拖放事件)。主窗口配置 (tauri.conf.json)与运行时新窗口(WebviewWindow 参数)均已设dragDropEnabled: false。附带好处:编辑器内 ProseMirror 的文本拖放 同样被拦截所禁,一并恢复。若真机仍不行,下一步改指针式拖拽 (pointer events 自绘),不再依赖 HTML5 DnD。