diff --git a/apps/ely-show/src/check.rs b/apps/ely-show/src/check.rs index 3173b4f..9de7cd6 100644 --- a/apps/ely-show/src/check.rs +++ b/apps/ely-show/src/check.rs @@ -108,6 +108,21 @@ pub fn findings(check: &Check, slides: &[ShowSlide], missing_fonts: &[String]) - } impl Deck { + /// Shows a finding's slide; master view numbers masters instead. + pub(crate) fn go_to_finding(&mut self, part: usize, cx: &mut Context) { + let Some(tab) = self.active_tab() else { + return; + }; + if tab.extra.masters { + let text = Deck::text(cx, "show.masters.busy", &[]); + return self.toast(text, Severity::Warning, cx); + } + let view = tab.view.clone(); + view.update(cx, |view, _| view.show_part(part)); + self.dialog = None; + cx.notify(); + } + /// Reads every slide and master, then lists what to fix. pub fn check_show(&mut self, cx: &mut Context) { let Some(tab) = self.active_tab() else { @@ -183,14 +198,9 @@ impl Deck { let firsts: Vec> = found.iter().map(|f| f.slides.first().copied()).collect(); let list = list.on_change(move |keys, _, cx| { let first = keys.first().and_then(|key| key.parse::().ok()).and_then(|at| firsts[at]); - this.update(cx, |deck, cx| { - if let (Some(part), Some(tab)) = (first, deck.active_tab()) { - let view = tab.view.clone(); - view.update(cx, |view, _| view.show_part(part)); - deck.dialog = None; - } - cx.notify(); - }) + if let Some(part) = first { + this.update(cx, |deck, cx| deck.go_to_finding(part, cx)); + } }); card.child(list).into_any_element() } diff --git a/apps/ely-show/src/tests/slides.rs b/apps/ely-show/src/tests/slides.rs index cb984aa..5bf35ae 100644 --- a/apps/ely-show/src/tests/slides.rs +++ b/apps/ely-show/src/tests/slides.rs @@ -425,3 +425,20 @@ fn a_zoom_stays_through_later_reports() { assert_eq!(view.read(app).zoom(), zoom, "the zoom stays"); }); } + +#[test] +fn a_check_row_does_not_jump_among_masters() { + let dir = tempfile::tempdir().expect("a temp dir"); + let mut cx = TestAppContext::single(); + let Some(deck) = blank(&mut cx, dir.path()) else { + eprintln!("SKIP: no LOK build"); + return; + }; + update(&mut cx, &deck, |deck, cx| deck.masters(true, cx)); + settle(&cx, |app| deck.read(app).active_tab().is_some_and(|tab| tab.extra.masters)); + update(&mut cx, &deck, |deck, cx| { + deck.dialog = Some(crate::dialog::Dialog::Check(Vec::new())); + deck.go_to_finding(0, cx); + }); + assert!(cx.update(|app| deck.read(app).dialog.is_some()), "the check stays open"); +} diff --git a/tasks/BUGS.md b/tasks/BUGS.md index 11bdce8..690c294 100644 --- a/tasks/BUGS.md +++ b/tasks/BUGS.md @@ -29,7 +29,7 @@ - [x] S-04 选屏对话框被别的对话框顶掉后,`show_starting` 卡住、放映副本泄漏 — 有对话框开着时不再顶掉它,提示先完成;选屏对话框被拒即丢副本;R2 PASS - [x] S-05 一条批注的时间恰为午夜或只有日期,整个批注栏不显示 — 读不出时间的批注只占一行汇总,其余照常显示(jiff 本可读只有日期的时间);R2 PASS - [x] S-06 导出或打印的“从–到”填 0 时导出全部幻灯片 — 键入的页码夹到 1..=末页;R1 PASS -- [ ] S-07 母版视图下演示检查的行按幻灯片序号跳转 +- [x] S-07 母版视图下演示检查的行按幻灯片序号跳转 — 母版视图下点行提示先关母版,不跳;R1 PASS - [ ] S-08 刚编辑过幻灯片就进备注栏键入,备注可能丢 - [ ] S-09 改尺寸失败后 `size_asked` 一直留着 - [ ] S-10 开始放映的两处拒绝无提示(规则 2) diff --git a/tasks/reviews/S-07-r1.md b/tasks/reviews/S-07-r1.md new file mode 100644 index 0000000..7ef22e9 --- /dev/null +++ b/tasks/reviews/S-07-r1.md @@ -0,0 +1 @@ +PASS