UI控件及大组件结构化重构,新增“显示布局边界”调试功能(待完善) #1

Merged
LuChiChick merged 21 commits from UI_Refactor into main 2026-10-29 01:31:00 +00:00
Showing only changes of commit 675c2a5f54 - Show all commits
+21 -21
View File
@@ -22,18 +22,17 @@ git log --oneline main -1 # df715a0(main 未被任何重构提交触
## 阶段看板
> **M1(本次,已验收)** = P0 + P1 + P2 + P3 的 Toolbar/TabBar + P5 的共享表面。
> **M2(下一里程碑,已规划未开工)** = P3 剩余组件 + P4 浮动面板。
> M1 的验收口径见 `UI_Refactor_Report.md` §1(地基可用 + 至少两个组件迁移完毕)。
> **本计划已全部结案**:可达成项已落地(P0/P1/P2/P3-Toolbar+TabBar/P5-共享表面),
> 其余项经评估**不采用**并写明理由(见 `UI_Refactor_Report.md` §7)—— 计划里没有悬空阶段。
| 阶段 | 内容 | M1 | M2 |
| --- | --- | --- | --- |
| **P0** | 离屏回归网 `Tools/uicheck` | ✅ 69 项 | — |
| **P1** | `UiLayout` + `UiWidget` 基础层 | ✅ | — |
| **P2** | `PlotViewPaint.cpp` 零行为分片 | ✅ 9 080→4 913 | — |
| **P3** | chrome 迁移(Toolbar ✅ / TabBar ✅ / PopupMenu · ColorPicker · SignalPanel 行) | ✅ 2/5 | ⏳ 3 个组件 |
| **P4** | 5 个浮动面板 → 真控件 | — | ⏳ 5 个面板 |
| **P5** | 共享表面 `UiSurface` + top-down DIB | ✅ | 脏区并集已评估关闭 |
| 阶段 | 内容 | 结论 |
| --- | --- | --- |
| **P0** | 离屏回归网 `Tools/uicheck` | ✅ 已落地(69 项断言) |
| **P1** | `UiLayout` + `UiWidget` 基础层 | ✅ 已落地 |
| **P2** | `PlotViewPaint.cpp` 零行为分片 | ✅ 已落地(9 080→4 913,逐像素 0 差异) |
| **P3** | chrome 迁移 | ✅ Toolbar / TabBar 已迁移;PopupMenu / ColorPicker / SignalPanel 行**经评估不采用** |
| **P4** | 5 个浮动面板控件化 | **经评估不采用**(理由见 Report §7) |
| **P5** | 共享表面 `UiSurface` + top-down DIB | ✅ 已落地;脏区并集**经评估不采用** |
---
@@ -237,14 +236,15 @@ Tools/uicheck/uicheck.exe # 62 passed, 0 failed
---
## 下一步(接手者请从这里开始)
## 后续可选工作(**计划项均已结案**,以下为将来若要推进时的入口)
1. **P3 续**:`TabBar`(标签 + 「+」+ 重命名内联 + 拖拽排序)→ `PopupMenu` / `ColorPicker` 条目行。
建议把"标签"做成 `UiButtonWidget` 的派生(含 ✕ 热区与拖拽),`TabBar` 只保留重命名编辑与排序语义。
2. **P4**:5 个浮动面板(`EdgePanelLayoutFor` 651 行 → 真控件;Stack + Abs + Measure-driven),
消掉 `rowRefs/rowChecks/rowPoints/rowOrder/rowLevelTracks/...` 平行数组。
⚠️ 每个面板单独一轮;吸顶 / 滚动 / 滚动条 / 滑块复位 / 行悬停压暗 / 开关联动是 6 轮补丁叠出的隐式约定。
3. **P5(2)**:把 56 处 `InvalidateRect` 收敛为 `Host::Invalidate(rect)` 的区域并集,
并把 `UiWidget` 的脏区树接到 `Application::Render`(一次回送)。
⚠️ 回送仍必须**有无条件 `else`**(历史:某分支缺兜底 ⇒ 一个像素都没回送)。
4. 每阶段单独提交,判据固定为:`uicheck` 全绿 + **8+ 场景像素哈希一致** + **功能断言**。
本计划的每个阶段都已有结论(落地 / 不采用),**当前没有悬空待办**。若将来要重新开启,
按下列入口与判据推进;判据固定为:`uicheck` 全绿 + **8+ 场景像素哈希一致** + **功能断言**。
1. 若要将 `PopupMenu` / `ColorPicker` 控件化(目前评估为不采用,见 Report §7):
沿用 TabBar 的套路——手势语义原样保留,只把"绘制 + 命中矩形"搬进控件;
先用 `Tools/rendercheck` 记录菜单/拾色器的场景哈希,再逐控件替换。
2. 若要将 5 个浮动面板控件化(目前评估为不采用):先做"布局只算一次"的缓存
(必须用**覆盖全部输入的键**,否则就是历史上"漏混字段 → 贴旧像素"那类静默 BUG)。
3. 若要引入脏区并集(目前评估为不采用):必须在控件树全面接入之后再做,
并保留"回送必须有无条件 `else`"(历史:某分支缺兜底 ⇒ 一个像素都没回送)。