Skip to content

[201_63] 悬浮窗口根据选中内容实时变化初步实现#3084

Open
jackmath5261-bit wants to merge 9 commits intomainfrom
jie/201_63/text_toolbar
Open

[201_63] 悬浮窗口根据选中内容实时变化初步实现#3084
jackmath5261-bit wants to merge 9 commits intomainfrom
jie/201_63/text_toolbar

Conversation

@jackmath5261-bit
Copy link
Copy Markdown
Contributor

No description provided.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Apr 1, 2026

Greptile Summary

本 PR 实现了悬浮工具栏根据选中内容实时切换显示内容的功能,将原先单一的 text-toolbar-icons 按上下文(文本/数学/表格/章节/语义块)拆分为五套子工具栏,并在 C++ 侧引入 updateButtonsFromScheme 以支持原地复用按钮、减少重建开销。

  • prepareTextToolbarButtonaction->setChecked(action->isCheckable()) 将所有可勾选按钮强制标记为"已选中",覆盖了 Scheme 侧根据 (numbered-numbered? t)(has-style-package? \"framed-theorems\") 等谓词计算的正确勾选状态,导致章节/语义块工具栏中的 toggle 按钮视觉状态永远为"激活",与实际文档状态不符。

Confidence Score: 4/5

存在一个 P1 逻辑缺陷需在合并前修复:toggle 按钮的勾选状态被强制覆盖,导致视觉反馈与文档实际状态不符。

整体架构设计合理,上下文分发逻辑清晰,原地更新优化有效解决了之前历史线程中提出的性能问题。唯一需要修复的是 prepareTextToolbarButton 中 action->setChecked(action->isCheckable()) 这一行,它导致"Numbered"/"Framed theorems"等 check 按钮的勾选状态始终显示为激活,与 Scheme 侧谓词的计算结果相悖。

src/Plugins/Qt/QTMTextToolbar.cpp 第 48 行需重点关注

Vulnerabilities

未发现安全问题。变更限于工具栏 UI 逻辑,不涉及网络、文件 I/O、输入校验或权限边界。

Important Files Changed

Filename Overview
src/Plugins/Qt/QTMTextToolbar.cpp 新增 updateButtonsFromScheme 实现原地复用按钮的优化路径,并将按钮初始化提取为 prepareTextToolbarButton;但该函数中 action->setChecked(action->isCheckable()) 强制将所有可勾选按钮设为已选中,覆盖了 Scheme 侧计算的正确状态,导致"Numbered"/"Framed theorems"等 check 按钮显示不正确。
TeXmacs/progs/generic/text-toolbar.scm 核心改动:将 text-toolbar-icons 拆分为 text/math/table/chapter/semantic 五类子工具栏,并实现了 text-toolbar-context 分发逻辑;新增了 selection-tree-modes、selection-content-mode 等模式检测工具函数。
src/Edit/Interface/edit_mouse.cpp 将 should_show_text_toolbar 中硬编码的四个模式检查统一委托给 Scheme 侧的 text-toolbar-allowed-context?,逻辑简洁且向后兼容。
src/Plugins/Qt/QTMTextToolbar.hpp 补充了 QAction / QToolButton 头文件引用,声明了 updateButtonsFromScheme 和 prepareTextToolbarButton 两个新方法,变更纯属接口扩展,无问题。
TeXmacs/progs/init-research.scm 将 text-toolbar 模块的加载移至启动初始化阶段,避免了每次 rebuildButtonsFromScheme 时重复加载。
TeXmacs/misc/themes/liii.css 为 text-toolbar-button 新增 :checked 和 :checked:hover 状态样式,与亮色主题色调一致。
TeXmacs/misc/themes/liii-night.css 为暗色主题新增对应的 :checked 状态样式,与亮色主题同步。
TeXmacs/tests/201_63.scm 测试用例同步扩展,新增图片选区和目录选区不显示工具栏的覆盖场景。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[选区变化 / 鼠标抬起] --> B[should_show_text_toolbar]
    B --> C{text-toolbar-allowed-context?}
    C -- false --> D[隐藏工具栏]
    C -- true --> E[showTextToolbar]
    E --> F[updateButtonsFromScheme]
    F --> G{layout数量与新列表相同?}
    G -- 是 --> H[原地更新按钮 in-place]
    G -- 否 --> I[clearButtons + 重建]
    H --> J[prepareTextToolbarButton]
    I --> J
    J --> K[⚠️ setChecked 强制=isCheckable]
    K --> L[工具栏显示]
Loading

Reviews (8): Last reviewed commit: "text-toolbar-chapter-icons支持显示选中态" | Re-trigger Greptile

@jackmath5261-bit jackmath5261-bit force-pushed the jie/201_63/text_toolbar branch from 241275d to 5500de4 Compare April 2, 2026 09:08

// Match focus-toolbar semantics: a check-backed toolbar action is rendered
// selected whenever TeXmacs marks it as checkable.
action->setChecked (action->isCheckable ());
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.

P1 setChecked 强制覆盖了 Scheme 计算出的正确勾选状态

action->setChecked(action->isCheckable()) 将所有"可勾选"的 action 无条件设为 checked=true,从而覆盖了 TeXmacs Scheme 侧根据实际内容计算出的勾选状态。

受影响场景:

  • 无编号章节(section* 等)(numbered-numbered? t) 返回 #f,对应 action 的 isChecked() 应为 false,但被强制改为 true,导致"Numbered"按钮永远显示为已选中。
  • 未启用 framed-theorems(has-style-package? "framed-theorems") 返回 #f,但"Framed theorems"按钮仍显示为已激活。
  • 章节标题对齐按钮(== (safe-init-env var) "left") / "center" 等条件均可能被错误覆盖。

正确做法是直接使用 action 在 Scheme 侧已计算好的状态,去掉这一行:

Suggested change
action->setChecked (action->isCheckable ());
// button checked state is determined by TeXmacs Scheme side at action creation time

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.

1 participant