fix(app-iced): M75 —— 截图取证必须能强制「静息」态(光标污染修掉)

StyleSpec.forced 从 Interaction 改成 Option<Interaction>:Some(Enabled) 与 None 语义不同——
前者强制画静息,后者才跟随 button::Status。修前光标恰好停在某个格子上时,gallery 的
enabled 列会被画成 hover(表现为 text 行出现不该有的灰底容器,看着像 Text 按钮自带容器)。
This commit is contained in:
AskaEth committed 2026-11-02 04:50:47 +08:00
1 parent 5861881073
commit 5f85891e7e
5 files changed
+31 -47

No files matched your search

@@ -32,8 +32,12 @@ pub(super) struct StyleSpec {
pub shape: ShapeScale,
/// 圆角折算用的边长(药丸 = 可见高)。
pub radius_side: f32,
/// 强制态(gallery 取证);`Enabled` 时跟随运行期的 `button::Status`。
pub forced: Interaction,
/// 强制态(gallery 取证);`None` = 跟随运行期的 `button::Status`。
///
/// **`Some(Enabled)` 与 `None` 不是一回事**:截图取证必须能强制「静息」,否则光标恰好停在
/// 某个按钮上时那一格会被画成 hover(实测踩过:text 行 enabled 列出现不该有的灰底容器,
/// 看起来像 Text 按钮自带容器)。
pub forced: Option<Interaction>,
}
/// 五式共用的装配:**只画一处**,五个变体函数都走这里。
@@ -89,10 +93,10 @@ pub(super) fn assemble<'a, M: Clone + 'a>(
.height(Length::Fill)
.align_y(iced::Alignment::Center);
let forced = spec.state.unwrap_or(if spec.on_press.is_none() {
Interaction::Disabled
let forced = spec.state.or(if spec.on_press.is_none() {
Some(Interaction::Disabled)
} else {
Interaction::Enabled
None
});
let style = style_closure(
@@ -125,10 +129,9 @@ pub(super) fn style_closure(
) -> impl Fn(&iced::Theme, button::Status) -> button::Style + '_ {
move |_theme: &iced::Theme, status| {
// 强制态优先(gallery 状态矩阵),否则把 iced 的四态翻成 M3 五态
let state = match spec.forced {
Interaction::Enabled => Interaction::from_status(status),
forced => forced,
};
let state = spec
.forced
.unwrap_or_else(|| Interaction::from_status(status));
let (background, text_color) = if state.is_disabled() {
let (container, content) = interaction::disabled_colors(ui, Role::Surface);