fix(app-iced): M125 r2 —— chips 档「还没选版本」不再对半切;宽度表换成实测值

r1 复审 p2-1:`TailShare::of` 只判档位,于是 chips 档「刚进页面」(面板只有一行
提示)也被五五分——700×760 下列表 8 个版本只显示 4 个、下半块 ≈160px 空画布,
而修前(main)这一态是 7 整行。修法:判据加**面板形态**,`Hint` 在任何档位都钉死,
`Chips` + `Options`/`Install` 才共享。实测回到 7 整行(与 main 同一水位)。

守门:新增 `options_shot/ready.rs`(`ULL_DL_READY_SHOT`,不设 `ULL_DL_DEMO` 出的
700×760 图):列表区至少读出 6 个版本号。它在 r1 的图上**红**(4 个,原生输出见
mission 报告),在修后图上绿(7 个)。三条旧守门照旧(chips / compact / wide),
chips 与 compact 换修前图仍红。

r1 复审 p2-2:宽度表的实测值改正(同一张 736 图逐项量):
`1.21` 26(余 6)、`1.20` 28(余 4)、`24w` **29**(余 3)、`All versions` 墨迹画到
x=247(裁切边 248,只差 1px)⇒ 桶标签余量是 **3~6px** 而不是 6;「短标签『全部』= 32
零余量」这条论证的对比强度随之写准(比桶标签的 3~6px 更薄)。
`rails/major.rs` 的表格、`options_shot/compact.rs` 的测试文档一并改成实测值;
「墨迹右边界」那条反例也从 216..244 改成实测 216..247。

r1 复审 p3-1:第二级「全部版本」的图标从网格(与第一级同字形同药丸、像素级同形)
换成文档/清单字形 `IconKind::Logs`,理由与「图标集里没有版本/历史字形」写进
`major_shape` 文档。

r1 复审 p3-2:chips 档最多三层滚动(列表 / 面板 / loader 菜单)作为**已知风险**
登记在 `install.rs` 文档里,并写明为什么「把实例名移出滚动区」本轮不做(要拆
`options::section`,动三个文件,而且改完仍无法验证滚轮冒泡——没有通道)。
This commit is contained in:
AskaEth committed 2026-11-05 16:43:35 +08:00
1 parent 9c623a6fd3
commit 0f26ed3753
9 files changed
+283 -58

No files matched your search

@@ -0,0 +1,79 @@
//! 「还没选版本」那一态(`ULL_DL_DEMO` 不设 = `ready`)的像素守门:r1 复审 P2-1。
//!
//! ## 为什么要单独守这一态
//!
//! M125 r1 的 `TailShare::of` **只判档位**,于是 chips 档的「刚进页面」也被五五分:
//! 面板里只有一行提示(`PanelState::Hint`,≈30px),却拿走一半高度 ⇒ 700×760 下
//! 8 个版本只显示 **4** 个、下半块留 ≈160px 空画布(修前是 8 行全在屏)。
//! 同目录 `chips.rs` 只拍「选中 + 选项区展开」,正是这个盲区把回归放了过去。
//!
//! 现在的判据:`Chips` **且**面板真占高度(`Options` / `Install`)才共享;
//! `Hint` 在任何档位都钉死(见 `rows::TailShare::of`)。
//!
//! ```text
//! # 不设 ULL_DL_DEMO(= ready)出 700×760 那张
//! cargo run -p unlucky-app-iced --example pages_demo -- \
//! --screen=download --width=700 --height=760 --screenshot=ready700.png \
//! --screenshot-theme=light --software-renderer
//! ULL_DL_READY_SHOT=ready700.png cargo test -p unlucky-app-iced --lib options_shot
//! ```
//!
//! 抓得住:①列表区 **≥ 6 整行**(数版本号那列的墨迹条数,行距 44);②尾部(提示那条
//! 分隔线)在 6 行之后——五五分时它落在第 4 行下方,两条都立刻红。
//! 抓不住:提示文案本身、hover/tooltip 层(静态图拍不到);也不管「选中且展开」那一态
//!(那是 `chips.rs` 的活)。
use super::{bands, shot_path, ui, Shot, READY_SHOT};
/// `ready` 那一态(700×760):8 个版本里至少 6 行要在屏,尾部提示不许把列表压扁。
///
/// 修前实测(M125 r1,`TailShare::of` 只判档位的版本):列表区 `374..559` = 185px = 4 行,
/// 版本号那列只有 4 条墨迹;面板那半块 185px 里只有一行 `Pick a version, then install`,
/// 其余是空白 —— 这条断言在那种图上是红的(4 < 6)。
#[test]
fn a_ready_shot_keeps_the_whole_visible_list() {
let Some(path) = shot_path(READY_SHOT) else {
eprintln!("[options-shot] SKIPPED:未设置 {READY_SHOT}。");
return;
};
let shot = Shot::load(&path);
assert_eq!(shot.width, 700, "这条只认 700×760 那张(chips 档)");
let bands = bands(700.0);
let canvas = shot.at(bands.list.0 + 2, 12);
let metrics = ui().metrics();
let right = bands.list.0 + bands.list.1 as usize - 2;
// ① 第一行版本号的墨迹带(ready 态没有选中行,所以量的是**文本**而不是底色;
// x 取 `+100` 落在版本号那几个字上——`+60` 会落进「前置下载图标」与文字之间的空档)
let (first_ink, _) = shot
.first_filled_band(bands.list.0 + 100, 360, 440, canvas)
.expect("列表列里应当有版本行");
// ② 尾部(提示)上沿的分隔线:它上面的高度才是列表拿到的
let rule = shot
.first_rule_y(bands.list.0, right, first_ink, canvas)
.expect("找不到尾部那条分隔线(列表区的下界量不出来)");
// ③ 数得出几个版本号:8 行里至少 6 行在屏
let rows = shot.ink_bands(
bands.list.0 + 50,
bands.list.0 + 140,
first_ink,
rule,
canvas,
);
assert!(
rows >= 6,
"ready 态只读得出 {rows} 个版本号(要求 ≥ 6 个,演示数据共 8 个):\
面板那一行提示把列表对半切了(列表区 y={first_ink}..{rule},\
共 {}px,行高 {})",
rule - first_ink,
metrics.row_height
);
assert!(
(rule - first_ink) as f32 >= 6.0 * metrics.row_height - metrics.row_height / 2.0,
"ready 态的列表区只有 {}px(y={first_ink}..{rule}),不足 6 整行",
rule - first_ink
);
}