Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20260109-0002-TabControl切换后Table新旧内容重叠.md

70 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fix-BUG-20260109-0002
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260109-0002
- 关联 BUG ID: BUG-20260109-0002
- 修复目标: 修复 TabControl 页签切换与 Table 重置数据后出现的新旧内容像素叠加,确保快照机制不被污染。
- 状态:已完成
- 负责人: 未记录
- 分支 / 版本: master / v3.0.0
## 根因分析
- 根因: `Control::setIsVisible(true)` 立即向上 `requestRepaint()`,导致页签切换 / 关闭过程中,父容器可能处于 `hasSnap=0`、`dirty=1` 或刚 `discardBackground()` 的快照未就绪状态。此时 `Canvas::requestRepaint(partial)` 直接对子控件 Table 调用 `draw()`,随后 `saveBackground()` 又把已经包含旧表格像素的屏幕区域截入快照,形成背景快照污染。
- 触发条件: 切换到按钮1页签 -> 重置表格数据 -> 切换 / 关闭其他页签 -> 再切回按钮1;或重置数据当次容器快照未就绪时触发局部重绘。
- 为什么之前没发现:[可选] 历史版本 `setIsVisible(true)` 不会立即 `requestRepaint()`;常规交互未必同时满足页签切换 / 表格重置 / Null 填充 / 透明文字背景的组合条件。
- 关键证据:[可选] 日志中出现 Canvas 丢弃快照后,Table `show=1` 立即触发局部重绘,随后保存 Table 背景快照。
## 修复方案
- 修复思路: 回退 `show=true` 立即请求重绘的行为,并为 Canvas / TabControl 的局部重绘增加快照就绪护栏;当容器快照未就绪或 dirty 未清理时,禁止 partial fast-path,降级为 full draw。
- 关键改动:
- `Control::setIsVisible()` 中 `show=true` 时不再立即 `requestRepaint()`,改为仅置脏;`show=false` 保持擦除逻辑。
- `Canvas::requestRepaint()` 增加护栏,`dirty` / 无快照 / 无缓存图时将 partial 降级为 full draw。
- `TabControl::requestRepaint()` 同步增加局部重绘护栏。
- 可选修正 `Table::setData(vector<string>)` 列补齐 off-by-one,降低潜在越界或异常噪声。
- 涉及文件 / 类 / 函数:
- `Control.cpp`
- `Canvas.cpp`
- `TabControl.cpp`
- `Table::setData()`(可选)
- 影响的 API / 行为:[可选] 对外 API 不变;显示时序与局部重绘降级策略发生内部调整。
- 关键约束 / 不变量:[可选]
- 局部重绘前,父容器必须持有有效快照且不处于 dirty 未清理状态。
- `setIsVisible(true)` 不得在快照未就绪阶段触发子控件抢跑绘制。
- 回滚点 / 开关:[可选] 回退 visible 置脏与 partial 降级护栏。
## 影响评估
- 影响范围: TabControl 页签切换、Canvas 局部重绘、Table 数据重置、背景快照捕获。
- 兼容性影响:无 API 变化;若外部依赖 `show=true` 即刻刷新,需要确保后续绘制收口会触发重绘。
- 行为变化:有(快照未就绪时局部重绘降级为全量重绘)
- 性能影响:在快照未就绪阶段单次重绘成本增加;稳定交互阶段仍保留局部重绘路径。
- 回归风险:
- 降级条件过宽可能导致频繁全量重绘。
- 显示状态更新后,如果外部没有触发任何重绘,可能存在视觉延迟。
- 程序化页签激活流程可能受重绘时序影响,需要回归。
## 验证结果
- 验证步骤:
1. 按稳定复现路径:按钮1 -> 重置表格数据 -> 切换 / 关闭其他页签 -> 切回按钮1,重复 50 次以上。
2. 在按钮1停留时连续快速点击重置 100 次,并穿插页签切换、窗口最小化 / 恢复、拖拽 / resize。
3. 反复对 Table / Canvas 调用 `setIsVisible(false / true)`,确认隐藏擦除正确、显示后无残影。
4. 分别在 TableFillMode 为 Null 与非 Null 模式下验证。
- 验证结果: PDF 历史记录标记已修复。
- 回归检查:[可选] TabControl 切换 / 关闭 / 重复打开、Canvas 添加 / 移除控件与 resize、Table clearData / setData / 翻页、全局窗口 resize / 最小化恢复。
- 验证证据:[可选] PDF 记录中关联 `QQ202619-144430.mp4`。
## 落地信息
- Commit: 5cb59b36525cde93de83313551296c6458694110
- PR:[可选] git 推送
- 发布版本: v3.0.0
- 备注: 来源原始 Fix 记录未包含 `-XXXX` 后缀,入库时按 BUG ID 补充为 `Fix-BUG-20260109-0002`。