feat(app-iced): 禁用态合成底改成容器给的 Base(M234)
`interaction::disabled` 的四个入口一直收一个「底」,但 8 个调用点全传死 `Role::Surface`:卡片(SurfaceContainer)/ 面板(SurfaceContainerLow)里的禁用控件 把 10%(按钮族)/ 12%(面状控件族)叠在画布色上 —— M223「CR 1.05、形丢失」的根因。 - 新增 `interaction::Base`(画布 / 容器底的一等参数,`From<Role>` 兼容历史调用点); 四个入口改成 `(ui, base, …)`,内部不再出现任何写死的 `Role::Surface`。 - 容器导出自己的 `BASE`:`surfaces::elevated::BASE`(卡)、`inputs::menu::PANEL_BASE` (菜单面板,项的 38% 与状态层都改叠它)、`navigation::drawer::BASE`。 - 控件收 `.base(..)`:Button / icon_on / Field / SearchBar / Slider / Checkbox / Radio / Switch / Chip / ListItem / Tabs;Fab 与 icon() 是画布默认值。 - `feedback/action.rs` 的本地 α 合成删掉,改走 `disabled_content_over_role` 并给真实容器底 (Snackbar `InverseSurface` / Dialog `SurfaceContainerHigh`)。 - 判据:`interaction::disabled::tests`(卡片/面板/画布三档逐值)、 `buttons::tests::base`(Button::base → StyleSpec → style_closure 接线)、 `gallery` 新增 `disabledbase` 段 + `gallery::probe::bases` 精确像素断言 (±10 容差区分不了 1/255 的差,所以自己数逐位相等的像素)。 - 变异自证:assemble 的调用点改回画布底后,上面两条都红(见 artifacts/m234/README.md)。 已知未尽:`crates/app-iced/src/pages/**` 不在 scope 内,页面侧「把控件放进卡片/面板」的 调用点尚未接 `.base(..)`(行为与本 mission 之前一致);`pages/…/java/tests/marker.rs` 有一行被迫更新(入口多了一个实参,语义不变 = 画布底)。
This commit is contained in:
1 parent
a9d1cb4c44
commit
35dbefb08d
48 files changed
+1690
-496
No files matched your search
@@ -22,7 +22,7 @@ use unlucky_design::typography::TypeRole;
|
||||
|
||||
use crate::theme::Ui;
|
||||
|
||||
use super::super::interaction::Interaction;
|
||||
use super::super::interaction::{Base, Interaction};
|
||||
use super::geometry::ControlGeometry;
|
||||
use super::paint::{self, Frame};
|
||||
use super::shell::{self, StateSource};
|
||||
@@ -34,6 +34,8 @@ pub struct Radio<'a, M> {
|
||||
selected: bool,
|
||||
on_select: Option<M>,
|
||||
state: Option<Interaction>,
|
||||
/// 脚下那一层的底(M234,禁用态合成用)。
|
||||
base: Base,
|
||||
}
|
||||
|
||||
impl<'a, M> Radio<'a, M> {
|
||||
@@ -44,6 +46,7 @@ impl<'a, M> Radio<'a, M> {
|
||||
selected,
|
||||
on_select: Some(on_select),
|
||||
state: None,
|
||||
base: Base::CANVAS,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +57,7 @@ impl<'a, M> Radio<'a, M> {
|
||||
selected,
|
||||
on_select: None,
|
||||
state: None,
|
||||
base: Base::CANVAS,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +66,12 @@ impl<'a, M> Radio<'a, M> {
|
||||
self.state = Some(state);
|
||||
self
|
||||
}
|
||||
|
||||
/// **告诉单选框它踩在什么底上**(M234):禁用态的 38% 环/内点叠在这个底上。
|
||||
pub fn base(mut self, base: impl Into<Base>) -> Self {
|
||||
self.base = base.into();
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
/// 画一个单选框(环 + 内点 + 标签)。
|
||||
@@ -71,11 +81,12 @@ pub fn radio<'a, M: Clone + 'a>(ui: &'a Ui, spec: Radio<'a, M>) -> Element<'a, M
|
||||
let radius = geometry.radius;
|
||||
let stroke = geometry.stroke;
|
||||
let dot_side = geometry.inner_dot;
|
||||
let base = spec.base;
|
||||
let source = StateSource::new(spec.state, spec.on_select.is_some());
|
||||
|
||||
// 内点与环的颜色与 hover/pressed 无关(A1:选中态四态都是 `Primary`),
|
||||
// 只随「选中 + 禁用」变 —— 所以点的颜色在这里静态求值即可。
|
||||
let at_rest = paint::radio(ui, selected, source.get(), radius, stroke);
|
||||
let at_rest = paint::radio(ui, base, selected, source.get(), radius, stroke);
|
||||
|
||||
// Ø10 内点(半径 = 直径/2)
|
||||
let dot: Element<'a, M> = match at_rest.dot {
|
||||
@@ -102,7 +113,7 @@ pub fn radio<'a, M: Clone + 'a>(ui: &'a Ui, spec: Radio<'a, M>) -> Element<'a, M
|
||||
.align_x(Alignment::Center)
|
||||
.align_y(Alignment::Center)
|
||||
.style(source.container_style(move |state| {
|
||||
paint::radio(ui, selected, state, radius, stroke)
|
||||
paint::radio(ui, base, selected, state, radius, stroke)
|
||||
.ring
|
||||
.container_style()
|
||||
}));
|
||||
@@ -131,7 +142,7 @@ pub fn radio<'a, M: Clone + 'a>(ui: &'a Ui, spec: Radio<'a, M>) -> Element<'a, M
|
||||
text(spec.label)
|
||||
.size(style.size_px)
|
||||
.font(ui.font_of(style))
|
||||
.color(paint::label(ui, source.get())),
|
||||
.color(paint::label(ui, base, source.get())),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user