refactor: 准备独立的 Studio 控件与菜单构建模块

让界面构建可脱离主窗口独立测试。界面与绑定检查 13 项通过,运行入口尚未接线。
This commit is contained in:
ykcheungab
2026-10-19 09:48:26 +08:00
parent 31750f0f84
commit c6c16df753
5 changed files with 496 additions and 4 deletions
+14 -3
View File
@@ -1,13 +1,14 @@
# Studio 软件架构
本文的当前职责说明对应 2026-10-18 主窗口重构 S1;后续工作和验收由
本文说明已接线的 S1 和 2026-10-19 准备但尚未接线的 S2;后续工作和验收由
[分步重构计划](studio-window-refactor-plan.zh.md) 维护。下方旧扫描图表保留为历史证据,
不能用其中的行数或“已完成”判断当前代码。
## 当前职责与数据流
`app_window.py::StudioMainWindow` 创建控件和控制器并连接信号;本次从 3,181 行减至
3,052 行。它仍承担菜单、预览、标定交互、分析配置和运行协调,尚未完成薄窗口目标。
`app_window.py::StudioMainWindow` 创建控件和控制器并连接信号。S1 批次从 3,181 行减至
3,052 行,这是当日指标;当前另有并行标定修改。窗口仍承担菜单、预览、标定交互、
分析配置和运行协调,尚未完成薄窗口目标。
`status_presenter.py::StatusPresenter` 只持有工具栏,不持有窗口或会话控制器。
窗口在 GUI 线程收集一次性的 `RailState`,Presenter 负责 phase、来源、标定、有效性及
@@ -39,6 +40,16 @@ graph TD
执行结果、环境及尚未验证范围记录在实施计划。状态转发暂留用于现有调用方,后续按职责迁移,
不增加新的全局状态容器或将剩余逻辑全部并入回放控制器。
## S2 准备模块,尚未接线
`ui/window_ui.py::WindowUi` 创建控件和布局,提供局部主题、文字更新;
`ui/window_menus.py::WindowMenus` 创建菜单、快捷键和勾选初值,不绑定业务回调。
当前运行图不包含这两个模块,主窗口仍使用原构建路径,标定读取和应用路径由并行任务维护。
独立检查由 `test_window_surfaces.py` 负责。接线时仍由窗口装配 FrameView、共享 domain latch、
曲线 store 和控制器信号;reset 文字及操作可用性保留原负责人。具体顺序见实施计划,
不能把独立模块测试通过等同于主窗口迁移完成。
## 历史测量的适用范围
以下第 1–6 节及配套 `studio-architecture.svg`、`studio-architecture.png` 是旧扫描快照。
@@ -41,6 +41,7 @@
### S2:界面构建
- [x] 准备 `ui/window_ui.py` 和 `ui/window_menus.py`,以独立窗口验证,尚未接入运行路径。
- [ ] 提取 `ui/window_ui.py` 的控件和布局构建,保持控件身份、顺序及 parent。
- [ ] 单独迁移菜单和 QAction 创建;由窗口显式连接功能操作。
- [ ] 迁移对应文字与主题更新,保留必要属性兼容入口。
@@ -87,13 +88,42 @@
显示设置重绘测试。2D/3D 使用同一帧;实时不覆盖回放;重绘不启动新分析。
结束条件是主窗口只承担约定职责,且所有相关检查通过,不以行数作为唯一标准。
## 验证与当前进度
## 验证记录
解释器使用 `.venv-build/Scripts/python.exe`。定向 pytest 显式使用独立的
`--basetemp` 和 `-p no:cacheprovider`;日志位于 `.scratch/studio-window-refactor/`。
每个迁移步骤运行对应检查;可交付批次运行 `tools/gate.ps1 -Task studio-window-refactor`。
文档使用工作区 `scripts/doc_lint.py` 和 `scripts/doc_count.py`,不扩大基线。
### 2026-10-19:S2 模块准备,接线延期
用户要求避开另一个进程正在修改的标定配置读取和应用路径,本批只新增模块及独立测试,
不编辑 `app_window.py`、现有面板、标定服务、控制器或配置文件。
基准为 `main` 的 `a0c13c1` 加当时工作区修改;读取的主窗口快照留在本批 scratch。
`WindowUi` 创建中央控件、四个面板及布局,提供局部主题和文字更新。
`WindowMenus` 创建 QAction、快捷键、菜单组和勾选初值,提供静态文字及主题/语言勾选同步。
两者均不保存偏好、不绑定业务回调,不启动设备、分析或 3D;真实控件复用现有实现。
当前主窗口仍走原来的构建路径,因此不能宣称 S2 已完成迁移。
未来接线前重新核对并行标定改动,再按顺序替换布局和菜单构建。
共享 domain latch、FrameView、曲线 store、业务信号和初始偏好恢复由窗口显式装配;
第一次呈现前完成绑定。菜单初值先于业务信号连接;reset 的目标文字、pause 状态及操作可用性
仍由现有控制器和窗口同步。兼容属性引用同一批控件,不另造重复面板。
新增 `test_window_surfaces.py` 和现有 `test_studio_binding_purity.py` 为 13 passed,
测试使用临时的空 sensor catalog,不扫描正在修改的真实配置目录。
还核对了 35 个菜单与 action 属性与起始快照一致;临时取消主题组互斥后测试能发现错误,
随后原样恢复。新增文件 lint 通过,文档检查无新增问题;主窗口与起始快照逐字节一致。
本批仅证明模块可独立使用;接线后的主窗口全套回归、真实桌面与设备验证仍待执行。
日志和 XML 位于 `.scratch/studio-window-refactor/20261019-094111/`,最终结果为 `final.xml`。
```powershell
& .\.venv-build\Scripts\python.exe -m pytest apps/studio/tests/test_window_surfaces.py apps/studio/tests/test_studio_binding_purity.py -p no:cacheprovider --basetemp=D:\orisys_ws\orisys-app\.scratch\studio-window-refactor\20261019-094111\pytest-final --junitxml=D:\orisys_ws\orisys-app\.scratch\studio-window-refactor\20261019-094111\final.xml
```
### 2026-10-18:S1 接线与历史验证
2026-10-18:S0 和 S1 已实施。改动前后同一组 `test_ui_smoke` 与
`test_replay_wiring` 均为 125 passed;新增 Presenter 独立测试为 19 passed。
主窗口暂为 3,052 行;状态显示已迁出,S2–S6 尚未实施。