Skip to content

[0986] AI 操作栏居中、按选择方向定位、cmd/ctrl+j 接入对话 - #4566

Merged
PinkMagicFly merged 4 commits into
mainfrom
pigmagicfly/0986/ai-bar-position-shortcut
Sep 15, 2026
Merged

PinkMagicFly merged 4 commits into
mainfrom
pigmagicfly/0986/ai-bar-position-shortcut

Conversation

@PinkMagicFly

@PinkMagicFly PinkMagicFly commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

What

AI 操作栏三处交互改进(基于已合并的第二步,选区引用进 AI 侧边栏):

  1. 水平居中:操作栏由「与锚行左缘对齐」改为「居中于最后选中文字所在行」;
  2. 按选择方向定位:从上往下选择显示在最后选中文字(选区底行)的下一行(原行为),从下往上选择显示在最后选中文字(选区顶行)的上一行;首选侧放不下时退到另一侧,最终裁剪到视口内;
  3. cmd/ctrl+j 语义:未选中文字时开关 AI 侧边栏(原语义);有选中文字时直接触发操作栏「对话」——选区以引用块填入当前会话输入区、不自动发送,与点击「对话」按钮一致。

Why

  1. 左缘对齐在长选区/窄末行下视觉偏置,居中更贴合悬浮工具栏惯例;
  2. 操作栏应贴着「最后选中」的一端出现——从下往上选时最后选中的文字在选区顶部,固定显示在选区下方会把栏甩到远离落笔处;
  3. cmd+j 作为 AI 入口,选中文字时用户意图是「对选中内容发起对话」而非开侧边栏,直接路由到操作栏「对话」可免除先找按钮一步。

How

  • 方向判定 edit_interface_rep::selection_made_upward:选区按文档序规范化存储(start ≤ end),方向信息只在光标上——拖拽与 shift+方向键选择结束时光标 tp 停在「最后选中」的一端(mouse_drag 的 p2 与 tp 同源同参,严格相等),path_less_eq (tp, selection_get_start ()) 为真即从下往上选择;选区为空时自然回落到向下。
  • 方向随锚行穿透缓存:方向与锚行在 update_translate_popup 同一时刻确定,经 show_translate_popupqt_simple_widgetpopup->setUpward 存入 popup 缓存,getCachedPosition 只读缓存字段、不回查编辑器活态——避免选区变化后「位置按新方向、锚行是旧的」失配。
  • QTMAiTranslatePopup::getCachedPosition:x 为锚行水平中心减栏宽一半;纵向以方向无关的 first/backup 两候选取首选侧,放不下退另一侧,最终 clampToViewport 收敛。坐标换算与视口裁剪提取为基类 QTMBasePopup::selectionEdgePixels / clampToViewport,基类与派生定位共用。
  • 统一入口 edit_interface_rep::ai_action (action):第二步在 onActionTriggered 槽内的「取选区 + qt_chat_ai_send_selection + dismiss」流程移入此方法(含「选区须在打开侧边栏前捕获」约束),QML 按钮槽改为一行转调,快捷键共用同一入口。
  • 快捷键:Qt 上 cmd/ctrl+j 的真实派发点是 QTMWidget::keyPressEvent 里 [0247] 引入的 C++ 拦截(在 scheme 键位表之前 return,scheme 绑定收不到该键)——拦截改为:有选区先走 ai_action ("chat"),无选区保持原 dock 开关不变。

测试

  • xmake b stem 构建通过;
  • xmake b qml_load_test && xmake r qml_load_test(24/24,AI 操作栏加载与 hover 用例回归);
  • xmake b qt_chat_controller_test && xmake r qt_chat_controller_test(24/24,第二步 composeAiInputBody 用例未破);
  • xmake r chat-list-test:llm 模块 boot 冒烟无错误;
  • Goldfish Scheme v18.11.34 gf fmt --check 全仓通过。

手动验证(用户已完成)

  • 选区后操作栏水平居中于最后选中文字所在行;
  • 从上往下选择 → 出现在最后选中文字下一行;从下往上选择 → 出现在最后选中文字上一行;
  • cmd+j 有选中文字 → 选区以引用块填入 AI 侧边栏输入区、不自动发送;无选中文字 → 开关侧边栏。

任务文档见 devel/0986.md「追加修订(2026-09-15,基于 main;第二步已合并)」。

🤖 Generated with Claude Code

PinkMagicFly and others added 4 commits September 15, 2026 14:18
Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
- 方向在 update_translate_popup 计算一次,经 show_translate_popup →
  setUpward 存入 popup 缓存,getCachedPosition 只读缓存,不再回查编辑器
  活态(修选区变化后方向与锚行失配)
- 坐标换算与视口裁剪提取为 QTMBasePopup::selectionEdgePixels /
  clampToViewport,基类与 AI 操作栏定位共用
- Qt 上 cmd/ctrl+j 由 QTMWidget C++ 拦截派发,scheme 侧的
  ai-chat-shortcut / std j 改绑 / glue ai-action / editor.hpp 虚函数
  四层均不可达,整链移除(ai_action 保留为纯 C++ 方法)
- 任务文档同步为最终实现

Co-Authored-By: Claude Code <noreply@anthropic.com>

@MoonL79 MoonL79 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@PinkMagicFly
PinkMagicFly merged commit 6878edd into main Sep 15, 2026
5 of 6 checks passed
@PinkMagicFly
PinkMagicFly deleted the pigmagicfly/0986/ai-bar-position-shortcut branch September 15, 2026 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants