UI 重构:关闭「脏区并集」计划项并记录评估结论

- Documents/UI_Refactor_Report.md §7:把「56 处 InvalidateRect 收敛为脏区并集」改为
  **评估后不采用(计划项已关闭)**,理由基于代码事实:ApplicationInternal.hpp 的
  InvalidatePlotRect() 已是「按消息一次回送」的批处理点,现状不存在同一消息多次回送;
  逐处替换只会多一层间接调用,并把「回送必须有无条件 else」这条历史教训藏得更深。
  真正需要脏区并集的是控件树接入之后(节点失效 → 根聚合),属下一里程碑前置。
- 同节把 PopupMenu / ColorPicker 的迁移说明改为「TabBar 已完成,这两者待做」并沿用同一验收线。
- Documents/UI_Refactor_Plan.md:P5 行同步标注该结论。

验证:make release 零警告;Tools/uicheck 69/69;8 场景像素哈希不变;
7 条功能断言(3 工具栏 + 4 标签栏)全 PASS。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-28 12:43:14 +08:00
1 parent f242fb076c
commit 0bb38a887e
2 files changed
+3 -3

No files matched your search

+2 -2
View File
@@ -158,9 +158,9 @@ flowchart TD
| 项 | 为什么单列 | 继续的具体协议 |
| --- | --- | --- |
| TabBar / PopupMenu / ColorPicker 迁移 | 三者都带**多段手势**(tab 自行判双击、拖拽阈值 3px、关闭 ✕ 的"移开取消";菜单子菜单悬停;拾色器拖拽钳制)。它们的失败是**静默的**(不崩,只是行为微妙变化) | 一次一个组件;先把手势语义原样保留为"语义层",只把绘制/命中搬进控件;每步跑 8+ 场景像素 A/B + 功能断言 |
| TabBar / PopupMenu / ColorPicker 迁移 | **TabBar 已完成**;PopupMenu / ColorPicker 仍带多段手势(子菜单悬停、拾色器拖拽钳制) | 一次一个组件;先把手势语义原样保留为"语义层",只把绘制/命中搬进控件;每步跑 8+ 场景像素 A/B + 功能断言(TabBar 已验证可行) |
| 5 个浮动面板(`EdgePanelLayoutFor` 651 行) | 面板里有吸顶/滚动/滚动条/滑块复位/行悬停压暗/开关联动,是 6 轮补丁叠出的隐式约定 | 一次一个面板;先加"布局只算一次"的缓存(带显式失效),再换控件 |
| 56 处 `InvalidateRect` 收敛为脏区并集 | 需要与控件脏区树联动,且回送必须保留无条件 `else`(历史 BUG) | 先加 `Host::Invalidate(rect)` 并只迁移高频路径,逐步替换 |
| 56 处 `InvalidateRect` 收敛为脏区并集 | **评估后不采用(计划项已关闭)** | 代码事实:`ApplicationInternal.hpp` 里的 `InvalidatePlotRect()` 已经是「按消息一次回送」的批处理点,现状不存在"同一消息多次回送";逐处替换只会多一层间接调用,并把"回送必须有无条件 `else`"这条历史教训藏得更深。真正需要脏区并集的是**控件树接入之后**(节点各自失效 → 根聚合),那属于下一里程碑的前置 |
> 说明:这三项均**不是"没做"**,而是按 `UI_Refactor_Plan.md` 的分阶段纪律,
> **每个组件/面板单独一轮提交**,且每轮都必须满足同一验收线: