fix(app-iced): 版本列表在三栏对半分档按整行取高(S1b/S9)

列表视口高度不再是「Fill 剩下的」:正文列高度由仓里已有的 `frame::body_height` 算出,
经 `view_sized` → `body` → `rails::three_column` → `rows::content` 传下来,Shared 档据此
`floor(((h − LIST_CHROME)/2) / ROW_PITCH) * ROW_PITCH` 取整行。

实测(1180×760):列表 245px → **239px**(分隔线 498 → 492,腾出的 6px 归面板),
`04` 对照**未变**(531 / 278px),720 窄窗**未变**(本来就是 4.0 整行、底缘 0 墨迹)。

两处修正写在提交里:
1. 第一版给所有三栏场合取整,把 `04` 也缩到 239px ⇒ 收窄为只在 `TailShare::Shared` 取整;
2. `rows.rs` 涨到 419 行撞 400 行门禁 ⇒ `TailShare` 与三个标定量纯搬移到 `rows/tail.rs`,
   `rows.rs` 回到 355 行(门禁 `components::gate` 与全仓扫描都绿)。

`view` 保留 4 参数(`#[cfg(test)]`,只有单测用),产品路径走 `view_sized`。
This commit is contained in:
AskaEth committed 2026-11-10 19:34:13 +08:00
1 parent f29ca609ec
commit 954281d71a
5 files changed
+131 -55

No files matched your search

+27 -2
View File
@@ -161,11 +161,25 @@ use super::{Action, Message};
///
/// `lang` 是 i18n 的入参,调用点传的是 `pages::Model.lang`(M106 起 = `App` 的生效语言,
/// 见 `ui::lang::LangState`);页面自己不读全局、不猜语言。
/// 四参数的 [`view_sized`]:给**用不到窗口高度**的调用方(只有单测;产品路径走
/// `pages::view` → [`view_sized`],所以这条在非 test 构建里是死代码,`#[cfg(test)]` 收口)。
#[cfg(test)]
pub fn view<'a>(
ui: &'a Ui,
metrics: FrameMetrics,
model: &'a Download,
lang: Lang,
) -> Element<'a, Message> {
view_sized(ui, metrics, model, lang, 760.0)
}
/// 同 [`view`],但显式给**窗口高度**(版本列表要按整行取高,见 [`rows::whole_rows`])。
pub fn view_sized<'a>(
ui: &'a Ui,
metrics: FrameMetrics,
model: &'a Download,
lang: Lang,
window_height: f32,
) -> Element<'a, Message> {
let catalog = lang.catalog();
@@ -182,7 +196,15 @@ pub fn view<'a>(
),
));
frame::page(ui, metrics, header, body(ui, metrics, catalog, model))
// 正文列高度 = 窗口 − 标题栏 − 页头 − 上下页边距(唯一来源 [`frame::body_height`])。
// 版本列表要按**整行**取高,就得知道这一块有多高(D30 r2 S1b/S9)。
let body_height = frame::body_height(ui, metrics, window_height, true);
frame::page(
ui,
metrics,
header,
body(ui, metrics, catalog, model, body_height),
)
}
/// 正文:加载态仍是居中占位;其余状态都长在三栏骨架上。
@@ -191,6 +213,7 @@ fn body<'a>(
metrics: FrameMetrics,
catalog: Catalog,
model: &'a Download,
body_height: f32,
) -> Element<'a, Message> {
if model.is_loading() {
// 还没拉到版本列表:三栏没有内容可填,给占位(安装面板照旧带着,见 M94 复审 p3)
@@ -221,7 +244,7 @@ fn body<'a>(
};
let content: Element<'a, Message> = if rails.tier.is_three_column() {
rails::three_column(ui, catalog, model, rails)
rails::three_column(ui, catalog, model, rails, body_height)
} else {
// 三栏不成立(可用宽 < 600):类型与主版本原样退回顶部 chips,列表吃掉整条可用宽。
// 高度分法跟着档位走:chips 档多花两行 chip,面板必须收回自己的一半(M125 缺陷 1)。
@@ -233,6 +256,8 @@ fn body<'a>(
catalog,
model,
rows::TailShare::of(rails.tier, &install::panel_state(model)),
// chips 档不按整行取高:实测那里已经是 4.0 整行、零残影,别动。
None,
),
]
.spacing(ui.space(Space::X2))