AskaEth
|
aae9a233ff
|
fix(m198): JAVAGUARD——首屏自动扫 / 子进程回收 / 参数长度三条守卫 + 设置页正文结构断言
- 首屏自动扫:删掉 `cfg!(test)` 分叉,生产入口在测试里真跑;新增
`the_first_hydrate_starts_a_real_scan_by_itself`(删掉那一行、或把实参翻成 `true`
都红)。顺手删掉恒为假的 `seeded && !live`:截图种子档在上方就 return 了,编译器也
报 "assigned but never used"。
- proc:`kill()` + `wait()` 收进 `terminate()`(三个分支共用);用例先用同一条命令
真跑一次证明子进程起得来(`spawn().ok()?` 的空跑假绿),并新增 Linux/Android 的
僵尸回收用例(只 kill 不 wait ⇒ `/proc/<pid>` 留成僵尸)。
- java.extra_args:`MAX_JVM_ARGS = 1024` 镜像 schema,`Refusal::JvmTooLong` + 中英
文案 + JVM 输入框变红;App 级用例断言回执是具名的「太长」而不是通用的「写不进去」。
- 设置页正文:判据①从「数 `stack = stack.push(` 的出现次数」升级成按角色断言
(唯一来源 section_columns、`push(` 恰一次且实参是循环变量、尾表达式、禁
extend/chain/once/concat/append),单行折叠变异体现在会红。
|
2026-11-09 06:46:29 +08:00 |
|
AskaEth
|
e5a4b9bbd1
|
fix(settings): 改口逐实例覆盖的事实陈述,并把第三条守卫换成行为断言
复审 r1 的两条 P2:
P2-1(`settings/mod.rs` 的 `form` 文档):原先写「『逐实例覆盖』既没有数据源也没有
消息落点」——这是错的。逐条核过:真控件在实例详情页的「启动参数」区(M157
`pages/instances/launch_args.rs`,由 `pages/instances/detail.rs` 渲染),落盘走
`app/update/instances.rs` 的 `AppCommand::set_launch_args` → presenter
`host/launch_args.rs` 的 `resolved`/`apply`(写回 `config/instances/<id>.json`),
回落与落位在 core 的 `game/launch_overrides.rs` / `launch/overrides.rs`。真正无人产出
的只有 UI 变体 `Action::AddOverride`。改口后的事实:它是**放错了地方**,不是没接。
P2-2(守卫):删掉按名字扫源码的两条(`empty_state`/`overrides` 子串、`instance` 子串)——
前者的假警报会挡住「某组确实需要自己的空态」,后者抓的根本不是它声明的不变量(真正让实例
选择进不来的是 `settings::view` 的签名),且日后一句正当英文注释就能把它弄红。换成:
- 判据 ①(保留)守**收尾**:`form()` 里 `stack = stack.push(` 恰好一处、且以
`frame::scroll(ui, stack)` 收尾(整段重写让计数变 0 也红);
- 判据 ②(新增,行为断言)守**生产**:把每组一列的循环抽成 `section_columns()`,
测试真调它数返回值——窄窗 == `GROUPS.len()`,单选各组 == 1,换任何名字都躲不掉。
文档里的「抓不住」段也不再指向静态图(静态图只能证明「现在没有」)。
`form` 的拼装形状没变(循环 + `frame::scroll` 收尾),分组表、分发顺序、正文内容一字未动。
|
2026-11-08 19:54:38 +08:00 |
|
AskaEth
|
7fdebba961
|
fix(settings): 设置页尾部不再渲染不属于本页的空态卡
用户 2026-11-08 在 M174 的助手页与 M175 的 Java 页截图里看到同一张卡(四格图标 +
「没有逐实例覆盖」+ 说明被窗口下沿截断):两张图 1180×1100、卡片位置完全一致、
独立居中在内容下方。
根因是 `pages/settings/mod.rs` 的 `form()` 在分组循环之后**无条件** push 了
`pages/settings/frame.rs` 的 `overrides_empty()`(M84 骨架期的占位,M99 纯搬移时原样
留下,固定 320dp 高):于是六个分组下面都长出同一张卡,与实例选中态无关。
修法:删掉该空态位及其唯一的三个 i18n key(`SettingsOverrides*`,金表同步删三行)。
设置页永远有内容(总有一组被选中),12b §15 的空态件是给实例/下载/日志页的;
「逐实例覆盖」全仓既无数据源也无消息落点,所以不挪给任何一组,直接不渲染。
守门(`settings/frame.rs` 的 `no_stray_empty_state` 三条,变异实测会红):
尾部不许再出现额外 push、`form()` 不认任何空态件名、设置页不读实例选择。
|
2026-11-08 19:13:37 +08:00 |
|
AskaEth
|
037c68d0e6
|
fix(m173): 设置页滚动条并排在内容右侧(右侧恒留 10dp 槽)
根因(读 iced 0.14 源码,不是猜):`scrollable` 的竖直滚动条是浮层——
`iced_widget-0.14.2/src/scrollable.rs:1970-1980` 把轨道定位在
`bounds.right - (width.max(scroller_width) + 2*margin)`,而同文件 `:437` 给内容的横向
约束是整个视口宽(`Scrollbar::spacing` 默认 None ⇒ 右内边距恒 0)。本仓 6 轨 + 2×2 内缩
= 10dp,于是这 10dp 整条压在表单列内容上(1180 与 880 宽窗口都一样)。
改法:`components::scroll::vertical()` 在内容右侧恒留一条 `轨宽 + 2×margin` 的槽,轨道画在
槽里;`pages/settings/frame.rs::scroll` 改成一行转发。不采用 iced 的 `Scrollbar::spacing`,
因为它只在滑块可见时才预留(`scrollable.rs:478-500`),长/短页面切换内容会横跳 10dp。
数值(1180×760、100% DPI、tiny-skia、实测像素):
- 卡片右缘 799 → 789(内容可用宽 424 → 414 = 424 − 10);
- 滑块仍是 792..797(没有移动),与内容之间隔 2px 页面底色(= SCROLLBAR_MARGIN);
- 长页面(外观组)与短页面(Java 组,无滑块)左边界 376、宽 414 **逐项相同**;
- 150% 缩放下 621px = 414×1.5、滑块 9px = 6×1.5、槽 15px = 10×1.5,同比例不重叠。
守卫(两条都是数值,不看图):`components/scroll.rs` 与 `pages/settings/tests/scroll_fit.rs`
用 `Renderer = ()` 真跑 iced 的 `layout()`,断言「内容宽 == 容器宽 − 槽宽」且长/短两态一致;
把 `beside` 的 padding 改回 `Padding::ZERO`,4 条断言立刻红(424 vs 414)。
|
2026-11-08 15:11:54 +08:00 |
|
AskaEth
|
89dcb6bdf3
|
feat(app-iced,i18n): M106 —— 界面跟随系统语言 + 设置页真实语言行
用户原话:「我系统语言是中文 为什么打开软件是英文 并且设置页里面显示的是 English(system)」。
两处根源:①M92 的探测链一直是对的,但 `pages::Model.lang` 在 `app/view.rs` 里写死成
`Lang::En`(`pages::render` 还把下载页写死成英文),探测结果没人用;②设置页语言行是硬编码
字面量 `("Language", "English (System)")`。
新增/改动(按层):
- i18n:新域 `catalog/general.rs`(24 条中英双份 key,装配链尾追加)+ `catalog/golden.rs`
只追加不重排;`choice.rs`(`LangChoice`:跟随系统/手选 + D28 四级优先级真值表 + 字体优先级真值表)。
- app-iced 语言入口 `src/ui.rs` + `src/ui/lang.rs`:`LangState` = 用户档位 + 探测结论;
启动判定 `ULL_LANG` > 配置 `ui.language` > 系统 locale > 英文;两行日志(探测/生效 + 中文策略)。
- `app/state.rs`:`App` 持有 `LangState`,切语言 = 换目录 + 落盘 + 重建视图模型;
`app/view.rs` 的 `model()` 收 `lang`,不再写死英文。
- 设置页:语言行换真控件(跟随系统 / 简体中文 / 英文,回显「界面当前使用:简体中文」);
页头、左列分组名、逐实例空态、导航轨标签全部走 catalog。
- presenter:`settings_bridge_lang.rs`(`load_ui_language` / `persist_ui_language`)。
「跟随系统」= **删键**(schema 允许值只有 zh_cn/en_us),读的是 `doc().get()` 而不是
`effective_str`(后者会把默认值 `zh_cn` 当成用户手选,英文机器一启动就被切成中文)。
验证:408 条 app-iced lib 测试 + 28 条 i18n 测试 + 全仓 `cargo test --workspace --exclude
unlucky-app` 全绿;fmt / clippy `-D warnings` 干净;出图 6 张(en/zh × 浅/深 + 下载页对照)
在 `DevDocs/artifacts/m106/`(该目录被 .gitignore 忽略,按仓内惯例作为本地验收产物)。
|
2026-11-04 22:50:09 +08:00 |
|
AskaEth
|
330f7216fd
|
refactor(pages,i18n): M99 纯搬移 —— 导航表抽 pages/nav.rs、设置页拆目录、catalog 按域拆开
- pages/mod.rs 400 -> 356 行:NAV 表与组件版 rail 搬进 pages/nav.rs(NAV 可见性变 pub(crate),
只为让 pages/tests.rs 的三条断言原样保留)
- pages/settings.rs -> pages/settings/{mod,frame,general,appearance,java,download,ai,tests}.rs:
mod.rs 只留「分组注册表 + 选中分组 + 内容分发」,一组一个文件,为四条 section 线各留位置
- i18n catalog.rs 310 -> 273 行:条目表按域拆到 catalog/<域>.rs,catalog.rs 留 catalog! 宏、
装配链、Catalog 与对外 API;新增 catalog/golden.rs(拆分前 key->译文 全量快照)守门
- 行为/文案/样式零变化:pages_demo 的 instances/settings × 浅/深 四张图逐字节相同
|
2026-11-03 13:19:17 +08:00 |
|