D26(iced 重写)的关键一次性动作:UI 框架无关的宿主层独立成 crate, Slint 版(crates/app)与 iced 版(crates/app-iced)共用,Slint 退役后不再重写一遍。 - 新建 crates/presenter(package `unlucky-presenter` / lib `unlucky_presenter`), workspace 登记 + crate 文档头写清「这层为什么存在」、对外表面、UI 侧允许/禁止、 iced 接线骨架、以及哪些东西留在了 crates/app 及为什么。 - `git mv`(保留文件历史)迁入:host/(25 文件)、dto/(11 文件)、state.rs(+tests)、 prefs.rs、settings_bridge.rs、toast.rs、router.rs、dialogs.rs、wizard.rs、 mock.rs、mock_data.rs、backend.rs。模块路径与公开 API 名称不变(`host::install` 等), 内部实现零改动。 - 新增 `theme`:把原本混在 ui_bind/theme_runtime 里的**纯判据**(CONFIG_POLL_TICKS / SYSTEM_THEME_POLL_TICKS / TILE_REGENERATE_STEP / BackgroundKey / tile_viewport / system_theme_value / 两个 poll 判据)抽出来,附 5 个单测;app 侧改成调用它们。 - crates/app 改为消费者:删掉迁走的文件,`crate::host|state|dto|prefs|settings_bridge| toast|router|dialogs|wizard|mock|mock_data|backend` 全部改写为 `unlucky_presenter::*` (64 处),backend.rs 的 config_path/build_backend 提为 pub。 - crates/app-iced 只登记 unlucky-presenter 依赖,本 mission 不接线。 - prefs.rs 的 2 处 slint 文档引用改写;`grep -rn slint crates/presenter` 现在无输出。
37 lines
1.8 KiB
Rust
37 lines
1.8 KiB
Rust
//! `PageState` global 的状态灌入(从 `ui_bind` 拆出,守 400 行上限)。
|
||
//!
|
||
//! 一个函数只做「AppState → Slint global 属性」的搬运,同步发生在每一拍末尾
|
||
//! (`ui_bind::Inner::sync`)。分文件而不是砍内容:这些字段每一行都对应一个页面元素。
|
||
|
||
use crate::conv;
|
||
use crate::ui_bind::model;
|
||
use crate::{MainWindow, PageState};
|
||
use slint::ComponentHandle;
|
||
use unlucky_presenter::state::AppState;
|
||
|
||
/// 把页面状态灌进 `PageState`。
|
||
pub(crate) fn apply(ui: &MainWindow, state: &AppState) {
|
||
// 导航底部账户 + PageState 全量页面状态(账户/Java/安装/设置/通知/向导)
|
||
ui.set_account_name(conv::active_account_name(state).into());
|
||
let page = ui.global::<PageState<'_>>();
|
||
page.set_accounts(model(conv::accounts(state)));
|
||
page.set_active_account(conv::active_account_name(state).into());
|
||
page.set_device(conv::device(state));
|
||
page.set_java_vendors(model(conv::java_vendors(state)));
|
||
page.set_java_chain(model(conv::java_chain(state)));
|
||
page.set_java_runtimes(model(conv::java_runtimes(state)));
|
||
page.set_java_order(state.java.order_text.clone().into());
|
||
page.set_java_region(state.java.region.clone().into());
|
||
page.set_java_priority_source(state.java.priority_source.clone().into());
|
||
page.set_java_message(state.java.message.clone().into());
|
||
page.set_java_busy(state.java.busy);
|
||
let major = state.java.majors().last().copied().unwrap_or(17);
|
||
page.set_java_target_major(i32::try_from(major).unwrap_or(17));
|
||
page.set_install(conv::install(state));
|
||
page.set_setting_groups(model(conv::setting_groups(state)));
|
||
page.set_setting_tab(state.settings_tab.clone().into());
|
||
page.set_notices(model(conv::notices(state)));
|
||
page.set_wizard(conv::wizard(state));
|
||
page.set_wizard_versions(model(conv::wizard_versions(state)));
|
||
}
|