[Feature] 对话空白区右键改为四向环形快捷菜单 #1909
Description
Problem / 问题
在对话正文的空白处右键,目前弹出的是纵向列表:复制整段对话、全选对话文本、跳到顶部、跳到底部(conversationMenuItems,见 apps/desktop/src/features/chat/transcript/menu-items.tsx)。这几个动作在长对话里用得不少,但列表要点过去,指针要移动、瞄准。
截图里的四向环形菜单以指针为圆心,指针往哪个方向甩就落到哪个动作。空白区如果换成这个形态,同样四个动作,操作路径会短一些。
Proposed change / 期望改动
只改对话正文空白区的右键(消息行、链接、文件引用的菜单不动),弹出环形菜单:
- 圆心在指针位置,四个扇区,图标居中;
- 指针进入扇区高亮,选中后执行并关闭;Esc 或移出圆环取消;
- 方向键选择 + Enter 作为键盘等价操作;
- 首版固定四项,不做子菜单。
四向放什么,有两种取法,想请作者定:
A. 沿用现在空白区的四个动作:上=复制整段对话,右=全选对话文本,下=回到最新,左=跳到顶部。
B. 按截图的全局动作:上=工作区文件(打开项目目录或文件管理器),右=浏览器(内置或默认),下=工作面板,左=引用/插入(截图是 #,PI 里没有现成对应,需要确认是指 @ 文件引用、/ 命令还是别的)。
我倾向 A:动作词汇现成,改动只在渲染层。B 更接近截图,但要新增「当前会话对应的工作区/终端」这类入口,而桌面端目前没有终端面板,IconTerminal 只用于工具类型图标。
Feasibility / 可行性
ContextMenu 已经把动作数据和渲染分开了:useContextMenu 负责 preventDefault、记录指针位置和选区快照,ContextMenu 负责 portal、边缘夹取、焦点和键盘。环形版本可以复用同一份 state 和 items,只替换渲染和命中判定(按角度、半径分扇区),各调用点的业务逻辑不用动。
需要确认的几点:
- 交互按哪种:右键弹开后移动并单击扇区,还是按住右键拖向某个方向后松开。
- 只改空白区,还是消息行也换成环形。我建议只改空白区,消息行的条目随消息类型变化,列表更稳。
- 是否加设置开关;加的话默认开还是关。
- 是否要支持四项以上。固定四项时扇区角度好算,也和截图一致。
- 无障碍:方向键 + Enter 是否够,还是需要保留列表作为替代入口。
Alternatives / 其他方案
继续用纵向列表;或按住修饰键再右键才出环形;或把「复制对话」「回到最新」做成悬浮按钮,不占右键。
Additional context / 补充信息
参照截图的布局:
文件夹
↑
# ← ○ → 地球
↓
终端
相关:#567 讲的是补齐各处缺失的右键菜单(列表形态),与这里的形态改动不冲突。其中第 3、4 条在现在的 main 上已经不成立:transcript 已有 conversationMenuItems,工作面板标签也在 #1904 补了菜单。
Activity
Linuxdazhao commentedon Oct 27, 2026
补一张示意图,A、B 两种四向取法并排放:
B 里画虚线的两项(引用/插入、终端)是照截图列的,PI 桌面端目前没有对应入口。
Linuxdazhao commentedon Oct 27, 2026
@vastsa 按 CONTRIBUTING 的窗口期规则,这里作为功能请求记录,不提议
featPR。想请你确认方向本身:如果你们计划做,我可以把实现要点整理成草案贴在这里:
ContextMenu加环形渲染分支、只接空白区、方向键 + Enter、Esc 关闭、补 E2E 场景和09-interaction-patterns的说明。需要补丁我也可以给,是否合并按你们的排期走。vastsa commentedon Oct 27, 2026
您好,欢迎提 PR,这个想法非常 nice,获取可以放在设置里面自定义,由用户决定他们需要什么快捷方式
vastsa commentedon Oct 27, 2026
完成之后直接@我合入即可,感谢您的时间
Linuxdazhao commentedon Oct 27, 2026
@vastsa PR 提好了:#1919
按你的建议做了设置项:设置 → AI → 环形右键菜单,一个总开关加四个方向选择器,方向可选复制整段对话 / 全选对话文本 / 复制最后一条回复 / 跳到顶部 / 回到最新 / 留空。开关默认关闭,不改变现有纵向菜单;只有空白区右键走环形,消息、链接、文件引用、侧边栏和工作面板的菜单不变。
规范(
09-interaction-patterns§1.11、06-settings-ia)和 E2E 场景已同步,九个语言包都补了文案。有个情况说明一下:这个 worktree 里 Electron 二进制没下载下来,所以环形菜单还没在真实窗口里跑过,单元测试和构建都过了,UI 部分需要你在本地看一眼。