diff --git a/apps/ely-doc/src/docs.rs b/apps/ely-doc/src/docs.rs index 61c3585..21fc43c 100644 --- a/apps/ely-doc/src/docs.rs +++ b/apps/ely-doc/src/docs.rs @@ -85,6 +85,14 @@ impl Host for Docs { self.offer_spelling(id, view, cx); } + /// A dialog about a closed tab goes with it. + fn tab_closed(&mut self, tab: &ely_office::Tab, cx: &mut Context) { + if matches!(self.dialog, Some(Dialog::Output { tab: of, .. }) if of == tab.id) { + self.dialog = None; + cx.notify(); + } + } + fn search_leaves(&mut self, cx: &mut Context) { self.mark_place(cx); } diff --git a/apps/ely-doc/src/output.rs b/apps/ely-doc/src/output.rs index b6d82e5..fe9822b 100644 --- a/apps/ely-doc/src/output.rs +++ b/apps/ely-doc/src/output.rs @@ -29,7 +29,7 @@ impl Docs { self.ask_output(true, cx); } - fn ask_output(&mut self, print: bool, cx: &mut Context) { + pub(crate) fn ask_output(&mut self, print: bool, cx: &mut Context) { let Some(tab) = self.active_tab() else { let text = Docs::text(cx, "command.blocked.no_document", &[]); return self.toast(text, Severity::Warning, cx); diff --git a/apps/ely-doc/src/tests/more.rs b/apps/ely-doc/src/tests/more.rs index f7c0929..4ee1fce 100644 --- a/apps/ely-doc/src/tests/more.rs +++ b/apps/ely-doc/src/tests/more.rs @@ -246,3 +246,20 @@ fn a_quit_from_either_window_asks_first() { })); } } + +#[test] +fn closing_a_tab_takes_its_export_dialog() { + let dir = tempfile::tempdir().expect("a temp dir"); + let mut cx = TestAppContext::single(); + let Some(docs) = docs(&mut cx, dir.path()) else { + eprintln!("SKIP: no LOK build"); + return; + }; + let id = blank(&mut cx, &docs); + cx.update(|app| docs.update(app, |docs, cx| docs.ask_output(false, cx))); + assert!(cx.update(|app| matches!(docs.read(app).dialog, Some(crate::actions::Dialog::Output { .. })))); + with_window(&mut cx, &docs, |docs, window, cx| docs.request_close(id, After::Tab, window, cx)); + settle(&cx, |app| docs.read(app).tab(id).is_none()); + // Drawn now, a dialog for the gone tab would crash. + assert!(cx.update(|app| docs.read(app).dialog.is_none()), "the dialog went with its tab"); +} diff --git a/tasks/BUGS.md b/tasks/BUGS.md index 308783d..8d2acb7 100644 --- a/tasks/BUGS.md +++ b/tasks/BUGS.md @@ -47,7 +47,7 @@ - [ ] P-12 `unhook` 中途抛出时泄漏保留的对象 - [ ] P-13 优化导出的“之前”大小取磁盘文件而非当前文档 - [ ] P-14 文字块含控制字符时 JSON 回复不可解析 -- [ ] D-01 导出或打印对话框开着时关闭其标签即崩溃 +- [x] D-01 导出或打印对话框开着时关闭其标签即崩溃 — Docs 实现 tab_closed,关标签即撤下其导出对话框;R1 PASS - [ ] D-02 邮件合并以当前标签为模板,预览后生成的每份都是同一条记录 - [ ] D-03 界面线程同步持 worker 锁读内核(样式、字体、书签、公式、分节名) - [ ] D-04 一条批注的时间读不出,全部批注与修订都不显示 diff --git a/tasks/reviews/D-01-r1.md b/tasks/reviews/D-01-r1.md new file mode 100644 index 0000000..7ef22e9 --- /dev/null +++ b/tasks/reviews/D-01-r1.md @@ -0,0 +1 @@ +PASS