UI 重构:补充进度台账、阶段报告与共享记忆同步
- Documents/UI_Refactor_Progress.md 补齐 P2 续(PlotViewPanels.cpp)的完成状态、七个分片行数、 逐像素 A/B 哈希与"回退到旧文件做 A/B 时必须先删陈旧 .o"的复现要求。 - 新增 Documents/UI_Refactor_Report.md:第一阶段(P0/P1/P2)交付物、关键数字、 基础层契约、验证方式、过程中修掉的 4 个自身缺陷、明确未做项与下一步排序。 - Documents/agent_mem.md:§11.2 追加第 235-240 条(基础层位置与边界、只沿命中链派发、 Paint 三条契约、布局缓存纪律、PlotView 七分片硬约束、uicheck 回归网), 并在 §10 变更日志追加本阶段一行。 验证:make release / make debug 零警告;Tools/uicheck 62 passed / 0 failed; Target.exe 877,568 B(< 900KB)。
This commit is contained in:
1 parent
e610cea481
commit
7e1852c2d2
2 files changed
+206
No files matched your search
@@ -3023,6 +3023,8 @@ else if (panelOnly) { /* 只回送“本帧重绘过的区域并集” */ }
|
||||
|
||||
| 2026-10-27 | DeepSeek-V4.1-Flash(**本机**) | **浮动面板事件穿透 + 「自由标记」总是预览最近信号 + 固定点位于 GX/图例之下 + 预览曲线取值插值 + 体积红线 900KB(详见 §12 末尾「2026-10-27 第六轮」与 §11.2 第 230–234 条)**。① **面板右键/中键穿透**:新增 `PlotView::OnRButtonDown`(`TopPanelAtPoint` 命中即置顶并消费,宿主不再弹网格 Y 轴菜单);`OnMButtonDown` 在面板上不再进入平移。② **自由标记探测去掉“必须贴近曲线”的门槛**:两个候选(折线垂直距离 / 同一时刻采样点纵向距离)取更近者 ⇒ 网格内只有一条信号、鼠标离曲线很远时也能预览并单击固定(A/B:恢复旧门限 ⇒ 5 项断言失败)。③ **固定标记点必须位于 GX 徽标与图例之下**:用 `gd::Region::Exclude` 把图例托底与徽标矩形从 `PaintFreeMarker` 的绘制区里排除,胶囊文字在相交时改走 GDI+(GDI 文字不认裁剪);实测图例区域像素差 **0**(旧的“画完再重绘图例”方案残留 240px 抗锯齿差)。④ **预览曲线取值点悬空**:`paintDerivedCapsule` 改为在光标时刻对派生曲线**按时间插值**(先 `ApplyDrawTransform` 再线性插值,与折线逐点一致);阶跃区实测标注点与曲线差 **0.0px**(旧实现偏 36–39px),中心轴/均值滤波/弱峰调整共用同一段代码。⑤ **体积红线由 800KB 放宽到 900KB**(到达阈值时提醒用户即可,不是禁止超过)。验证:离屏临时探针 **25/25**(已删除,不留在仓库);`make release`/`make debug` 零警告;`Target.exe` **860,672 字节(840.5 KiB)**。 |
|
||||
|
||||
| 2026-10-28 | DeepSeek-V4.1-Flash(**UI_Refactor 分支**) | **UI 重构第一阶段(P0/P1/P2,全部只提交到本地 `UI_Refactor` 分支,不影响 `main`)**:① 新增 `Components/Shared/{Inc,Src}/UiLayout.*`(矩形原语 / 对齐 / 设备像素内侧对齐 / Stack / Flow / 布局缓存)与 `UiWidget.*`(控件树基类:两段式布局、脏区下探绘制、只沿命中链派发、capture/modal/hover/focus 仲裁、光标认领链、统一动画 tick、内容指纹入口)。② 新增入库离屏回归网 `Tools/uicheck`(62 项断言,链接 `Build/<Config>/*.o` 排除 `Main.o`)。③ `PlotView` 实现按关注点重分为七个分片:`PlotViewPaint.cpp` 9 080 → **4 913** 行(−46%),新增 `PlotViewRaster.cpp`(1 876)、`PlotViewCacheKey.cpp`(474)、`PlotViewPanels.cpp`(1 359);搬移**逐像素 0 差异**(三场景渲染哈希 `A 2166933039626F66 / B C444ECFEB18FD73D / C 7984446D8E7A4418` 迁移前后完全一致)。详见 §11.2 第 235–240 条与 `Documents/UI_Refactor_Plan.md` / `UI_Refactor_Progress.md` / `UI_Refactor_Report.md`。 |
|
||||
|
||||
## 11. 跨设备协作须知(起源设备视角)
|
||||
|
||||
> **本文件是唯一权威记忆**。所有设备 / Agent 共用它,**不要再新建 `agent_mem_origin.md` 等旁支记忆文件**。
|
||||
@@ -4081,6 +4083,37 @@ else if (panelOnly) { /* 只回送“本帧重绘过的区域并集” */ }
|
||||
234. ⚠️ **产物体积红线已放宽到 900KB**(用户 2026-10-27):**到达 900KB 必须提醒用户**,
|
||||
以便确认功能带来的体积膨胀是否值得;这不是“不许超过”,旧 800KB 红线作废。
|
||||
|
||||
235. ⚠️⚠️ **新增 UI 基础层的位置与边界**(2026-10-28,`UI_Refactor`):
|
||||
`Components/Shared/{Inc,Src}/UiLayout.*`(纯几何 + 布局缓存)与 `UiWidget.*`(控件树基类)。
|
||||
它们**不依赖任何功能组件**(只有 `Theme.hpp` / `UiLayout.hpp`),符合既有的
|
||||
`Components/* → Components/Shared → Utilities` 依赖方向。
|
||||
⚠️ 新增 `.cpp` 放在 `Components/Shared/Src` 即可,**无需改 `Makefile`**(按 basename 自动收集)。
|
||||
236. ⚠️⚠️ **`UiWidget` 的事件语义:只沿命中链派发,绝不分发给同层兄弟**。
|
||||
`Dispatch` 先判 capture(拖拽期事件直投捕获者)→ 再判 modal(只向模态子树派发)→
|
||||
位置事件沿"最深命中者 → 祖先"冒泡(命中者优先,未消费才交给祖先作兜底);
|
||||
键盘/字符沿**焦点链**(无焦点交给根,保证宿主级快捷键仍可用)。
|
||||
早期实现"遍历同层兄弟、未消费就继续" ⇒ **一次点击可能被视觉上位于下方的控件也处理**(已修)。
|
||||
237. ⚠️⚠️ **`UiWidget::Paint` 的三条契约**:
|
||||
① `ctx.dirty` 为空 = 脏区未知 ⇒ 全画;非空 ⇒ 只保证该区域被更新;
|
||||
② 脏区与子树矩形**无交集 ⇒ 整棵子树直接 return**(这是框架里唯一真正省时间的机制,
|
||||
禁止任何派生类退化成"父脏 ⇒ 子树全脏");
|
||||
③ 有效裁剪 = 祖先裁剪切 ∩ 自身矩形 ∩ 脏区;**GDI 绘制不受该裁剪约束** ⇒
|
||||
派生类必须把 `ctx.clip` 传给 `UiTextClipped` 一类带 `ETO_CLIPPED` 的辅助函数。
|
||||
238. ⚠️ **`UiLayoutCache` 用 `std::deque` 保证"`Store` 之后已有引用仍有效"**;
|
||||
淘汰按"最久未被命中";`Invalidate` 必须是**定向**失效(与 `m_edgeScans` 同一纪律),
|
||||
**禁止**为了让命中率好看而整体 `Clear()`。
|
||||
239. ⚠️⚠️ **`PlotView` 实现分片已按"关注点"拆分(七个文件)**,不再按函数名前缀:
|
||||
`Paint 4.9k / Interaction 3.4k / Features 3.3k / Raster 1.9k / Panels 1.4k / Core 0.9k / CacheKey 0.5k`
|
||||
(`PlotViewPaint.cpp` 由 9 080 行降到 4 913 行)。硬约束:
|
||||
* `PlotView::Paint` / `PaintLane` **只允许**定义在 `PlotViewPaint.cpp`;
|
||||
* 像素缓存与每帧预算在 `PlotViewRaster.cpp`;内容指纹/缓存键在 `PlotViewCacheKey.cpp`;
|
||||
面板布局与自由标记几何/探测在 `PlotViewPanels.cpp`;
|
||||
* 机械搬移的判据是**逐像素 A/B 哈希一致**(不是"能编译")。
|
||||
⚠️ 搬移后若用旧文件回退做 A/B,**必须先删掉 `Build/<Config>/` 里对应的陈旧 `.o`**,
|
||||
否则链接会因重复符号失败。
|
||||
240. ⚠️ **回归网已入库**:`Tools/uicheck`(`build.ps1` 链接 `Build/<Config>/*.o`,排除 `Main.o`)。
|
||||
改 UI 基础层或迁移组件前先跑它(当前 62 项断言);A/B 校验时把它当"判别力证据"。
|
||||
|
||||
### 11.3 离屏验证方法学(本机偏好,强烈建议沿用)
|
||||
|
||||
- **不要占用用户的鼠标 / 键盘 / 屏幕**:优先 `.preflight/uitest`(离屏 harness:`SW_HIDE` 窗口 + 直接注入消息 + `BitBlt` 从 `m_backDc` 截图)或 `.preflight/perf`(离屏计时 / 逐像素对比)。
|
||||
|
||||
Reference in new issue
Block a user