完成 StellarX 核心重构、缺陷修复与测试收口

This commit is contained in:
Codex
2026-09-30 01:23:18 +08:00
parent 9155a86a8a
commit 568ffc40eb
85 changed files with 5011 additions and 645 deletions
@@ -0,0 +1,66 @@
# Fix-BUG-20260929-0001
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260929-0001
- 关联 BUG ID: BUG-20260929-0001
- 修复目标: 避免 Table 运行期重置后的分页按钮旧快照覆盖新页码
- 状态:已完成
- 负责人: Codex
- 分支 / 版本: 当前工作区
## 根因分析
- 根因: `Table::draw()` 先通过 `drawPageNum()` 绘制新页码,随后 `drawButton()` 才重新定位上一页和下一页按钮。按钮的 `setX()/setY()` 会回贴旧位置背景快照;当旧按钮区域与新页码位置相交时,新页码被局部擦除。
- 触发条件: 运行期替换表头或数据后,表格宽度和分页控件位置发生变化。
- 为什么之前没发现: 既有检查覆盖普通翻页重绘,但没有覆盖“表格结构尺寸变化 + 三个分页控件同帧搬移”的首帧顺序。
- 关键证据: 后续 hover 只触发重绘、不再改变分页控件位置,此时页码立即恢复完整,说明页码内容和设脏逻辑本身有效。
## 修复方案
- 修复思路: 将分页内部控件的布局刷新前移到 Table 新一帧绘制之前。先更新页码文本,再统一移动页码 Label 和两个分页按钮并清理旧快照,最后绘制表体、页码和按钮。
- 关键改动:
- 集中生成当前页码文本,避免布局阶段和绘制阶段使用不同字符串。
- 当分页布局失效时,在 Table 回贴并重绘自身之前完成页码 Label 的尺寸、位置和文本更新。
- 在同一预布局阶段完成上一页、下一页按钮的位置更新,确保旧快照不会覆盖本帧已经绘制的分页元素。
- 保留最终“表体 -> 页码 -> 分页按钮”的绘制顺序。
- 涉及文件 / 类 / 函数:
- `src/StellarX/Table.cpp`
- `Table::draw()`
- `Table::drawPageNum()`
- 影响的 API / 行为: 无公共 API 变化;仅修正运行期重置后的首帧绘制结果。
- 关键约束 / 不变量: Table 内部控件因布局变化产生的旧快照回贴必须发生在父 Table 绘制新内容之前。
- 回滚点 / 开关: 回退 `Table::draw()` 中的分页预布局块及统一页码文本生成函数。
## 影响评估
- 影响范围: Table 数据、表头、每页行数变化后的分页区重绘。
- 兼容性影响:无
- 行为变化:有(重置后的首帧直接显示完整页码)
- 性能影响:可忽略,仅在分页布局失效时提前执行原有位置刷新。
- 回归风险:
- 透明 Table 背景下的分页区快照恢复顺序变化。
- 页码位数变化造成 Label 宽度变化时,需要确认左右按钮仍与页码保持正确间距。
- 隐藏分页按钮后再恢复显示时,需要确认按钮仍能初始化并正确定位。
## 验证结果
- 验证步骤:
1. 执行 `scripts/test.ps1 -Suite NonUI`。
2. KEY1 页签 1 点击页内按钮后,不移动鼠标立即检查完整页码。
3. 连续重置三次,并执行上一页、下一页切换。
4. hover 页签 2、页签 3 并切换后返回,确认分页区无残影。
- 验证结果: 2026-09-29 执行 `scripts/test.ps1 -Suite NonUI`,Debug x64、Debug x64 ASan、Release x64、Debug Win32 均为 15/15 通过;ASan 未报告内存错误;KEY1 至 KEY6 均编译、链接通过。用户于 2026-09-30 完成 KEY1 至 KEY6 手工回归,暂未发现明显问题。
- 回归检查: KEY1 表格重置与翻页;KEY5 Table 分页、页码和上层浮层。
- 验证证据:[可选]
## 落地信息
- Commit: 未提交
- PR:[可选]
- 发布版本:[可选]
- 备注: UI 像素结果已由用户按 `TESTING.md` 完成人工验收。