fix(packui): M113 第一批修正 —— 一次只摊开一件事、有界滚动、阶段词不再打架

D30 出图实测暴露的四个问题,都在本批范围内修掉:

1. **动作按钮被顶出屏幕**:内容库页正列没有整页滚动(只有结果列表自己滚),入口 + 报告 +
   导出三块同时摊开时,「确认写盘 / 关闭 / 以包为准重新导入」落在 900px 以下。
   改成一态一块(导出面板 > 进度 > 结果 > 入口);拖拽是窗口级事件,收起入口不丢功能。
2. **阶段词打架**:复用面板自带的阶段词是安装语义(Building the version),与
   「Step 2/5 · Unpacking overrides」并排时两种说法。现在面板阶段词留空、由步骤行说真话
   —— 仍然只有一份进度条 / 计数 / 取消按钮,没有第二套进度 UI。
3. **列表过长**:缺文件 / 冲突 / 预检样例与已知损失都套上「超过 n 条才滚」的有界容器
   (packui/view/parts.rs 的 bounded),少量条目时不浪费空间。
4. **英文单复数**:计数行改成「标签:值」(Files written: 2、cannot export: 1)。
   PackPathPlaceholder / PackFormatModrinth 的中文与英文雷同,被
   chinese_catalog_is_actually_chinese 抓到,一并改掉。

另:app/update.rs 加完拖拽分支后 408 行超线 → 两个钩子改成返回 Task、三个分支各一行,
现在 397 行。新增致命态出图夹具(ULL_CONTENT_PACK=failed),用来证明「容忍的缺文件」与
「致命回滚」在视觉上可区分。

门禁:cargo check ✓ / clippy -D warnings ✓ / cargo test -p unlucky-app-iced(467+6)✓ /
cargo test -p unlucky-i18n(24)✓ / rustfmt --check ✓ / wc -l 全表 ≤400 ✓
This commit is contained in:
AskaEth committed 2026-11-05 04:06:38 +08:00
1 parent fbeff94e55
commit 2129d8cee6
10 files changed
+161 -83

No files matched your search

@@ -4,23 +4,24 @@
//!
//! 「沿用既有安装面板组件与状态机,禁止再写第二套进度 UI」——
//!
//! 1. 导入的 `ImportStageView` / 计数 / 当前路径先映射成 [`InstallProgressView`](本文件
//! [`panel_progress`]);
//! 2. 画法交给 `pages::download::install_panel`(M109 已经打过薄包装,同一个函数、同一套几何
//! 与文案);
//! 3. 面板只认四个粗阶段(规划 / 下载 / 安装 / 登记),任务书要的「解包 / overrides / 补文件」
//! 三档由**一行步骤说明**([`stage_line`])承载。
//! 1. 导入的 `ImportStageView` / 计数先映射成面板的入参形状([`panel_progress`] →
//! `InstallProgressView` → [`InstallView`]);
//! 2. 画法交给 `pages::download::install_panel`(同一个函数、同一套几何,进度条 / 计数 /
//! 取消按钮都归它);
//! 3. 任务书要的「解包 / overrides / 补文件」三档由**一行步骤说明**([`stage_line`])承载,
//! 面板右边那个阶段词**留空**。
//!
//! 第 3 点不是第二套进度 UI:多出来的只是一句文字,进度条、计数行、取消按钮仍然只有那一份。
//! 为什么不再造一条按 `ImportStageView` 五档划分的进度条:那正是「第二套」的定义,而且两块条
//! 同时出现时用户不知道该信哪一条。
//! 第 3 点的理由:面板自带的四个阶段词是**安装**语义(规划 / 下载 / 生成版本 / 登记实例),
//! 套到导入上会出现「Step 2/5 · Unpacking overrides」旁边写着「Building the version」——
//! 同一块地方两种说法(出图时实测到了)。留空 + 由步骤行说真话,是**不动那个组件**的最小解;
//! 多出来的只有一句文字,没有第二条进度条。
use unlucky_i18n::{Catalog, Key};
use unlucky_presenter::dto::{
ImportProgressView, ImportStageView, InstallProgressView, InstallStage,
};
use crate::pages::download::Download;
use crate::pages::download::{Download, InstallView};
/// 抛进面板的进度行。
#[derive(Debug, Clone, PartialEq)]
@@ -100,14 +101,31 @@ pub fn panel_progress(progress: &ImportProgressView) -> InstallProgressView {
/// 进度事件 → 面板要的视图模型。
pub(super) fn running_of(progress: &ImportProgressView, catalog: Catalog) -> Running {
let panel = panel_progress(progress);
Running {
pack: progress.pack.clone(),
stage_line: stage_line(progress.stage, catalog),
panel: Download {
install: Some(crate::pages::download::install_view(
&panel_progress(progress),
catalog,
)),
install: Some(InstallView {
version: panel.version.clone(),
// 只用于 `running()` / `failed()` 的判定;**不**用它给用户看(见模块文档第 3 点)
stage: panel.stage,
stage_label: String::new(),
detail: if progress.is_known() {
catalog.render(
Key::DownloadProgress,
&[
("done", &progress.done.to_string()),
("total", &progress.total.to_string()),
],
)
} else {
catalog.text(Key::DownloadProgressUnknown).to_owned()
},
rate: None,
ratio: progress.ratio(),
known: progress.is_known(),
}),
..Download::loading()
},
}