UI 重构:文档纳入 TabBar 迁移(P3 完成 2/5)

- Documents/UI_Refactor_Progress.md:阶段看板 P3 标记为「Toolbar + TabBar 已完成」;
  新增第 6 条提交记录(TabBar 新旧实现对照 + 手势语义未变的说明 + 8 场景哈希 + 4 条交互断言)。
- Documents/UI_Refactor_Report.md:交付表 P3 改为 2/5;关键数字(已迁移组件、产物 886,784 B);
  提交清单加入 cd3a3fa;新增 5.1 节描述 TabBar 迁移与双轨验证。

验证:make release / make debug 零警告;Tools/uicheck 69/69;8 场景像素哈希与迁移前一致。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-28 12:42:31 +08:00
1 parent c3b79a6d2c
commit f242fb076c
2 files changed
+36 -4

No files matched your search

+20 -3
View File
@@ -22,13 +22,15 @@
| **P0** | 入库离屏回归网 `Tools/uicheck` | ✅ | 69 项断言全绿,可一键复跑 |
| **P1** | `UiLayout`(矩形/对齐/Stack/Flow/布局缓存)+ `UiWidget`(控件树基类) | ✅ | 69 项断言覆盖布局数学、脏区跳过、派发、裁剪、动画 |
| **P2** | `PlotView` 实现按关注点重分为七个分片 | ✅ | `PlotViewPaint.cpp` 9 080 → 4 913(−46%);**逐像素 0 差异** |
| **P3** | Toolbar 迁移到控件树(新增 `UiButtonWidget`) | ✅ 1/5 组件 | 8 场景像素哈希一致 + 3 条功能断言 |
| **P3** | chrome 迁移到控件树 | 🔄 **2/5:Toolbar + TabBar 已完成** | 各 8 场景像素哈希一致 + 功能断言 |
| **P5(1)** | 共享表面 `UiSurface` + 后备缓冲改 top-down 32bpp DIB | ✅ | 8 场景哈希不变 + 7 条 `UiSurface` 断言 |
| 附带 | 修复退出期 `WM_PAINT` 在已关闭 GDI+ 上绘制导致的崩溃 | ✅ | `Shutdown()` 顺序调整 + `Render()` 保护 |
提交(全部在 `UI_Refactor`):
```
cd3a3fa P3(2):TabBar 迁移到控件树(逐像素 0 差异 + 4 条交互断言)
510c003 文档:里程碑最终报告 + 计划阶段状态
0344c30 文档:报告/台账更新为 P0–P3 + P5(1)
955666b P5(1):共享表面 UiSurface + top-down 32bpp DIB;修复退出期绘制崩溃
e14caec 文档:报告更新为 P0–P3
@@ -64,9 +66,9 @@ git log --oneline main -1 # df715a0
| 最大源文件 | `PlotViewPaint.cpp` 9 080 行 | 4 913 行(**−46%**) |
| `PlotView` 实现文件数 | 4 | **7(按职责)** |
| 自动化 UI 探针 | **0** | **69 项断言(入库)** |
| 已迁移到控件树的组件 | 0 | **Toolbar** |
| 已迁移到控件树的组件 | 0 | **Toolbar + TabBar**(2/5,各含像素 A/B + 功能断言) |
| 共享后台位图 | compatible bitmap(无像素指针) | **top-down 32bpp DIB + `UiSurface`** |
| 产物 | 873 984 B | **883 200 B**(< 900 KB 阈值) |
| 产物 | 873 984 B | **886 784 B**(< 900 KB 阈值) |
| 产品像素差异 | — | **0**(分片 3 场景 + 迁移 8 场景哈希逐一相同) |
---
@@ -125,6 +127,21 @@ flowchart TD
**双轨验证**:8 场景像素哈希一致 + 3 条功能断言(定位按钮 / 点击生效 / 移出松开不触发)。
### 5.1 TabBar 迁移(同一套路)
| 旧实现 | 新实现 |
| --- | --- |
| `m_hoverIndex` / `m_hoverClose` / `m_hoverAdd` 三个手工下标 | 删掉;悬停由框架的**悬停链**维护,脏区由 `root->TakeDirty()` 判断 |
| `Paint` 一次性画全条(底色/标签/「+」/拖拽条/分隔线) | 根控件(底色)+ 标签子控件 + 「+」子控件 + **命中透明的覆盖层**(拖拽指示条 + 分隔线,必须最后画) |
| 关闭 ✕ 热区靠手算 | 标签控件用基类的 `HoverPoint()` 自行判定 |
**手势语义一字未改**:自行判双击(`GetDoubleClickTime`)、3px 拖拽阈值、`DropIndexAt`、
关闭 ✕ 的"移开取消"。
**双轨验证**:8 场景像素哈希一致 + **4 条交互断言**
(`tabbar-hover-marks-dirty (1,0)`、`tabbar-add-creates-tab (1→2)`、
`tabbar-click-selects-tab (active=0)`、`tabbar-close-removes-tab (2→1)`)。
---
## 6. 共享表面(P5 已就位部分)