fix(iced/feedback): 复审 r3 的 A/B/D/E/F 项 + C 项待 rebase 后改 view_at

(先落一个中间提交,rebase main 之后再按 tower 的修正把空态图标改成 32/view_at)
This commit is contained in:
AskaEth committed 2026-11-02 15:56:46 +08:00
1 parent 5d9e75efd8
commit a4cdd61fe5
12 files changed
+325 -108

No files matched your search

@@ -54,8 +54,14 @@ const HOST_MIN: f32 = 368.0;
const HOST_NARROW: f32 = 324.0;
/// `Snackbar` 宿主高(比 68 + 2×12 略高,留出贴顶/贴底的判定余量)。
const HOST_TALL: f32 = 96.0;
/// 单行提示条的宿主高(48 + 2×12 外边距 = 72,正好装下)。
const HOST_SHORT: f32 = 72.0;
/// 窄宿主:给 `Dialog::width` 递 360,量「窄宿主不再被裁」的那一格(复审 E)。
const NARROW_HOST: f32 = 360.0;
/// 单行提示条的宿主高。
///
/// **96 而不是 72**(复审 D):72 = 48 + 2×12 时上下外边距相等,像素上分不出「贴底」还是
/// 「居中」;96 让贴底那格的上留白 = 36、下留白 = 12,探针能量到「条底距宿主底 = 12」。
const HOST_SHORT: f32 = 96.0;
/// 空态宿主高:内容本征高 ≈96+16+32+8+16+24+40 ≈ 232,留出上下各 40 的余量。
const HOST_EMPTY: f32 = 320.0;
@@ -100,6 +106,29 @@ fn caption<'a>(ui: &'a Ui, value: &'a str) -> Element<'a, DemoMessage> {
.into()
}
/// 带 1px 取景框的宿主:`Snackbar` 的贴底/贴顶需要一条**可见的宿主边界**才量得出来
/// (透明宿主的底边在图上不存在,`Placement::Bottom` 就不可证)。
fn framed_host<'a>(
ui: &'a Ui,
width: f32,
height: f32,
content: impl Into<Element<'a, DemoMessage>>,
) -> Element<'a, DemoMessage> {
let line = ui.color(Role::OutlineVariant);
container(content)
.width(Length::Fixed(width))
.height(Length::Fixed(height))
.style(move |_theme| container::Style {
border: iced::Border {
color: line,
width: crate::theme::STROKE_PX,
radius: iced::border::Radius::default(),
},
..container::Style::default()
})
.into()
}
/// 固定宽宿主(量宽度用:宿主宽写死,组件内部的占比/夹取才有确定值)。
fn host<'a>(
width: f32,
@@ -214,9 +243,10 @@ fn snackbar_block<'a>(ui: &'a Ui) -> Element<'a, DemoMessage> {
.state(Interaction::Hovered),
),
);
let mid = host(
let mid = framed_host(
ui,
HOST_MIN,
Some(HOST_SHORT),
HOST_SHORT,
feedback::snackbar(
ui,
Snackbar::new("已删除实例")
@@ -224,9 +254,10 @@ fn snackbar_block<'a>(ui: &'a Ui) -> Element<'a, DemoMessage> {
.action("撤销", press("snackbar/undo")),
),
);
let narrow = host(
let narrow = framed_host(
ui,
HOST_NARROW,
Some(HOST_SHORT),
HOST_SHORT,
feedback::snackbar(ui, Snackbar::new("宿主 324").placement(Placement::Bottom)),
);
@@ -243,7 +274,7 @@ fn snackbar_block<'a>(ui: &'a Ui) -> Element<'a, DemoMessage> {
two_lines,
caption(
ui,
"宿主 324 ⇒ 条 300:组件没有 min-width,宿主给多少就是多少(G17-d)"
"宿主 324(取景框)⇒ 条 300:组件没有 min-width,宿主给多少就是多少(G17-d);贴底 = 条底距框底 12"
),
narrow,
caption(ui, "宿主 368 ⇒ 条 344:最小宽的取值口径([估])"),
@@ -289,6 +320,11 @@ fn dialog_block<'a>(ui: &'a Ui, full: bool) -> Element<'a, DemoMessage> {
Dialog::new("已导入整合包", "共 42 个模组,缺失 0 个。")
.confirm("知道了", press("dialog/ok")),
);
// 窄宿主那格:可用宽 360 ⇒ `min(480, 360) = 360`,且不得低于官方下限 280。
let narrow = feedback::dialog(
ui,
Dialog::new("窄宿主 360", "可用宽 360 时取 min(480, 360)。").width(NARROW_HOST),
);
// 强制 hover:动作件的状态层必须来自 `interaction`(不是组件里自己乘 8%)。
let double = feedback::dialog(
ui,
@@ -307,8 +343,9 @@ fn dialog_block<'a>(ui: &'a Ui, full: bool) -> Element<'a, DemoMessage> {
.spacing(ui.space(Space::X2));
body = body.push(row![plain, single].spacing(ui.space(Space::X6)));
// 双动作 + 窄宿主并排:探针要同时量到 480 与 360 两种宽
body = body.push(row![double, narrow].spacing(ui.space(Space::X6)));
if full {
body = body.push(double);
body = body.push(caption(
ui,
"Dialog · scrim = 黑@0.32 叠 canvas 的实色(D27 预合成;详见 dialog.rs 模块文档)",