接入 Studio 控件与菜单构建模块
将界面构建从主窗口移出,保留现有业务回调与标定路径。验证结果和完整门禁限制见 docs/architecture/studio-window-refactor-plan.zh.md。
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
# Studio 软件架构
|
||||
|
||||
本文说明已接线的 S1 和 2026-10-19 准备但尚未接线的 S2;后续工作和验收由
|
||||
本文说明已接线的 S1–S2;后续工作和验收由
|
||||
[分步重构计划](studio-window-refactor-plan.zh.md) 维护。下方旧扫描图表保留为历史证据,
|
||||
不能用其中的行数或“已完成”判断当前代码。
|
||||
|
||||
## 当前职责与数据流
|
||||
|
||||
`app_window.py::StudioMainWindow` 创建控件和控制器并连接信号。S1 批次从 3,181 行减至
|
||||
3,052 行,这是当日指标;当前另有并行标定修改。窗口仍承担菜单、预览、标定交互、
|
||||
分析配置和运行协调,尚未完成薄窗口目标。
|
||||
`app_window.py::StudioMainWindow` 装配界面、控制器并连接信号。2026-10-19 的 S2 接线
|
||||
从 3,070 行减至 2,894 行。窗口仍承担业务接线、预览、标定交互、分析配置和运行协调,
|
||||
尚未完成薄窗口目标。
|
||||
|
||||
`status_presenter.py::StatusPresenter` 只持有工具栏,不持有窗口或会话控制器。
|
||||
窗口在 GUI 线程收集一次性的 `RailState`,Presenter 负责 phase、来源、标定、有效性及
|
||||
@@ -28,6 +28,8 @@ graph TD
|
||||
P --> T[ToolbarWidget 状态轨]
|
||||
W --> A[AcquirePresenter 实时呈现]
|
||||
W --> V[FrameView 二维与共享深度范围]
|
||||
W --> U[WindowUi 控件与布局]
|
||||
W --> M[WindowMenus 菜单与快捷键]
|
||||
```
|
||||
|
||||
会话状态仍属于 `SessionController`,录制状态仍属于 `RecordingCoordinator`。
|
||||
@@ -40,15 +42,16 @@ graph TD
|
||||
执行结果、环境及尚未验证范围记录在实施计划。状态转发暂留用于现有调用方,后续按职责迁移,
|
||||
不增加新的全局状态容器或将剩余逻辑全部并入回放控制器。
|
||||
|
||||
## S2 准备模块,尚未接线
|
||||
## S2 界面构建与接线
|
||||
|
||||
`ui/window_ui.py::WindowUi` 创建控件和布局,提供局部主题、文字更新;
|
||||
`ui/window_menus.py::WindowMenus` 创建菜单、快捷键和勾选初值,不绑定业务回调。
|
||||
当前运行图不包含这两个模块,主窗口仍使用原构建路径,标定读取和应用路径由并行任务维护。
|
||||
窗口通过 `ui`、`menus` 使用它们,旧控件和 action 属性保留同一对象引用供控制器和工具访问。
|
||||
|
||||
独立检查由 `test_window_surfaces.py` 负责。接线时仍由窗口装配 FrameView、共享 domain latch、
|
||||
曲线 store 和控制器信号;reset 文字及操作可用性保留原负责人。具体顺序见实施计划,
|
||||
不能把独立模块测试通过等同于主窗口迁移完成。
|
||||
窗口在控制器接线前装配 FrameView、共享 domain latch 和曲线 store;菜单初值先于业务
|
||||
回调绑定。偏好保存、全局主题与语言、reset 文字、pause 状态和操作可用性仍由原负责人管理。
|
||||
标定读取与应用路径保持原实现。`test_window_surfaces.py` 覆盖独立模块与主窗口接线;
|
||||
布局、传感器切换和回放由现有集成测试覆盖,结果及验证限制见实施计划。
|
||||
|
||||
## 历史测量的适用范围
|
||||
|
||||
|
||||
@@ -41,10 +41,10 @@
|
||||
|
||||
### S2:界面构建
|
||||
|
||||
- [x] 准备 `ui/window_ui.py` 和 `ui/window_menus.py`,以独立窗口验证,尚未接入运行路径。
|
||||
- [ ] 提取 `ui/window_ui.py` 的控件和布局构建,保持控件身份、顺序及 parent。
|
||||
- [ ] 单独迁移菜单和 QAction 创建;由窗口显式连接功能操作。
|
||||
- [ ] 迁移对应文字与主题更新,保留必要属性兼容入口。
|
||||
- [x] 准备 `ui/window_ui.py` 和 `ui/window_menus.py`,先以独立窗口验证。
|
||||
- [x] 接入 `ui/window_ui.py` 的控件和布局构建,保持控件身份、顺序及 parent。
|
||||
- [x] 迁移菜单和 QAction 创建;由窗口显式连接功能操作。
|
||||
- [x] 迁移对应文字与主题更新,保留必要属性兼容入口。
|
||||
|
||||
依赖 S1。涉及主窗口、UI 模块及实际调用方;面板构建和菜单构建分两批验收。
|
||||
验证:`test_ui_elements`、`test_view_layout`、`test_sensor_switch_window`、主题与语言检查。
|
||||
@@ -95,6 +95,38 @@
|
||||
每个迁移步骤运行对应检查;可交付批次运行 `tools/gate.ps1 -Task studio-window-refactor`。
|
||||
文档使用工作区 `scripts/doc_lint.py` 和 `scripts/doc_count.py`,不扩大基线。
|
||||
|
||||
### 2026-10-19:S2 接线
|
||||
|
||||
以 `main` 的 `c6c16df` 为基准,接入已准备的两个 UI 模块;主窗口从 3,070 行减至
|
||||
2,894 行。10 个控件和 35 个菜单、action 属性保留同一对象引用;18 处菜单业务回调及
|
||||
控制器绑定仍在窗口。主题与文字更新委托 UI 模块,reset 目标、pause 状态仍沿用原逻辑。
|
||||
|
||||
FrameView、共享 domain latch 和曲线 store 在控制器接线前绑定,偏好恢复顺序不变。
|
||||
只改动窗口的构造、菜单构建、菜单勾选、文字和主题刷新五个方法;其余方法的 AST 一致,
|
||||
最新标定读取、应用和关闭路径未迁移。S3–S6 保持待实施。
|
||||
|
||||
改动前定向检查为 46 passed;接线后加上三个集成检查为 49 passed。
|
||||
覆盖控件身份、菜单单次调用、主题与语言刷新、实时与回放的 reset 目标,以及既有布局、
|
||||
暂停和标定对话框。首次新增断言误将菜单与按钮的不同文案视为相同,已按原契约修正。
|
||||
串行门禁的 lint 通过,UI 检查为 632 checks、0 failures;共享层为 461 passed、
|
||||
18 skipped、3 deselected、15 failed,涉及 SDK 映射文件缺失及几何尺寸不一致。
|
||||
Studio 在垃圾回收期间访问冲突退出,无 JUnit 报告。整套门禁未通过,原因尚未完全确认。
|
||||
|
||||
扩展界面检查为 131 passed、1 failed,失败是分析停止后的即时状态断言。
|
||||
该用例及崩溃所在的三个布局场景,在旧、新主窗口隔离运行均为 4 passed,未复现整套异常。
|
||||
旧主窗口整套对照长时间无进度后已中断,不能据此判定原因。未修改失败断言或扩大基线。
|
||||
临时禁用局部主题刷新时,新增测试按预期失败;仅在测试进程注入,源码未改动。
|
||||
|
||||
环境为 Windows、Python 3.10.19、offscreen Qt;真实设备、可见桌面和硬件 GL 未验证。
|
||||
文档检查无新增问题,原架构长段落债务仍保留。证据位于
|
||||
`.scratch/studio-window-refactor/20261019-095028/` 和 `gate-20261019T015301Z/`。
|
||||
另一个进程的 Autocal 修改含暂存项,全部排除;本批六个文件未暂存,根仓库未修改。
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tools/gate.ps1 -Task studio-window-refactor -LintBase HEAD -Serial
|
||||
& .\.venv-build\Scripts\python.exe -m pytest apps/studio/tests/test_ui_smoke.py apps/studio/tests/test_ui_elements.py apps/studio/tests/test_sensor_switch_window.py -m 'not timing' -o faulthandler_timeout=60 -p no:cacheprovider --basetemp=D:\orisys_ws\orisys-app\.scratch\studio-window-refactor\20261019-095028\pytest-ui-focused --junitxml=D:\orisys_ws\orisys-app\.scratch\studio-window-refactor\20261019-095028\ui-focused.xml
|
||||
```
|
||||
|
||||
### 2026-10-19:S2 模块准备,接线延期
|
||||
|
||||
用户要求避开另一个进程正在修改的标定配置读取和应用路径,本批只新增模块及独立测试,
|
||||
|
||||
Reference in New Issue
Block a user