发布前托管重绘与布局封版收口
收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# BUG-20260511-0009
|
||||
|
||||
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
|
||||
|
||||
## 基本信息
|
||||
|
||||
- ID: BUG-20260511-0009
|
||||
- 标题: TabControl::indexOf 未命中时返回最后索引
|
||||
- 状态:已修复
|
||||
- 严重性:S3
|
||||
- 优先级:P2
|
||||
- 模块: TabControl
|
||||
- 版本 / 分支: 当前工作区
|
||||
- 环境: Windows / EasyX / z-testDome 回归场景
|
||||
- 发现人: Codex 巡检
|
||||
- 关联 Fix ID: Fix-BUG-20260511-0009
|
||||
|
||||
## 问题描述
|
||||
|
||||
- 现象: `TabControl::indexOf(const std::string& tabText) const` 在未找到目标页签时返回循环后的最后索引。
|
||||
- 影响范围: 依赖 `indexOf()` 判断页签是否存在的调用方可能把“不存在”误判为最后一个页签。
|
||||
- 期望结果: 找到匹配页签时返回对应索引;未找到时返回 `-1`。
|
||||
- 实际结果: 未找到时返回最后一个页签的索引。
|
||||
|
||||
## 复现信息
|
||||
|
||||
- 前置条件:[可选]
|
||||
- 复现步骤:
|
||||
|
||||
1. 构造包含至少一个页签的 `TabControl`。
|
||||
2. 调用 `indexOf()` 查询不存在的页签文本。
|
||||
3. 观察返回值。
|
||||
|
||||
- 复现概率:必现
|
||||
- 最小复现 Demo:[可选]
|
||||
- 证据:源码巡检可证
|
||||
|
||||
## 初步分析
|
||||
|
||||
- 疑似位置: `TabControl.cpp::indexOf`
|
||||
- 触发条件: 查询文本不存在。
|
||||
- 相关线索: 函数名和预期语义要求“不存在返回 -1”,但旧实现返回 `idx`。
|
||||
- 最近相关改动:[可选]
|
||||
|
||||
## 跟踪信息
|
||||
|
||||
- 首次发现时间: 2026-05-11
|
||||
- 最后更新时间: 2026-05-11
|
||||
- 修复版本: 当前工作区
|
||||
- 验证版本: KEY1 ~ KEY6 编译验证通过
|
||||
- 备注:[可选]
|
||||
@@ -0,0 +1,52 @@
|
||||
# BUG-20260511-0010
|
||||
|
||||
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
|
||||
|
||||
## 基本信息
|
||||
|
||||
- ID: BUG-20260511-0010
|
||||
- 标题: 局部提交内部 coverage 扩张未反馈导致 Dialog 漏补
|
||||
- 状态:已修复
|
||||
- 严重性:S2
|
||||
- 优先级:P1
|
||||
- 模块: Window / Canvas / Dialog / 托管重绘
|
||||
- 版本 / 分支: 当前工作区
|
||||
- 环境: Windows / EasyX / KEY6
|
||||
- 发现人: 用户
|
||||
- 关联 Fix ID: Fix-BUG-20260511-0010
|
||||
|
||||
## 问题描述
|
||||
|
||||
- 现象: KEY6 中非模态 Dialog 打开后,触发旁边按钮 Tooltip,某些位置会导致下层按钮重绘覆盖 Dialog。
|
||||
- 影响范围: 可局部提交的 root 在内部补画兄弟控件后,如果实际写屏范围扩大,Window 可能仍按初始 coverage 判断上层 overlay。
|
||||
- 期望结果: 下层 root 内部扩张后的实际写屏区域能触发上层 Dialog 补画。
|
||||
- 实际结果: Window 使用初始 coverage,导致 Dialog overlay 补画漏判。
|
||||
|
||||
## 复现信息
|
||||
|
||||
- 前置条件:[可选] 打开 KEY6,触发非模态 `AbortRetryIgnore` 对话框。
|
||||
- 复现步骤:
|
||||
|
||||
1. 最大化窗口。
|
||||
2. 打开 KEY6 非模态 `AbortRetryIgnore` 对话框。
|
||||
3. 在 `RetryCancel` 按钮特定区域触发 Tooltip。
|
||||
4. 观察非模态 Dialog 是否被下层按钮局部重绘覆盖。
|
||||
|
||||
- 复现概率:高概率
|
||||
- 最小复现 Demo:KEY6
|
||||
- 证据:临时 `OverlayTemp` 日志显示 Canvas 内部 coverage 从 `(250,512,490,583)` 扩张到 `(250,512,700,583)`,但 Window 仍用旧 working coverage 判断 Dialog,相交结果为 `hit=0`。
|
||||
|
||||
## 初步分析
|
||||
|
||||
- 疑似位置: `Window::flushManagedRepaint()` 与 `Canvas::requestRepaint(this)` 的 coverage 交接。
|
||||
- 触发条件: root 支持局部提交,内部补画后序兄弟导致实际 coverage 扩张。
|
||||
- 相关线索: Dialog 区域与内部最终 coverage 相交,但与 Window 初始 working coverage 不相交。
|
||||
- 最近相关改动:[可选] 托管局部重绘与 overlay 补画收口。
|
||||
|
||||
## 跟踪信息
|
||||
|
||||
- 首次发现时间: 2026-05-11
|
||||
- 最后更新时间: 2026-05-11
|
||||
- 修复版本: 当前工作区
|
||||
- 验证版本: KEY6 编译通过,待用户手测
|
||||
- 备注:[可选] 精确 actual coverage 回传作为下版本优化项。
|
||||
@@ -0,0 +1,51 @@
|
||||
# BUG-20260511-0011
|
||||
|
||||
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
|
||||
|
||||
## 基本信息
|
||||
|
||||
- ID: BUG-20260511-0011
|
||||
- 标题: 跨 root 回调改脏未同轮提交导致 Label 延迟刷新
|
||||
- 状态:已修复
|
||||
- 严重性:S3
|
||||
- 优先级:P1
|
||||
- 模块: Window / 托管重绘 / Label / TabControl
|
||||
- 版本 / 分支: 当前工作区
|
||||
- 环境: Windows / EasyX / KEY6
|
||||
- 发现人: 用户
|
||||
- 关联 Fix ID: Fix-BUG-20260511-0011
|
||||
|
||||
## 问题描述
|
||||
|
||||
- 现象: KEY6 中点击 Right 页签内按钮后,A 区状态 Label 不立即刷新,需要下一次左键消息才显示。
|
||||
- 影响范围: 事件回调修改了另一个顶层 root 下的控件状态时,目标 root 可能不会进入本轮托管重绘队列。
|
||||
- 期望结果: 回调中改脏的跨 root 控件能在同一轮事件尾刷新。
|
||||
- 实际结果: 只有当前事件分发链所在 root 被提交,其他 root 的 dirty 子树滞留到下一次事件。
|
||||
|
||||
## 复现信息
|
||||
|
||||
- 前置条件:[可选] 打开 KEY6,激活右侧页签第一页。
|
||||
- 复现步骤:
|
||||
|
||||
1. 点击 Right 页签中的“页内按钮”。
|
||||
2. 观察 A 区状态 Label。
|
||||
3. 再点击空白处或其他控件。
|
||||
|
||||
- 复现概率:必现
|
||||
- 最小复现 Demo:KEY6
|
||||
- 证据:`Label::setText()` 只标脏目标 Label,不主动把其所属 `shapePanel` root 登记到 Window。
|
||||
|
||||
## 初步分析
|
||||
|
||||
- 疑似位置: `Window` 事件尾托管重绘收口。
|
||||
- 触发条件: 当前事件 root 与被回调修改的目标 root 不同。
|
||||
- 相关线索: A 区 Label 在下一次左键消息后才刷新,说明 dirty 状态存在但未同轮提交。
|
||||
- 最近相关改动:[可选] 托管重绘统一收口。
|
||||
|
||||
## 跟踪信息
|
||||
|
||||
- 首次发现时间: 2026-05-11
|
||||
- 最后更新时间: 2026-05-11
|
||||
- 修复版本: 当前工作区
|
||||
- 验证版本: KEY6 编译通过,待用户手测
|
||||
- 备注:[可选]
|
||||
@@ -0,0 +1,54 @@
|
||||
# BUG-20260511-0012
|
||||
|
||||
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
|
||||
|
||||
## 基本信息
|
||||
|
||||
- ID: BUG-20260511-0012
|
||||
- 标题: Tooltip 临时浮层污染或擦除兄弟控件快照
|
||||
- 状态:已修复
|
||||
- 严重性:S2
|
||||
- 优先级:P1
|
||||
- 模块: Tooltip / Canvas / TabControl / 托管重绘 / 背景快照
|
||||
- 版本 / 分支: 当前工作区
|
||||
- 环境: Windows / EasyX / KEY6
|
||||
- 发现人: 用户
|
||||
- 关联 Fix ID: Fix-BUG-20260511-0012
|
||||
|
||||
## 问题描述
|
||||
|
||||
- 现象: KEY6 A 区禁用按钮触发 Tooltip 后,如果 Tooltip 位于状态 Label 下方,状态 Label 可能捕获 Tooltip 到背景快照,或用透明 Label 的旧快照擦掉 Tooltip 一部分。
|
||||
- 影响范围: 同一容器内,绘制顺序在 Tooltip 触发控件之后、且与 Tooltip coverage 相交的兄弟控件。
|
||||
- 期望结果: Tooltip 作为临时浮层显示,不应污染兄弟控件背景快照,也不应被透明 Label 的旧快照擦除。
|
||||
- 实际结果: 旧逻辑把 Tooltip coverage 与持久绘制 coverage 混用,导致兄弟控件作废快照并重抓,或保留快照重画时擦掉 Tooltip。
|
||||
|
||||
## 复现信息
|
||||
|
||||
- 前置条件:[可选] 打开 KEY6。
|
||||
- 复现步骤:
|
||||
|
||||
1. 将鼠标移到 A 区禁用按钮上触发 Tooltip。
|
||||
2. 让 Tooltip 显示区域位于状态 Label 下方。
|
||||
3. 观察状态 Label 区域是否覆盖 / 擦除 Tooltip。
|
||||
4. 触发下一次重绘后观察是否有 Tooltip 残留。
|
||||
|
||||
- 复现概率:高概率
|
||||
- 最小复现 Demo:KEY6 A 区
|
||||
- 证据:`Label::draw()` 即使透明也会先 `restBackground()`;如果被临时浮层触发补画,会回贴旧快照。
|
||||
|
||||
## 初步分析
|
||||
|
||||
- 疑似位置: `Canvas::requestRepaint(this)` / `TabControl::requestRepaint(this)` 的局部 overlay 补画策略。
|
||||
- 触发条件: 下层 Button Tooltip 的完整 coverage 与后序兄弟控件相交。
|
||||
- 相关线索:
|
||||
- `Button::getManagedRepaintCoverageRect()` 包含 Tooltip。
|
||||
- Canvas 旧逻辑用同一 coverage 同时决定“是否补画兄弟”和“是否刷新兄弟背景快照”。
|
||||
- 最近相关改动:[可选] Tooltip coverage 纳入托管重绘链。
|
||||
|
||||
## 跟踪信息
|
||||
|
||||
- 首次发现时间: 2026-05-11
|
||||
- 最后更新时间: 2026-05-11
|
||||
- 修复版本: 当前工作区
|
||||
- 验证版本: KEY1 ~ KEY6 编译通过,待用户手测
|
||||
- 备注:[可选]
|
||||
Reference in New Issue
Block a user