fix(download): 窄档面板加专属预算,首屏露出 head+六枚 chip+说明、实例名回到 56px(M227)
720×760(chips 档)原先走 `TailShare::Shared`:面板与列表各吃 Fill 的一半,面板钉死区 (说明 + 菜单 + 实例名 ≈180px)把它吃穿 ⇒ 滚动区视口 0,head(版本 id + 安装按钮)、 六枚加载器 chip、说明一个像素都不在屏,实例名被挤成 35px 且降部被自身边框裁掉 (M222 D30 五审 `artifacts/m222/visual-verdict-r5-hold.md`)。 改法(把 M222 在 1180 档验证过的「面板先保预算、列表吃整行」落到窄档): - `TailShare` 拆出第三支 `Narrow`(chips 档 + 面板占高度),`of()` 的三条 arm 与 `Shared` 的机制注释按 r8 finding 重写(旧文档只写 M125 那一条条件); - 新增 `CHIPS_STACK` 121 / `CHIPS_LIST_CHROME` 119 / `CHIPS_PANEL_BUDGET` 192 与 `narrow_rows()`:720/760 下面板先拿预算,列表 = **132px = 3 整行**(M125 像素守门的下限); - `options::section` 三分支:窄档钉死区**只留实例名**,head / 六枚 chip / 说明 / 版本菜单 进滚动区(滚动区 120px ≥ 首屏 104,菜单露容器上沿 + 滚动条可见); - `TailShare::list_height()` 把「列表吃多少」收到一处,两个装配点共用(三栏档行为不变)。 取舍:窄档列表 4 整行 → 3 整行;菜单从钉死改为可滚。理由(459px 里「钉住菜单」+「3 整行 列表」互斥)写在 `rows/tail.rs::CHIPS_PANEL_BUDGET`。 实测(tiny-skia 出图 + 自写 measure.py,DevDocs/artifacts/m227/): 720×760 分隔线 559→514、滚动区 0→120、head 539–578、chips 583–614(32px)、说明 623–634 (8.98:1 浅 / 10.83:1 深)、实例名 668–723 = 56px(inset 12/9/17); 700×760(options-fabric)实例名从「完全不在屏」回到 56px;四条像素守门全绿; 1180×760 浅/深/中 与 1180×900 **逐像素零变化**。
This commit is contained in:
1 parent
6c060a09e2
commit
a70d5f8010
9 files changed
+331
-159
No files matched your search
@@ -10,15 +10,16 @@
|
||||
//! 所以列表独立滚动(`rows::list`),面板固定占尾部一块高度。
|
||||
//!
|
||||
//! **M125 的例外**:chips 档(窗口 < 736,竖栏退回顶部 chip 行)里这块面板太贵——它按内容高
|
||||
//! 钉死会把版本列表压成 18px 的缝。那一档改成「列表与面板各吃一半、面板自己可滚」
|
||||
//! (`rows::TailShare::Shared`)——但只在**面板真的占高度**时(`Options` / `Install`);
|
||||
//! 只画一行提示的 `Hint` 态仍钉死,否则 8 个版本的列表会被砍到 4 行(r1 复审 P2-1)。
|
||||
//! 钉死会把版本列表压成 18px 的缝。那一档改成「面板先保预算、列表按整行吃剩下的」
|
||||
//! (`rows::TailShare::Narrow`,预算见 `rows/tail.rs::CHIPS_PANEL_BUDGET`)——而且只在
|
||||
//! **面板真的占高度**时(`Options` / `Install`);只画一行提示的 `Hint` 态仍钉死,
|
||||
//! 否则 8 个版本的列表会被砍到 4 行(r1 复审 P2-1)。
|
||||
//!
|
||||
//! ## 面板的滚动分层(M222 D30 六轮打磨后的实际形态)
|
||||
//! ## 面板的滚动分层(M227 之后的实际形态)
|
||||
//!
|
||||
//! ```text
|
||||
//! 版本行列表 scrollable ← 第 1 层(任何档位都在)
|
||||
//! └ 选项区 scrollable(Shared 档才有) ← 第 2 层(`options/view.rs::section`,只装 head + chips)
|
||||
//! └ 选项区 scrollable(Shared / Narrow) ← 第 2 层(`options/view.rs::section`)
|
||||
//! └ 加载器版本 menu 的 scrollable ← 第 3 层(`options/view.rs::version_menu_height`)
|
||||
//! ```
|
||||
//!
|
||||
@@ -28,12 +29,15 @@
|
||||
//! **鼠标落在内层上滚轮会不会冒泡到外层,本仓仍没有实测通道**(静态图拍不到滚动嵌套)。
|
||||
//! iced 在指针悬停于内层时由内层消费滚动,所以「滚到底之后继续滚会带动外层」属**未验证行为**;
|
||||
//! 两个方向的坏结果分别是「面板卡住滚不动」与「一滚就跳到外层」。
|
||||
//! **M227 加了新的嵌套**:窄档里版本菜单在选项区的滚动区**之内**(三栏档它在钉死区、不嵌套),
|
||||
//! 于是窄档是「菜单 → 选项区 → (列表外层没有)」两级嵌套,这条未验项在窄档变得更相关。
|
||||
//!
|
||||
//! ## 钉死页脚**已经做了**(M222 `6f87c8b` 起)
|
||||
//! ## 钉死页脚(M222 `6f87c8b` 起,M227 收窄)
|
||||
//!
|
||||
//! `options::section` 现在是「可滚的上半块 + 钉死的下半块」:钉死区内是**加载器版本菜单 +
|
||||
//! 实例名输入框**(D30 四审:菜单也钉住,否则它正好落在裁切线上)。所以「实例名被滚走」
|
||||
//! 这个风险已经消除,只剩上面那条滚轮冒泡未验。
|
||||
//! `options::section` 是「可滚的上半块 + 钉死的下半块」:三栏档钉死区是**说明行 + 版本菜单 +
|
||||
//! 实例名**(D30 四审:菜单也钉住,否则它正好落在裁切线上);chips 档(`Narrow`)钉死区
|
||||
//! **只剩实例名**——窄档的 459px 装不下「钉住菜单」+「3 整行列表」两个都要(算术见
|
||||
//! `rows/tail.rs::CHIPS_PANEL_BUDGET`),于是菜单进滚动区(滚得到、滚动条可见)。
|
||||
//!
|
||||
//! ## 只有意图,没有乐观回显
|
||||
//!
|
||||
@@ -78,6 +82,7 @@ use super::super::frame;
|
||||
use super::super::Message;
|
||||
use super::model::{Download, InstallView};
|
||||
use super::options::OptionsView;
|
||||
use super::rows::TailShare;
|
||||
|
||||
/// 面板要画哪一种形态(**决策与画法分开**:决策是纯函数,单测直接钉它)。
|
||||
///
|
||||
@@ -110,50 +115,55 @@ pub(super) fn panel_state(model: &Download) -> PanelState<'_> {
|
||||
|
||||
/// 底部的安装面板。
|
||||
///
|
||||
/// `shared` = 选项区走「面板先保预算、列表按整行吃剩下的」那一档(`rows::TailShare::Shared`
|
||||
/// 的带版本列表分支;分高规则见 `rows/tail.rs::whole_rows`,**不是**早期的「对半分」)。
|
||||
/// 此时选项区自己分成两段(`options::section`):
|
||||
/// `share` = 分高方式(`rows::TailShare`,面板内部形态跟着它走):
|
||||
///
|
||||
/// - **滚动区**:head(版本 id + 安装按钮)+ 六枚加载器 chips;
|
||||
/// - **钉死区**:说明行(有说明时;否则是「加载器版本」标签)+ 版本菜单 + 实例名输入框。
|
||||
/// - [`TailShare::Pinned`]:内容照原样铺开(面板按内容高钉在底部);
|
||||
/// - [`TailShare::Shared`](三栏档 + 带版本列表的选项区):
|
||||
/// **滚动区** = head(版本 id + 安装按钮)+ 六枚加载器 chips;
|
||||
/// **钉死区** = 说明行(有说明时;否则是「加载器版本」标签)+ 版本菜单 + 实例名输入框;
|
||||
/// - [`TailShare::Narrow`](chips 档 + 面板占高度):
|
||||
/// **滚动区** = head + 六枚 chips + 说明行 + 版本菜单;
|
||||
/// **钉死区**只剩实例名输入框(理由与预算见 `rows/tail.rs::CHIPS_PANEL_BUDGET`)。
|
||||
///
|
||||
/// 菜单与说明分别是 D30 四审 / 八审搬进钉死区的(裁切位置由钉死区高度决定,与窗宽无关)。
|
||||
/// 菜单在 `Shared` 档是钉住的(D30 四审:裁切位置由钉死区高度决定,与窗宽无关,760 下它会正好
|
||||
/// 落在切线上),在 `Narrow` 档则**在滚动区里**——窄档没有多余高度同时钉住「菜单 + 3 整行列表」,
|
||||
/// 而列表那 3 整行是 M125 像素守门的下限。两支的取舍都写在 `rows/tail.rs`。
|
||||
///
|
||||
/// **两个 Shared 分支的现实不同,别一概而论**(`rows/tail.rs::TailShare::of`):
|
||||
///
|
||||
/// - **三栏档 + 带加载器版本列表**:`has_loader_versions()` 要求 `problem.is_none()`,所以这一支
|
||||
/// 滚动区里**只会有 head + chips**,错误行与它不可达;
|
||||
/// - **chips 档(可用宽 < 600)**:`TailShare::of` 对 `Options`/`Install` 无条件 `Shared`,
|
||||
/// `problem` **可以是** `Some`(静态不兼容 / 版本列表取不到 / 空表三种),那时错误行**会在
|
||||
/// 滚动区里出现**、可能被滚走;`show_versions()` 为假时钉死区只剩实例名(没有菜单、也没有
|
||||
/// 说明那一行)。这个行为域正好是 M227 要重新设计的地方,这里只如实记录现状。
|
||||
/// - **chips 档**:`TailShare::of` 对 `Options`/`Install` 无条件 `Narrow`,`problem` **可以是**
|
||||
/// `Some`(静态不兼容 / 版本列表取不到 / 空表三种),那时错误行**在滚动区里**、可能被滚走;
|
||||
/// `show_versions()` 为假时滚动区只剩 head + chips + 错误行,钉死区只有实例名。
|
||||
pub(super) fn panel<'a>(ui: &'a Ui, catalog: Catalog, model: &'a Download) -> Element<'a, Message> {
|
||||
panel_with(ui, catalog, model, false)
|
||||
panel_with(ui, catalog, model, TailShare::Pinned)
|
||||
}
|
||||
|
||||
/// 同 [`panel`],但显式给「面板先保预算」这一档的标志(只有 `rows::content` 需要)。
|
||||
/// 同 [`panel`],但显式给分高方式(只有 `rows::content` 需要)。
|
||||
pub(super) fn panel_with<'a>(
|
||||
ui: &'a Ui,
|
||||
catalog: Catalog,
|
||||
model: &'a Download,
|
||||
shared: bool,
|
||||
share: TailShare,
|
||||
) -> Element<'a, Message> {
|
||||
let content = match panel_state(model) {
|
||||
PanelState::Install(install) => installing(ui, catalog, install),
|
||||
// 选中版本之后**先给选项,再点「安装」**(M105:以前是选中就直接开工,等于没有加载器维度)
|
||||
PanelState::Options(options) => super::options::section(ui, catalog, options, shared),
|
||||
PanelState::Options(options) => super::options::section(ui, catalog, options, share),
|
||||
PanelState::Hint => hint(ui, catalog),
|
||||
};
|
||||
|
||||
// 上下各 12 的面板留白(`[X3, 0]` 的两元组是「垂直 / 水平」)。窄档预算把它算进去了。
|
||||
let panel = container(content)
|
||||
.width(Length::Fill)
|
||||
.padding(Padding::from([ui.space(Space::X3), 0.0]));
|
||||
// 面板先保预算档:面板吃满自己那份(`rows/tail.rs::whole_rows` 之后剩下的高度),
|
||||
// 面板先保预算那两支:面板吃满自己那份(列表按整行取高之后剩下的高度),
|
||||
// 选项区的 `scrollable` 才有确定高度可吃。
|
||||
if shared {
|
||||
panel.height(Length::Fill).into()
|
||||
} else {
|
||||
if matches!(share, TailShare::Pinned) {
|
||||
panel.into()
|
||||
} else {
|
||||
panel.height(Length::Fill).into()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user