Files
new-markdown/docs/21-menus-and-toggles.md

2.8 KiB
Raw Permalink Blame History

菜单与切换五项(2026-11-14)

勘误(2026-11-14 晚,见 docs/26):本文 §1 所称「全局监听 contextmenu 屏蔽 WebView 菜单」当时并未真正落进代码(提交里只有文档与说明文字),编辑区右键一直是浏览器自带菜单。屏蔽与编辑区自绘右键菜单已在 docs/26 补齐。

1. 屏蔽浏览器右键菜单

App 全局监听 contextmenu 并 preventDefault:编辑区、标题栏等处不再冒出 WebView 自带菜单;应用自绘菜单(标签/文件树/菜单栏)走各自的 contextmenu 处理,不受影响。文本输入框(input/textarea)保留系统菜单,方便粘贴。

2. 菜单点别处不消失——全量排查与统一修复

排查结论:菜单栏下拉本身有外部 mousedown + Esc 关闭(正常);文件树菜单 只监听 window click(右键点别处、滚动时不关);标签右键菜单只在标签栏 内部点击时关闭,点编辑区/侧边栏都不消失(实测确认)。 新增共享 hook src/hooks/useDismiss.ts:捕获阶段监听 mousedown/contextmenu (先于 React 的 contextmenu 处理,右键另一个标签时先关旧再开新)、Esc、 窗口失焦、菜单外滚动,统一应用到标签菜单与文件树菜单;菜单栏维持原实现。

3. 左侧栏收起

开关逻辑本身正常(视图菜单与 Ctrl+Shift+L 实测可收起),问题在侧栏自身 没有入口、必须去菜单里找。侧栏页签行右侧新增收起按钮(‹);收起后编辑区 左上角出现展开按钮(›)。菜单与快捷键保持不变。

4. 源码模式切换按钮

编辑区右下角新增浮动按钮:渲染模式下显示「源码模式」、源码模式下显示 「即时渲染」,一键切换,不必再去视图菜单。打印时隐藏。

5. 右键菜单补文件类动作

  • 标签右键:新增 保存(未修改时禁用)、另存为…、在新窗口打开(桌面模式)、 导出…、打印 / 导出 PDF…,与原有关闭类动作以分隔线分组。动作针对被右键 的标签:导出/打印会先激活该标签再执行,不必先手动切过去。
  • 文件树右键(文件条目):新增 在新窗口打开(桌面模式)、另存为…、导出…、 打印 / 导出 PDF…。文件未打开时先打开/激活再执行(withOpenedTab)。

验证

  • tsc 0 错误;vitest 97 通过 + 2 跳过(新增 tests/context-menus.test.tsx: 两类菜单的条目、回调、点别处关闭)。
  • 无头浏览器实测:编辑区 contextmenu 已被 preventDefault;标签菜单条目齐全、 点编辑区后关闭;收起/展开按钮往返正常;源码按钮切换后源码编辑器出现、 按钮文案翻转为「即时渲染」。
  • 待真机验:桌面模式下「在新窗口打开」两处入口、文件树导出/打印的先开后行链路。