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

106 lines
4.2 KiB
Markdown
Raw 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.
# 功能变更 ID: Feature-20260511-0012
> 适用场景:记录小到中等规模的功能、接口、行为、默认值或配置变化。
> 不适用场景:新增核心模块、重大模块重构、架构级设计,请使用“新增功能模块”模板。
## 基本信息
- ID: Feature-20260511-0012
- 标题: 发布前托管重绘与 KEY6 封版收口
- 状态:已完成
- 类型:修改
- 级别:L3 重大
- 模块: Window / Canvas / TabControl / Tooltip / Dialog / 测试用例
- 版本 / 分支: 当前工作区
- 环境: Windows / EasyX
- 负责人: Codex
## 变更背景
- 背景:
- 发布前封版阶段需要稳定现有布局、托管重绘、Dialog / overlay / hover 状态同步链路。
- KEY6 补充覆盖后暴露了非模态 Dialog、Tooltip、跨 root dirty、透明 Label 快照等组合问题。
- 目标:
- 修复确定性小问题。
- 收口 Dialog / overlay 后鼠标状态同步语义。
- 让 KEY6 覆盖已实现但原主回归未覆盖的分支。
- 修复托管局部重绘中 coverage 和背景快照语义混用导致的问题。
- 不做什么:[可选]
- 不实现焦点系统。
- 不实现键盘事件系统。
- 不做 Tooltip 智能选位。
- 不做 Table 纵向 Stretch。
- 不实现 Table 内部局部重绘体系。
## 变更内容
- 变更摘要:
- 修复 `TabControl::indexOf()` 未命中返回值。
- 抽取 Dialog / overlay 后鼠标状态同步辅助函数。
- 新增 KEY6 分支覆盖用例。
- `Window` 增加局部 root 提交后 overlay coverage 保守兜底。
- `Window` 事件尾补收集跨 root dirty 子树。
- 托管重绘拆分完整 coverage 与持久 coverage,避免 Tooltip 污染背景快照。
- 新增项:[可选]
- `Window::syncMouseStateAfterOverlayChanged(...)`
- `Window::collectDirtyRootsForManagedRepaint()`
- `Control::getManagedRepaintPersistentCoverageRect()`
- KEY6 测试入口
- 修改项:[可选]
- `Canvas / TabControl` 局部 overlay 补画策略。
- `Button` Tooltip coverage 语义。
- `Table` 托管 coverage 语义补充。
- 删除 / 废弃项:[可选]
-
- 受影响的文件 / 类 / 函数:
- `Window.h / Window.cpp`
- `Control.h / Control.cpp`
- `Button.h / Button.cpp`
- `Canvas.h / Canvas.cpp`
- `TabControl.h / TabControl.cpp`
- `Table.h / Table.cpp`
- `z-testDome.cpp`
- 对外 API / 属性变化:[可选]
- 无公开用户 API 变化。
- 新增接口均为内部托管重绘语义。
## 行为对照
- 变更前:
- `indexOf()` 未命中返回最后索引。
- Dialog 关闭 / 非模态 Dialog 吞鼠标移动后的 synthetic move 逻辑散落在 `runEventLoop()`
- 局部 root 内部 coverage 扩张后,Window 可能漏补 Dialog。
- 跨 root 回调改脏后,目标 root 可能等下一次事件才刷新。
- Tooltip 临时浮层与持久 coverage 混用,可能污染或擦除兄弟控件快照。
- 变更后:
- `indexOf()` 未命中返回 `-1`
- overlay 后鼠标状态同步由语义函数集中处理。
- Window 对可局部提交 root 的上层补画判断更保守。
- 事件尾会补收集未登记但已 dirty 的 root。
- Tooltip 进入完整 coverage,但不进入持久 coverage;只命中临时浮层的兄弟控件不再补画。
- 兼容性说明:兼容
- 迁移说明:[可选]
- 用户代码无需迁移。
## 验证与落地
- 验证方式:
- 编译核心变更文件。
- 编译 `z-testDome.cpp``KEY1 ~ KEY6`
- 根据用户手测反馈修正 KEY6 Tooltip / Dialog / Label 组合问题。
- 验证结果:
- `Control.cpp / Button.cpp / Canvas.cpp / TabControl.cpp / Table.cpp / Window.cpp` 编译通过。
- `KEY1 ~ KEY6` 编译通过。
- GUI 行为需继续由用户在本机手测确认。
- 关联 BUG / Fix[可选]
- BUG-20260511-0009 / Fix-BUG-20260511-0009
- BUG-20260511-0010 / Fix-BUG-20260511-0010
- BUG-20260511-0011 / Fix-BUG-20260511-0011
- BUG-20260511-0012 / Fix-BUG-20260511-0012
- Commit: 未提交
- PR[可选]
- 发布版本:[可选]
- 备注:[可选]
- 下版本建议引入 `commitManagedRepaint()` actual coverage 返回值,替代当前 root coverage 保守兜底。
- 下版本建议建立正式 coverage 诊断日志开关,避免再临时散加日志。