`pages/settings/java/store.rs` 的 `save()` / `set_selected()` / `prefs_store::save()` 是页面自己的一次同步原子落盘(`SettingStore::set` 多个键 + 一次 `save()`), 不经过 `AppCommand::SetSetting` 的写盘分支;而 `CoreEvent::SettingsChanged` 全仓只有 `dispatch.rs` 的 `SetSetting` 分支与 `host/mod.rs::refresh_all` 两处发出。 于是三键写成功之后,`AppState::settings_groups` 里 java 组那几行会停在旧值, 直到下一次任何别的写入顺手带一份新快照回来。 修法用一条**动作键**(`dto::JAVA_REFRESH_ACTION` = `java.action.refresh`, 与 `download.action.detect_region` 同一族:不写盘、见到就返回 Ok): 写盘成功后派发它,`SetSetting` 分支照常重发快照。 不用 `RefreshAll`:那个除重发快照之外还会 `versions::spawn_list` 与 `start_update_check`——每点一次「保存内存」打两个网络请求(实测:一次真 host 出图 就在数据根里落了 `cache/meta/version_manifest_v2.json`),代价与动作不相称。 另外给 D30 §2.1 补一行自证身份的日志:`--screenshot` 且身份变化时打 `[shot] settings route=… group=… theme=…`(`view` 每帧都跑,所以只在变化时落一行), 免得再出现「拿外观页当下载组证据」那种图与结论对不上的事故。 守卫(`tests/java_refresh.rs`,4 条): - 真 `CoreHost` + 临时数据根跑完整链:写盘 ⇒ 快照里 `java.extra_args` 真的变了; - 被拒的保存不许请求刷新; - 成功之后确实派发了那条动作键(键名写错就红); - 「立即扫描」在 App 层真的接线(此前没有任何用例驱动 `Message::Scan`)。
127 lines
5.3 KiB
Rust
127 lines
5.3 KiB
Rust
//! 三个设置键的 App 层落点(M197):`java.installRoot` / `java.vendorPriority` / `java.auto_install`。
|
|
//!
|
|
//! ## 为什么这三项单独一个「保存」
|
|
//!
|
|
//! M175 的「保存」只写内存 + JVM 参数(`java.default_memory_mb` / `java.extra_args`),那是**运行时
|
|
//! 参数**;这三项是**装到哪、按什么顺序找、缺 JDK 时怎么准备**——改了它们的副作用是「下一次下载 /
|
|
//! 下一次扫描的落点变了」,与内存那两项混在一个按钮里,用户就不清楚自己刚保存的到底是哪一半。
|
|
//! 于是两段各有自己的脏标记与保存按钮,各回读各的键。
|
|
//!
|
|
//! ## 保存之后为什么立刻重扫
|
|
//!
|
|
//! `java.installRoot` 改了 ⇒ 托管根的集合变了 ⇒ 「已检测到的 JDK」那份列表可能整份不同。
|
|
//! 保存成功就重扫一次,界面不会出现「落点写着新目录,列表还是旧目录里的 JDK」。
|
|
//!
|
|
//! ## 回读校验
|
|
//!
|
|
//! `prefs_store::save` 返回的是**落盘后从磁盘读回来**的真值,[`Prefs::adopt`] 把草稿与
|
|
//! 「落盘真值」两半都对齐到它:用户看到的就是磁盘上那份(要是 schema 把值规整过,界面显示的是
|
|
//! 规整后的结果,而不是他刚敲的那串——这一条正是「改完回读验证已落盘」)。
|
|
|
|
use iced::Task;
|
|
|
|
use crate::app::message::Message;
|
|
use crate::app::state::App;
|
|
use crate::pages;
|
|
|
|
use super::super::java::write_notice;
|
|
|
|
impl App {
|
|
/// `java.installRoot` 草稿(只改草稿,不写盘)。
|
|
pub(super) fn edit_java_install_root(&mut self, value: String) {
|
|
self.settings.java.prefs.install_root = value;
|
|
self.settings.java.notice = None;
|
|
self.settings.java.download_notice = None;
|
|
self.view_dirty = true;
|
|
}
|
|
|
|
/// `java.auto_install` 开关(只改草稿)。
|
|
pub(super) fn toggle_java_auto_install(&mut self, on: bool) {
|
|
self.settings.java.prefs.auto_install = on;
|
|
self.settings.java.notice = None;
|
|
self.view_dirty = true;
|
|
}
|
|
|
|
/// 发行版顺序上移 / 下移一行。
|
|
pub(super) fn move_java_vendor(&mut self, index: usize, up: bool) {
|
|
let domestic = self.settings.java.effective.domestic;
|
|
if up {
|
|
self.settings.java.prefs.move_up(index, domestic);
|
|
} else {
|
|
self.settings.java.prefs.move_down(index, domestic);
|
|
}
|
|
self.settings.java.notice = None;
|
|
self.view_dirty = true;
|
|
}
|
|
|
|
/// 恢复地区默认序(= 把这个键写回空,让地区那一层重新生效)。
|
|
pub(super) fn reset_java_priority(&mut self) {
|
|
self.settings.java.prefs.reset_priority();
|
|
self.settings.java.notice = None;
|
|
self.view_dirty = true;
|
|
}
|
|
|
|
/// 保存三个键:本地校验 → 落盘 → **用读回的真值**刷新草稿与生效值 → 重扫一次。
|
|
pub(super) fn save_java_prefs(&mut self) {
|
|
use pages::settings::java::Notice;
|
|
|
|
self.view_dirty = true;
|
|
if let Err(refusal) = self.settings.java.prefs.validate() {
|
|
self.settings.java.notice = Some(Notice::Refused(refusal));
|
|
return;
|
|
}
|
|
let Some(config) = pages::settings::java::store::config_of(&self.bridge) else {
|
|
self.settings.java.notice = Some(Notice::NoStorage);
|
|
return;
|
|
};
|
|
match pages::settings::java::prefs_store::save(&config, &self.settings.java.prefs) {
|
|
Ok(snapshot) => {
|
|
self.settings.java.prefs.adopt(snapshot);
|
|
self.settings.java.effective = pages::settings::java::prefs_store::effective(
|
|
&config,
|
|
&self.settings.java.prefs,
|
|
);
|
|
// 落点 / 顺序变了:托管根的集合可能整份不同,立刻重扫一次。
|
|
// 顺序要紧:`start_java_scan` 会清 `notice`,所以回执写在它之后。
|
|
let _ = self.start_java_scan();
|
|
self.settings.java.notice = Some(Notice::PrefsSaved);
|
|
// M204:三键也已落盘(`java.installRoot` / `java.auto_install` / `java.vendorPriority`
|
|
// 一次 `store.save()`),请 host 重发快照——否则 `AppState::settings_groups` 里
|
|
// java 组那三行停在旧值,要等下一次任何别的写入才跟上。
|
|
self.request_settings_refresh();
|
|
}
|
|
Err(error) => self.settings.java.notice = Some(write_notice(error)),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 消息→落点的那一层(`java.rs` 的 match 里一行转发)。
|
|
pub(super) fn on_edit_install_root(app: &mut App, value: String) -> Task<Message> {
|
|
app.edit_java_install_root(value);
|
|
Task::none()
|
|
}
|
|
|
|
/// `ToggleAutoInstall` 的转发。
|
|
pub(super) fn on_toggle_auto_install(app: &mut App, on: bool) -> Task<Message> {
|
|
app.toggle_java_auto_install(on);
|
|
Task::none()
|
|
}
|
|
|
|
/// `MoveVendor` 的转发。
|
|
pub(super) fn on_move_vendor(app: &mut App, index: usize, up: bool) -> Task<Message> {
|
|
app.move_java_vendor(index, up);
|
|
Task::none()
|
|
}
|
|
|
|
/// `ResetPriority` 的转发。
|
|
pub(super) fn on_reset_priority(app: &mut App) -> Task<Message> {
|
|
app.reset_java_priority();
|
|
Task::none()
|
|
}
|
|
|
|
/// `SavePrefs` 的转发。
|
|
pub(super) fn on_save_prefs(app: &mut App) -> Task<Message> {
|
|
app.save_java_prefs();
|
|
Task::none()
|
|
}
|