diff --git a/crates/app-iced/src/pages/settings/mod.rs b/crates/app-iced/src/pages/settings/mod.rs index a4b998f..c686b09 100644 --- a/crates/app-iced/src/pages/settings/mod.rs +++ b/crates/app-iced/src/pages/settings/mod.rs @@ -169,13 +169,10 @@ use registry::{AI_GROUP, GENERAL_GROUP, GROUPS, GROUP_LABELS, JAVA_GROUP, SELECT /// 这一帧某个控件**实际要画**的交互态:`forced`(`--force-state`)优先,否则退回观测到的 `status`。 /// -/// **全仓唯一的 resolve 点(M285)**:语言档 / 主题档 / 日志 `action_button` / 外观 `choice` 四个站点 -/// 一律调它。谁在自己那个样式闭包里再写一遍 `unwrap_or_else`,就是把这行语义复制成四份——下一次 -/// 只改三处就等着漂。 -/// -/// 语义与 `pages/instances.rs` 的 `forced_state`(`Button::state(…)`,`Some` 覆盖、`None` 不动)相同; -/// 差别只在 iced 的裸 `button` 没有 `.state()`:样式闭包的签名固定收 `button::Status`,所以覆盖只能 -/// 发生在闭包**里面**(换掉它拿到的那一态),而不是控件上。 +/// **全仓唯一的 resolve 点(M285)**:语言档 / 主题档 / 日志 `action_button` / 外观 `choice` 一律调它 +/// ——各自再写一遍 `unwrap_or_else` 就是把同一行语义复制四份,下次只改三处就等着漂。语义与 +/// `pages/instances.rs` 的 `forced_state` 相同(`Some` 覆盖、`None` 不动),只是裸 `iced::button` 没有 +/// `.state()`,覆盖只能发生在样式闭包**里面**(换掉它拿到的那一态)。 pub(super) fn resolve_state(forced: Option, status: button::Status) -> Interaction { forced.unwrap_or_else(|| Interaction::from_status(status)) } @@ -183,10 +180,9 @@ pub(super) fn resolve_state(forced: Option, status: button::Status) /// 把一个 `components::buttons::Button` 钉到 `forced` 那一态(`pages/instances.rs` 的 `forced_state` /// 在设置页的这一份)。 /// -/// **这是第二份,不是抽象**(M285):实例页那条线的控件本身就是 `components::buttons::Button` -///(有 `state(Interaction)`),而设置页的 `choice` / `chip` / `action_button` 是裸 `iced::button`—— -/// 覆盖只能落在样式闭包里(见 [`resolve_state`])。三次法则现在到 2;第三次真出现时落点是 -/// `components/interaction/`,不是这里。 +/// **这是第二份,不是抽象**(M285):实例页的控件本身就是 `components::buttons::Button`(有 +/// `state(Interaction)`),设置页的 `choice` / `chip` / `action_button` 是裸 `iced::button`(走 +/// [`resolve_state`])。三次法则现在到 2;第三次真出现时落点是 `components/interaction/`,不是这里。 pub(super) fn forced_button<'a, M>( button: Button<'a, M>, forced: Option, @@ -227,9 +223,8 @@ impl Default for Language { /// `states` 是「画一帧时那份只读状态」:[`States::appearance`] 是 M93 接进来的外观运行期状态 /// (`None` = harness / 演示路径,设置页仍画占位行),[`States::groups`] 是各组自己的状态。 /// -/// `forced` 是 `pages::Model::forced`(`--force-state` 的落点,M285):一路递到各组的控件,由 -/// [`resolve_state`] 决定「这一帧画哪一态」。`None` = 照旧按控件自己的观测态画——**产品路径恒为 -/// `None`**(除了取证启动),所以默认行为逐字节不变。 +/// `forced` 是 `pages::Model::forced`(`--force-state`,M285):一路递给各组控件,由 [`resolve_state`] +/// 决定「这一帧画哪一态」。`None` = 照旧按观测态画(产品路径恒为 `None`,取证启动除外)⇒ 默认逐字节不变。 pub fn view<'a>( ui: &'a Ui, metrics: FrameMetrics, diff --git a/crates/app-iced/src/pages/tests/base_wiring.rs b/crates/app-iced/src/pages/tests/base_wiring.rs index 0743b77..bc39fe3 100644 --- a/crates/app-iced/src/pages/tests/base_wiring.rs +++ b/crates/app-iced/src/pages/tests/base_wiring.rs @@ -42,7 +42,7 @@ const WIRED: [(&str, usize); 9] = [ /// 手写样式(不走组件 `.base(..)`)的三处:状态层直接叠在 `frame::BASE.role()` 上。 const ROLE_SITES: [(&str, usize); 3] = [ - ("settings/general.rs", 1), + ("settings/general/language.rs", 1), ("settings/general/theme.rs", 1), ("settings/logs_row.rs", 1), ]; @@ -88,8 +88,8 @@ fn every_card_internal_control_site_still_passes_a_base() { include_str!("../settings/java/download_view.rs"), ), ( - "settings/general.rs", - include_str!("../settings/general.rs"), + "settings/general/language.rs", + include_str!("../settings/general/language.rs"), ), ( "settings/general/theme.rs",