fix(app-iced): 选项区变高时与版本列表对半分(S1)+ 中英出图注入 + 注释同步

D30 r1 视觉驳回的三条里,代码能修的两条:

1. **S1 版面**:带加载器版本列表的选项区在三栏档把版本列表从 6.0 行压到 2.4 行(1180×760
   实测 278px→110px,底缘切在第三行图标上)。`rows::TailShare::of` 现在让这类面板在**任何档位**
   都与列表对半分(`scrollable` 分支早已存在),另把加载器版本菜单改成**按条目数**占高
   (1 条 64px / 2 条 112px,原先只有 1 条也固定撑两行)。实测:列表回到 **245px = 5.3 行**。
2. **注释同步(S6)**:`options/view.rs` 模块头原先写「加载器分成两行」+ 两行示意,实际是
   六枚一行(末枚右缘约 404px / 正文列 424);那条「本轮无看图通道,未出截图」也换成实测值。

顺带(使能中文出图):`pages/mod.rs::demo_model` 读 `ULL_DL_LANG=zh` 把 `model.lang` 与下载页
目录一起切中文。之前 `LC_ALL=zh_CN.UTF-8` 对出图**完全无效**——页面文案来自 `model.lang`,
而 `Model::new` 写死 `En`、`demo_model` 不碰它(`i18n::detect_env` 不在这条链上)。

测试:`options/s1_tests.rs` 新增两条(菜单只按整行占高;带版本列表的选项区在每个档位都 Shared,
原版/不兼容仍 Pinned),`-p unlucky-app-iced` 862 passed。

未完成:S2 窄窗「滚到底」图——iced 0.14 没有自由函数 `scroll_to`,程序化滚动要手写
`widget::Operation`(约 40 行),本轮不拿半成品充数;面板 `scrollable` 的稳定 Id 已就位。
This commit is contained in:
AskaEth committed 2026-11-10 19:34:13 +08:00
1 parent 841c17152a
commit cd7813f8eb
7 files changed
+162 -18

No files matched your search

@@ -5,21 +5,22 @@
//! ```text
//! 1.21.9 [安装]
//! 安装选项
//! [原版][Forge][NeoForge]
//! [Fabric][Quilt]
//! [原版][Forge][NeoForge][Fabric][Quilt][LiteLoader] ← 六枚一行
//! LiteLoader 只叠在原版上 —— 要叠 Forge 请运行:… ← 中性说明(只有 LiteLoader 有)
//! 加载器版本 ← 只在选了加载器时出现
//! ┌ 0.16.5 ┐ ← 官方那份列表(menu + 滚动,最多看两行)
//! ┌ 0.16.5 ┐ ← 官方那份列表(menu + 滚动,最多看两行项)
//! │ 0.16.4 │
//! └───────────────────┘
//! [实例名 ]
//! NeoForge 需要 Minecraft 1.20.1 或更新 ← 不兼容时(Error 色)
//! ```
//!
//! ## 为什么加载器分成两行
//! ## 为什么加载器是**六枚一行**(M222 D30 r1 实测订正)
//!
//! 五家一起排在 424 宽里最宽的那组(`原版 + Forge + NeoForge + Fabric + Quilt`)实测会溢出,
//! 而 chip 的几何是组件自己的真源(`ChipGeometry`),页面不许压它 ⇒ 折成两行。
//! 顺序仍是任务书的口径(原版 / Forge / NeoForge / Fabric / Quilt),只是换行。
//! 这里原先写「五家一起排会溢出 ⇒ 折成两行」,那是 M105 的推算。D30 的实测图(1180×760,
//! 正文列 424)是**六枚一行、末枚右缘约 404px**,没有溢出——所以示意与说明都改成了实际形态。
//! chip 的几何仍是组件自己的真源(`ChipGeometry`),页面不许压它;再来第七家时先看图再决定
//! 是否换行。
//!
//! ## 为什么「不兼容」不禁用 chip、而是禁用确认键
//!
@@ -50,12 +51,20 @@ use super::model::{Loader, LoaderVersionsView, OptionsView};
// 加载器 chip 的顺序与集合**委派**给 `Loader::ALL`(原版 / Forge / NeoForge / Fabric /
// Quilt / LiteLoader)。这里原先是手写的五枚常量——同一份清单的第三处副本
// (`dto::wizard_choices`、`Loader::ALL`、这里),M222 加 LiteLoader 时三处都得改,索性委派。
// ⚠️ 宽度需 D30 视觉复验:五枚 chip 实测合计约 311 dp(正文列 424),第六枚估算 +50 dp,
// 理论仍在行内,但那是估算不是实测(本轮无看图通道,未出浅/深色截图)。
// D30 r1 实测(1180×760 与 720×760 两种宽度、浅/深两套主题):六枚 chip 排在一行,
// 末枚(LiteLoader)右缘约 404px,正文列 424 仍有余量;窄窗 720 下同一行也没有溢出。
/// 菜单项高度 = 48(`MenuGeometry` 的项高)×2 行 + 上下留白 8×2 = 112。
/// 这么算是为了避免「列表被截掉半行」——滚动区高度必须覆盖整行。
const VERSION_ROWS: f32 = 7.0;
/// 加载器版本菜单的**可见高度**(像素):最多两行项 + 上下留白 8×2。
///
/// 项高 48 是 `MenuGeometry` 的真源;`Space::X2 = 8` 是上下留白 ⇒ 两行 = 112、一行 = 64。
/// 为什么按**条目数**取(M222 D30 r1 S1):LiteLoader 对 1.12.2 只有一条版本,原来固定撑到
/// 两行高(112px),那 48px 纯属空档,却正好是把上面版本列表挤成 2.4 行的元凶之一。
/// 单测 `options/view::tests` 直接钉这两档的数值。
pub(super) fn version_menu_height(items: usize) -> f32 {
const ITEM: f32 = 48.0;
let rows = items.clamp(1, 2) as f32;
rows * ITEM + Space::X2.dp() * 2.0
}
/// 选项区(面板的下半块)。
pub(crate) fn section<'a>(
@@ -196,7 +205,7 @@ fn version_list<'a>(
list = list.item(entry);
}
scrollable(menu(ui, list))
.height(Length::Fixed(ui.space(Space::X4) * VERSION_ROWS))
.height(Length::Fixed(version_menu_height(items.len())))
.style(frame::scroll_style(ui))
.into()
}