fix(app-iced): 版本行节距/列表 chrome 标定重算(44/97)+ 中性说明挪到版本菜单之后

三审给了独立量测,两处都按它的数字收敛:

1. `ROW_PITCH` 278/6=46.33 → **44.0**(278 里含列表与面板之间的 8px `Space::X2`);
   `LIST_CHROME` 93 → **97**(列顶 156 → 列表顶 253)。1180×760 分隔线 492 → **481**、
   列表视口 **220px = 5 整行**;1180×900 加测 = 308px = 7 整行,三审报的 900 高残影不复发。
2. S7 钉页脚引入的新问题:面板上半块的滚动切点压在字形上(宽窗切「加载器版本」标签上沿、
   窄窗把 chips 切成 4px 条)。把中性说明从菜单**之前**移到**之后**——它两行高,排前面正是把
   唯一的加载器专属控件顶出首屏的元凶。

顺带纠正一处文档:面板结构不是「头部 + 可滚上半 + 钉页脚」,head(版本 id + 安装按钮)是上半块
的第一个子项、**安装按钮也在滚动区**,只有实例名是钉死的。
This commit is contained in:
AskaEth committed 2026-11-10 19:34:14 +08:00
1 parent 954281d71a
commit 0ca28d24ff
2 files changed
+21 -16

No files matched your search

@@ -108,16 +108,6 @@ pub(crate) fn section<'a>(
// 中性说明(M222):只解释这一页能装到哪一层,不套错误色、不影响确认键。
// 换行由 iced 的文本布局负责,长句不会横向溢出;但**视觉验收仍需截图确认**(D30)。
if let Some(note) = &options.note {
body = body.push(frame::text_role(
ui,
TypeRole::BodySmall,
false,
note.as_str(),
ui.color(Role::OnSurfaceVariant),
));
}
// 「加载器版本」这一段只在**真该有列表**时出现:原版没有、静态不兼容没有(原因在下面那行)、
// 取不到也没有(同样在原因行)。留一个空标题只会让人以为界面缺了一块。
if show_versions(options) {
@@ -131,6 +121,19 @@ pub(crate) fn section<'a>(
body = body.push(version_list(ui, catalog, options));
}
// 中性说明排在**版本菜单之后**(D30 三审 S7-clip):说明两行高,排在菜单前面会把
// 「加载器版本」这个本页唯一的加载器专属控件顶出首屏,而面板上半块是滚动区,切点会落在
// 字形上。挪到菜单后面之后 1180×760 首屏能装下 head + chips + 标签 + 菜单,切点不再切字。
if let Some(note) = &options.note {
body = body.push(frame::text_role(
ui,
TypeRole::BodySmall,
false,
note.as_str(),
ui.color(Role::OnSurfaceVariant),
));
}
if let Some(problem) = &options.problem {
body = body.push(frame::text_role(
ui,
@@ -58,18 +58,20 @@ impl TailShare {
}
}
/// 版本行的**实测节距**(D30:`04` 图列表 278px / 6 行 = 46.33px)。
/// 版本行的**实测节距**(D30 三审:`04` 图行内下载图标的行首 265/309/353/397/441/485,
/// 节距恰 **44.0**;首行选中高亮矩形 253–296 也是 44px)。
///
/// 列表是 `Fill + scrollable` 时,视口高度不是节距整数倍就会切在某一行中间——D30 r2 实测
/// `01` 是 245px(5.3 行),英文态露出 6px 竖干、中文态露出「预览版」上半截。三栏档的
/// 「列表与面板对半分」那一档现在按整行取高([`whole_rows`]),底缘落在行边界上。
pub(crate) const ROW_PITCH: f32 = 278.0 / 6.0;
pub(crate) const ROW_PITCH: f32 = 44.0;
/// 列表列内部、列表以外要扣掉的固定占位(搜索条 + 分隔线 + 表头 + 列间距)。
/// 列表以外、列内要扣掉的固定占位(**列顶 156 → 列表顶 253**,D30 三审实测 = 97)。
///
/// D30 标定:1180×760 的正文列高([`frame::body_height`](crate::pages::frame::body_height))
/// 扣掉它再对半分,正好是 5 整行。**改搜索条 / 表头高度时要同步这个数。**
pub(crate) const LIST_CHROME: f32 = 93.0;
/// 1180×760:正文列 580 ⇒ floor((580−97)/2 / 44) × 44 = **220px = 5 整行**,分隔线落在 481。
/// 1180×900:floor((720−97)/2 / 44) × 44 = **308px = 7 整行**(三审在 900 高实测过:旧标定
/// 会在 y529–530 复发残影,新标定不复发)。**改搜索条 / 表头高度时要同步这个数。**
pub(crate) const LIST_CHROME: f32 = 97.0;
/// 正文列高度 → 列表视口的**整行高度**(只给三栏档的 Shared 分支用)。
#[must_use]