feat(app-iced): Java 页「下载一个 JDK」+ 三个设置键(M197)
用户原话:「我们内置了那么多镜像源 甚至用户不能手动选择指定版本下载。」
「自动下载 jdk17 作为基准版本,后续在设置中提供多版本可供用户下载。」
- core:新增 `game::java::catalog`(8/11/17/21/25 五档 × 能承接的发行版 × 「该装哪档」),
数据全部来自 `JdkVendor::supports` 与 `vendor::order`,不复制第二份真相。
- progress:`SourceFailed` 补一个结构化的 `kind`(在这之前只有中文 `reason`,双语界面
要么放弃语言、要么放弃「哪个源为什么退避」这条用户可见信息)。
- app-iced:`downloads` 模块真下(后台线程 + `ProgressEmitter` + 快照),三态(选择列表 /
下载中 / 失败)都能说出「命中的源 / 退避原因 / 试过哪些源」;成功后重扫并(在
`java.auto_install` 开着且没有默认 JDK 时)把新装的那份设为默认。
- 三个设置键做成可改 UI:`java.installRoot` / `java.vendorPriority` / `java.auto_install`,
各自带「现在生效什么、从哪一层来」(数据目录模式 / 地区默认序),改完回读落盘值。
- `State::satisfied` 换成带方向的 `Fit`:1.12.2 + Java 21 不再被说成「低于要求」。
- i18n:删掉 `SettingsJavaEmptyBody` / `SettingsJavaAddHint` 的 markdown 反引号;
`SettingsJavaNeverScannedBody` 改成不与首屏自动扫矛盾的表述。
- 出图三张(选择列表 / 下载中 / 失败)在 DevDocs/artifacts/m197/。
顺带拆文件守 400 行:`golden/tail.rs` 的 M174 段搬到 `golden/tail_ai.rs`,
`pages/settings/java/{context,prefs,prefs_store,downloads,download_view}` 各自成模块。
This commit is contained in:
1 parent
329c529bea
commit
ce463cc9b5
33 files changed
+3839
-322
No files matched your search
@@ -0,0 +1,122 @@
|
||||
//! 三个设置键的 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);
|
||||
}
|
||||
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()
|
||||
}
|
||||
Reference in new issue
Block a user