Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions devel/222_36.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
# 222_36 修复数学补全 Tab cycling 弹窗在大符号后位置异常
# 222_36 修复数学补全 Tab cycling 弹窗在大符号后位置异常

## 如何测试

在 mogan 中插入“数学-单行公式”,输入大算符(如 \\iiint),然后按 `I` `I` `Tab` 触发 tab cycling。弹窗应出现在光标附近,而不会被推到很右侧。
在 mogan 中插入“数学-单行公式”, `I` `I` `Tab` 触发 tab cycling。弹窗应出现在光标附近,而不会被推到很右侧。

## 2026/01/28

## 2026/01/30
### Why

Tab cycling 复杂符号时,数学补全弹窗获取光标位置的时序不一致,可能在光标坐标更新前就显示,导致弹窗停留在上一候选的位置。

### What

增加一次事件循环的延迟重定位,等光标位置更新后再移动弹窗,避免因时序不同而偏移。

### How

- `QTMMathCompletionPopup::showMathCompletions` 内新增 `QTimer::singleShot(0, ...)`,在下一轮事件循环重新计算弹窗坐标并移动。


## 2026/01/28
### Why

数学补全弹窗的位置基于缓存的光标坐标计算,在遇到 `math-big-operator` 包裹的大符号时,字形 extents 异常放大,导致 `cached_cursor_x` 极大,弹窗被推到很右侧。

### What

改为优先使用 `QTMWidget` 里真实的光标像素坐标进行定位,并在不可用时回退旧的缓存坐标计算,避免被大符号字形影响。
改为优先使用 `QTMWidget` 里的真实光标像素坐标进行定位,并在不可用时回退旧的缓存坐标计算,避免被大符号字形影响。

### How

- `QTMWidget` 暴露只读的 `cursorPos()` 供弹窗取用。
- `QTMMathCompletionPopup::getCachedPosition` 首选 `cursorPos + origin + surface` 的几何关系计算位置,兜底保留原有计算逻辑。



2 changes: 2 additions & 0 deletions src/Plugins/Qt/QTMMathCompletionPopup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include <QPainter>
#include <QPen>
#include <QTimer>
#include <cmath>

QTMMathCompletionPopup::QTMMathCompletionPopup (QWidget* parent,
Expand Down Expand Up @@ -108,6 +109,7 @@ QTMMathCompletionPopup::showMathCompletions (struct cursor cu, double magf,
raise ();
show ();
this->adjustSize ();
QTimer::singleShot (0, this, [this] () { updatePosition (); });
}

void
Expand Down