Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20260511-0012-Tooltip临时coverage与持久coverage拆分修复.md
Codex 9155a86a8a 发布前托管重绘与布局封版收口
收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
2026-05-17 00:26:08 +08:00

69 lines
3.1 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-20260511-0012
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260511-0012
- 关联 BUG ID: BUG-20260511-0012
- 修复目标: 区分 Tooltip 临时浮层 coverage 与会污染背景快照的持久 coverage
- 状态:已完成
- 负责人: Codex
- 分支 / 版本: 当前工作区
## 根因分析
- 根因: 托管重绘只有一类 coverage,既用于完整绘制范围判断,也用于兄弟控件背景快照刷新判断。Tooltip 属于临时浮层,不应进入后者。
- 触发条件: Tooltip coverage 覆盖到后序兄弟控件,兄弟控件被局部 overlay 补画。
- 为什么之前没发现:[可选] 需要 Tooltip 与透明 Label 或带快照兄弟控件重叠。
- 关键证据:[可选] 透明 Label 已设置 `setTextdisap(true)`,但 `draw()` 仍会先回贴背景快照。
## 修复方案
- 修复思路: 拆分完整 coverage 与持久 coverage。Tooltip 进入完整 coverage,用于 Window/Dialog overlay 判断;但不进入持久 coverage,避免兄弟控件刷新快照时捕获 Tooltip。
- 关键改动:
- `Control` 新增内部虚函数 `getManagedRepaintPersistentCoverageRect()`
- `Button` 的完整 coverage 包含 Tooltip,持久 coverage 仅包含按钮本体。
- `Canvas / TabControl / Table` 递归合并子控件持久 coverage。
- `Canvas / TabControl` 局部提交中,只有命中持久 coverage 的兄弟控件才作废快照并补画。
- 只命中 Tooltip 等临时 coverage 的兄弟控件不再补画,避免透明控件回贴旧快照擦掉 Tooltip。
- 涉及文件 / 类 / 函数:
- `Control.h / Control.cpp`
- `Button.h / Button.cpp`
- `Canvas.h / Canvas.cpp`
- `TabControl.h / TabControl.cpp`
- `Table.h / Table.cpp`
- 影响的 API / 行为:[可选] 新增内部 virtual 接口,无公开用户 API 变化。
- 关键约束 / 不变量:[可选] Tooltip 智能选位仍不在本轮范围内。
- 回滚点 / 开关:[可选] 回退持久 coverage 拆分逻辑。
## 影响评估
- 影响范围: Tooltip、Canvas / TabControl 局部 overlay 补画、背景快照捕获。
- 兼容性影响:无
- 行为变化:有(Tooltip 作为临时浮层时,不再触发普通兄弟控件补画)
- 性能影响:轻微(多维护一组矩形并集和相交判断)
- 回归风险:
- 如果某控件持久 coverage 定义过小,可能漏补兄弟快照。
- Tooltip 会短暂显示在同容器后序普通控件上方,这是本轮有意选择。
## 验证结果
- 验证步骤:
1. 编译 `Control.cpp / Button.cpp / Canvas.cpp / TabControl.cpp / Table.cpp / Window.cpp`
2. 编译 `z-testDome.cpp``KEY1 ~ KEY6`
3. 手测 KEY6 A 区禁用按钮 Tooltip 与状态 Label 交叠。
4. 手测 TabControl 页签 / 页面内 Tooltip。
- 验证结果: 编译通过;GUI 行为待用户手测
- 回归检查:[可选] KEY6 A 区、KEY5 Tooltip/overlay、KEY4 Dialog overlay
- 验证证据:[可选]
## 落地信息
- Commit: 未提交
- PR[可选]
- 发布版本:[可选]
- 备注: 下版本可进一步引入 actual coverage 返回值和正式 coverage 诊断日志。