65 lines
3.1 KiB
Markdown
65 lines
3.1 KiB
Markdown
# Fix-BUG-20251209-0001
|
||
|
||
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
|
||
|
||
## 关联信息
|
||
|
||
- Fix ID: Fix-BUG-20251209-0001
|
||
- 关联 BUG ID: BUG-20251209-0001
|
||
- 修复目标: TabControl 由不可见变为可见时,仅绘制激活页;无激活页时不绘制任何页,避免页面重叠和脏帧。
|
||
- 状态:已完成
|
||
- 负责人: 未记录
|
||
- 分支 / 版本: master / v2.3.2
|
||
|
||
## 根因分析
|
||
|
||
- 根因: `TabControl::setIsVisible(true)` 对所有页签 / 页面统一传播 true 并置脏,导致恢复可见后本应不可绘制的非激活页也进入绘制流程。
|
||
- 触发条件: 执行 `setIsVisible(false)` 后再执行 `setIsVisible(true)`。
|
||
- 为什么之前没发现:[可选] 缺少“隐藏 -> 显示”回归用例,尤其缺少“多个页面但只允许激活页绘制”的断言。
|
||
- 关键证据:[可选] PDF 历史记录明确将疑似位置定位到 `TabControl::setIsVisible()` 与 `show` 状态传播。
|
||
|
||
## 修复方案
|
||
|
||
- 修复思路: TabControl 可见性向页面传播时按激活状态过滤;显示时只允许激活页可见,隐藏时所有页都不可见。
|
||
- 关键改动:
|
||
- `TabControl.cpp::setIsVisible()` 在参数为 true 时,根据激活页判定对子页面传递 true / false。
|
||
- 参数为 false 时,对所有页面传递 false。
|
||
- 绘制入口可选择增加“仅绘制激活页”的防御性约束。
|
||
- 涉及文件 / 类 / 函数:
|
||
- `TabControl.cpp`
|
||
- `TabControl::setIsVisible()`
|
||
- 影响的 API / 行为:[可选] 对外 API 无变化;行为层面修正错误绘制。
|
||
- 关键约束 / 不变量:[可选] 任意时刻可参与绘制的页面集合最多只有一个激活页。
|
||
- 回滚点 / 开关:[可选] 回退 TabControl 页面可见性传播逻辑。
|
||
|
||
## 影响评估
|
||
|
||
- 影响范围: TabControl 隐藏 / 显示、页面激活状态、页面绘制链路。
|
||
- 兼容性影响:无(纠错式兼容)
|
||
- 行为变化:有(非激活页不再随 TabControl 显示而被绘制)
|
||
- 性能影响:无负面影响,减少非激活页绘制后预期更优或持平。
|
||
- 回归风险:
|
||
- 如果激活判定逻辑异常导致“无激活页”,恢复显示后会表现为空白页;该行为符合修复目标。
|
||
- 如果外部代码错误依赖非激活页仍可见,可能观察到行为差异。
|
||
|
||
## 验证结果
|
||
|
||
- 验证步骤:
|
||
|
||
1. 创建含不少于 2 个页的 TabControl,并设置激活页为 0。
|
||
2. 调用 `setIsVisible(false)`,再通过事件调用 `setIsVisible(true)`。
|
||
3. 确认仅激活页显示,非激活页不绘制、不重叠。
|
||
4. 切换激活页后重复隐藏 / 显示,确认仍只绘制当前激活页。
|
||
5. 验证无激活页场景,确认不绘制任何页。
|
||
|
||
- 验证结果: PDF 历史记录标记已修复。
|
||
- 回归检查:[可选] 嵌套容器可见性、裁剪、鼠标事件命中、布局刷新、脏标记 / 快照重绘路径。
|
||
- 验证证据:[可选]
|
||
|
||
## 落地信息
|
||
|
||
- Commit: 0c1cf2938f0d6c5684eeb318f17a8443e0c8cf5a
|
||
- PR:[可选] git
|
||
- 发布版本: v2.3.2
|
||
- 备注: 来源原始 Fix 记录未包含 `-XXXX` 后缀,入库时按 BUG ID 补充为 `Fix-BUG-20251209-0001`。
|