fix(presenter,app-iced): 删除确认绑定到对话框身份 + 快照不再吃掉目标(M247 r2 复审)
复审 r1 P1-1(安全):`SavesState::confirm` 的「关闭即清」在 Esc 这条路径上没有落实, 而主按钮分支无条件先取目标 —— 「删存档 → Esc → 崩溃卡片 → 导出诊断包」会静默删掉那个世界。 两层修,各自有独立用例钉住: 1. **认框不认人**:`confirm` 改成 `Option<(DialogId, String)>`,`take_confirm(current)` 只在 id 相等时交付;`DialogMessage::Primary` 传 `dialogs.current().id`。即使别的路径漏清, 也核销不了别人那个框。用例 `a_leaked_target_cannot_be_redeemed_by_another_dialog` (去掉 id 校验即红:实测「漏清的目标被别的框兑现了:世界被静默删除」)。 2. **关闭路径补全**:`update/dialog.rs::escape()` 补 `clear_confirm()`(次按钮/遮罩早就清了, Esc 漏了)。用例 `escaping_the_delete_dialog_disarms_it_for_the_next_one` 复现整条事故链, 断言没有下发 `DeleteWorld`、框走自己的路关掉(去掉这行即红)。 P2-1:`changed()` 不再无条件清 `confirm`(一拍无关快照会让主按钮变成静默空操作)—— 只在「被确认的世界已经从快照里消失」时清,并登记 `closed_confirm` 让 app 层**收起那个框** (`refresh_view → settle_saves_confirm`),避免留一个点了没反应的按钮。`failed()` 同理不动 confirm。 用例:`an_unrelated_snapshot_keeps_the_confirmation_redeemable`、`a_vanished_world_closes_its_confirmation`、 `an_unrelated_snapshot_no_longer_drops_the_confirmation`、`the_confirmation_is_dropped_and_reported_when_the_world_vanishes`。 P2-2:`catalog/instances.rs` 那段「这一版只读 / InstancesSavesReadOnly」的陈旧说明改成现状 (写操作已接上,边界由 core 的 `write::boundary` 守)。 拆分(400 行):`presenter/src/state/saves.rs` 的交互态方法 → `state/saves/interaction.rs`、 判据 → `state/saves/tests.rs`;`app/update/dialog.rs` 的接线用例内联在该文件(5 条)。
This commit is contained in:
1 parent
8c67e4eca6
commit
6c87e2ad8a
8 files changed
+682
-229
No files matched your search
@@ -154,10 +154,10 @@ macro_rules! instances_entries {
|
||||
InstancesModsReasonNotFile => ("that is not a regular file", "那不是普通文件"),
|
||||
InstancesModsReasonCollision => ("a file with that name already exists", "同名文件已存在"),
|
||||
InstancesModsReasonRename => ("the rename failed", "改名失败"),
|
||||
// ── 存档区(M235 · STOREMVP):**只读**列 `saves/` 与 `screenshots/` + 打开文件夹。
|
||||
// U3 的边界写在 `InstancesSavesReadOnly` 里,页面固定画出来——用户点开就看见
|
||||
// 「这一版只读」,不会以为漏了删除按钮。`saves/` / `screenshots/` 是**目录名**,
|
||||
// 两套语言都原样保留(与 MODS 区的 `mods` 同一条口径)。
|
||||
// ── 存档区(M235 · STOREMVP 读路径 / M247 · SAVESOPS 写操作)。
|
||||
// M235 那条「这一版只读」(`InstancesSavesReadOnly`)**已删**:写操作接上之后它是假的,
|
||||
// 边界改由 core 的 `game::saves::write::boundary` 守(越界 / 符号链接 / 撞名都在那里拒)。
|
||||
// `saves/` / `screenshots/` 是**目录名**,两套语言都原样保留(与 MODS 区的 `mods` 同一条口径)。
|
||||
InstancesSavesTitle => ("SAVES", "存档"),
|
||||
InstancesSavesCount => ("{worlds} worlds · {shots} screenshots", "{worlds} 个世界 · {shots} 张截图"),
|
||||
InstancesSavesLoading => ("Reading saves/…", "正在读取 saves/…"),
|
||||
|
||||
Reference in new issue
Block a user