GUI v0.2.13: chart Y-axis range control (right-edge dual-handle slider)

- TemperatureChart gains a right-edge slider on a FIXED -20..120C rail
  (user-specified): top handle = upper bound, bottom handle = lower bound,
  drag middle band = pan keeping span, click free rail = snap that bound.
  First drag engages manual mode (yManualEngaged -> sync button state +
  config); release quantizes to 0.1C via yRangeChanged, min span 0.5C.
  Bound values during drag must come from live display range, not the
  stale paint cache (two drags without repaint made pan jump the range).
- Auto/manual toggle moved into the card header (was a wrapped second
  row); pause/clear merged into header too; legend moved to top-left.
- Value labels next to handles only visible on hover/drag (constant
  labels covered the curve per user feedback).
- Out-of-range curves clipped back to the plot area (setClipRect);
  current-value marker suppressed outside the manual range.
- Draft textbox rows from v0.2.10 superseded; versions v0.2.10..v0.2.13.
- Fixed "no data yet" hint never disappearing: set_source cached a
  stale _has_data bool once at build time while data flows through the
  same list references; now evaluated live at paint time.
- config: y_axis key persists mode/bounds; invalid stored values fall
  back to auto. selftest settings isolated to a temp dir (user json with
  stored manual state broke the fresh-default assertions).
- selftest_gui: slider hit/drag/clamp/pan/clipping regression + hint
  gating; 83 checks all pass.
This commit is contained in:
2026-10-15 21:30:21 +08:00
parent 2f43efb94b
commit 000781e2f5
4 changed files with 529 additions and 34 deletions
+17 -1
View File
@@ -8,7 +8,13 @@ FilmForge 热压模具温控板(GD32F405, RS485 数据口)的桌面上位机
- **实时温度曲线**(自绘 QPainter 控件,无第三方图表依赖):实测温度折线 +
目标温度橙色阶梯线同图对照(闭环监视),NTC 开路/短路处曲线断开并打故障标记;
时间窗 2/5/15/60 分钟/全部,暂停/恢复,窗口统计(最小/最大/平均)。
时间窗 2/5/15/60 分钟/全部,暂停/恢复,窗口统计(最小/最大/平均);
Y 轴(温度轴)量程可选**自动**(随可见数据自适应)或**手动**——直接拖动
图表右缘滑条(固定参考域 -20~120℃,把手位置=℃ 读数):上把手=上限、
下把手=下限、拖动把手中段上下=整段平移并把跨度保持不变、点击轨道空白直接
把对应边界设到该处;首次任意拖拽自动切入手动("Y轴自动/手动"按钮同步),
把手数值标签仅悬停/拖拽时显示(不常驻遮挡曲线),曲线越界时裁剪回绘图区;
模式与量程记忆在 `filmforge_gui.json`。
- **温度数据**:温度监控统一走固件 M2 周期上报帧(M2S<ms> 开启后主动推送入曲线);
M1 仅作手动单点查询(命令区按钮/预设)。
- **控制面板**:目标温度 M4S<n>(0~200 整数℃,滑条+输入框)、加热 M3S1/M3S0
@@ -92,6 +98,16 @@ python publish_gitea.py release/FilmForge-GUI-v<版本>-win64.zip --replace --in
直接 `setStyleSheet` 会在切主题时被库重刷(DLPilot 同款坑);标题字号走 QFont。
- 图表刷新双节流:数据到达即重绘(≤10Hz)+ 0.5s 时间轴推进;“全部”窗口超 4000 点
按步进抽稀(NaN 断口保留)。
- **是否有数据由绘制时实时判定**(`paintEvent` 直接看数据列表引用):图表只在
构建时调用一次 `set_source`,旧版在这里缓存过 `_has_data` 布尔——数据经引用
追加后永不刷新,“暂无数据”提示文字在有数据后仍绘在曲线上(实测截图暴露)。
手动 Y 轴模式下曲线/目标线**裁剪回绘图区**(`setClipRect`),当前值标记
超出量程时不画(实时读数卡片仍可见)。v0.2.10。
- **Y 轴滑条的两套坐标系别混用**:把手像素位置在**参考域**(全量数据范围
±15%,`_y_ref`)上映射,与"显示量程"是两回事;拖拽中的界值必须取**实时
显示范围**(manual=`_y_manual`,auto=当前自适应值),不能取绘制缓存
`_cached_layout` 的陈旧范围——连续两次拖拽之间没有重绘,实测曾把 pan 的
量程整段拖跳(v0.2.11)。
## 已知事项