Files
orisys-app/apps
ykcheungab 0a42a452dd 拆分 C2:显示偏好移入 DisplayPrefsController(app_window 2347→2340 行 / 净减 110 行代码)
- What: 新增 apps/studio/src/orisys_studio/display_prefs.py:把「同一个测量值可以怎么
  显示」搬进 DisplayPrefsController——单位(newton / raw,含工具栏、曲线图、重算引擎、
  数值卡四处同步)、量程与时间窗(含默认值、应用到面板、供对话框读取)、箭头显示
  (按传感器决定旋转是否可用、图例倍率、旋转 90°)、2D 视图模式切换后的重绘、以及
  rail 上的帧率读数开关。控制器自己拥有 show_fps;其余偏好仍写在 preferences 里。
  `DisplayHost` Protocol 写明它向窗口借的五件事:_persist_prefs / _refresh_status_rail /
  _latest_fps(算滤波设计用的采样率)/ _drop_render_marker + _repaint_live_frame
  (2D 视图模式变了要重建那一帧)。
  _on_plot_settings *不搬*:它要开 QDialog、还要把滤波系数交给采集 worker,那是会话与
  窗口的事,不是显示偏好;它现在只向控制器取对话框要显示的值、把结果交回去应用。
- What: 窗口侧保留过渡 shim(_set_display_unit / _on_units_changed / _on_chart_unit_toggle /
  _on_image_view_mode_changed / _on_show_fps_toggled / _apply_plot_prefs_to_panel /
  _device_sample_rate / _apply_arrow_rotation_for_sensor / _apply_arrow_legend /
  _draw_style / _on_rotate_arrows,以及 _show_fps 可读写属性),供 tests 与
  tools/ui_check.py 继续驱动窗口(其中 window._on_plot_settings 仍可被测试整体替换)。
  窗口内部连线(toolbar.units_changed、arrow_panel.view_mode_changed、
  force_plots.unit_toggle_requested、act_show_fps.toggled、act_rotate_arrows.triggered)
  改为直连控制器;_sync_menu_checks 里的箭头部分也走控制器。
- What: 新增 apps/studio/tests/test_display_prefs.py:11 个用例——单位四处同步、
  工具栏改单位时不回写工具栏(防回声)、图表单位芯片翻转、对话框值取默认值、
  应用量程写偏好与面板、采样率优先用实测值再回落存储值与默认值、不可旋转的传感器
  不提供旋转且不写偏好、可旋转的重启后记住角度、图例倍率随 draw style 变化、
  切换 2D 模式只重绘一次、帧率开关同时更新偏好与 rail。
- Why: 「数字怎么显示」是 app_window 的第四个独立变更驱动:改一个显示偏好不该碰会话、
  回放或布局。搬完之后这条规则的唯一所有者在 display_prefs 里,且可以脱离窗口单测。
- Verification: pytest shared/tests apps/studio/tests(offscreen)632 passed / 0 failed /
  15 skipped(原 621 + 新增 11);apps/studio/tools/ui_check.py 587 项检查 0 失败;
  .repro/locale_check.py 0 缺失。行为等价(搬运 + 一层转发)。
- Not in this change: 标定交互(_on_calibration_apply / 身份与不匹配检查 / 导出与事件)
  仍未拆分;预览(_start_preview/_stop_preview/_on_preview_tick)留在窗口;
  _depth_range/_depth_scale_text 与 _show_image_frame 同属 2D 渲染,留在窗口;
  docs 的行数/方法数指标待全部切片落定后统一刷新。
2026-09-15 09:50:25 +08:00
..