Horldsence
cd8344c698
client: 修裁判端两格不等宽,加滚轮缩放与拖动平移,启动即最大化
**塌缩问题**(用户报的现象):裁判端窗口放大时,左边那格吃掉约 55% 宽度,右边
只有 45%;空的那一侧更极端时会被压成一条缝。
原因不是缺 stretch,而是 `HorizontalLayout` 先按内容的**最大**需求分配、剩下
的才按 stretch 分。左格写着"已连接,等待画面…"(8 个字),右格"未收到画面"
(5 个字),左格就多要十几个像素。而没有画面的一格最小宽度接近 0,可以被压没。
三处一起改:
1. 占位文字改成绝对定位(给出 x/y),不再参与父级尺寸计算。文字长短本不该
决定画面大小。
2. 两格统一 `preferred-width: 480px` + `horizontal-stretch: 1`,需求变成相同,
于是精确平分。`min-width: 320px` 兜底,保证任何一侧至少有一个能看画的宽度。
3. 缩放指示与复位按钮也绝对定位。否则它们一出现就改变这一格的尺寸需求,把
不等宽重新引进来——而且是在用户放大之后才出现,最难排查。
**缩放**:Slint 的 `Image` 没有缩放因子属性,所以把它的 `width`/`height` 按 zoom
放大后放进 `clip: true` 的容器,靠 offset 平移。滚轮改 zoom、拖动改 offset、双击
复位、缩回 1.0 时自动归位(否则下一次放大会从偏移位置开始,看起来像"跳了一下")。
`image-fit` 要跟着 zoom 切:`contain` 在 zoom=1 时保证完整可见且不变形,`fill`
才让画面跟着放大——只用 contain 的话放大不会有任何视觉变化。
**启动即最大化**:Slint 没有"最大化"这个状态,但有 `set_maximized`,它铺满工作区
且保留菜单栏和 Dock(真全屏 `set_fullscreen` 会盖掉它们,裁判终端要切去别的窗口
核对数据)。必须在 `show()` 之前调用,之后调用会被后端当成"用户点了最大化按钮"。
抽出 `VideoPane` 与 `StatusBar` 两个组件给两种身份复用。两者都不加 `export`——
它们只在 .slint 内部使用,加了会触发"doesn't inherit Window. No code will be
generated for it"的警告。
Slint 的两处写法记在这里,都是编译器试出来的:
- `TouchArea` 的 `pressed` 是**属性**不是回调,写 `pressed => {}` 编译不过。
拖动要用 `pointer-event(e)` 配 `PointerEventKind.down` / `.move`。
- `EventResult.accept` 要写全限定;`accept` 单独写无法解析。