diff --git a/apps/ely-pdf/src/output.rs b/apps/ely-pdf/src/output.rs index 4bdb745..ee96f8a 100644 --- a/apps/ely-pdf/src/output.rs +++ b/apps/ely-pdf/src/output.rs @@ -203,6 +203,8 @@ impl Viewer { Err(error) => return self.failed(&error, cx), } let (work, path, revision) = (tab.work.join("export.out"), tab.session.path().map(PathBuf::from), tab.session.revision()); + // Unsaved edits: the file on disk is not "before". + let compared = path.clone().filter(|_| !tab.view.read(cx).modified()); let opened = target.clone(); log::info!("pdf: exports {}", if kind == Kind::Text { "text" } else { "an optimized copy" }); self.read_in( @@ -214,7 +216,7 @@ impl Viewer { } let bytes = std::fs::read(&work)?; std::fs::remove_file(&work)?; - let before = path.as_deref().map(std::fs::metadata).transpose()?.map(|meta| meta.len()); + let before = compared.as_deref().map(std::fs::metadata).transpose()?.map(|meta| meta.len()); ely_files::export(&target, path.as_deref(), &bytes, revision)?; Ok((before, bytes.len() as u64)) }, diff --git a/apps/ely-pdf/src/tests/output.rs b/apps/ely-pdf/src/tests/output.rs index 805b0fc..2ed42a2 100644 --- a/apps/ely-pdf/src/tests/output.rs +++ b/apps/ely-pdf/src/tests/output.rs @@ -195,3 +195,27 @@ fn a_picture_never_drawn_is_checked_before_an_overwrite() { settle(cx, |app| viewer.read(app).active_tab().and_then(|tab| tab.risk) == Some(ely_office::Risk::Repaired)); assert_eq!(std::fs::read(&path).expect("reads"), bytes, "Save turned into Save As"); } + +#[test] +fn an_edited_document_does_not_quote_the_files_size() { + let dir = tempfile::tempdir().expect("a temp dir"); + let mut cx = TestAppContext::single(); + let path = file(dir.path(), "doc.pdf", &[(612.0, 792.0, &["First"])]); + let (viewer, cx) = windowed(&mut cx, dir.path(), &[path], true); + let view = shown(cx, &viewer); + // The window's toasts live on its root. + let root = cx.update(|window, app| { + let root = ely_ui::document_root(ely_platform::AppId::Pdf, viewer.clone().into(), &ely_ui::commands::FILE, Vec::new(), window, app); + viewer.update(app, |viewer, _| viewer.core.root = root.downgrade()); + root + }); + let note = ely_pdf_engine::NewAnnot { page: 0, shape: ely_pdf_engine::Shape::Note((100.0, 500.0)), rgb: None, contents: "n".into(), author: String::new() }; + cx.update(|_, app| view.update(app, |view, cx| view.annotate("a note", vec![note], cx))); + settle(cx, |app| view.read(app).settled() && view.read(app).modified()); + let id = cx.update(|_, app| viewer.read(app).core.tabs[0].id); + let out = dir.path().join("small.pdf"); + let how = Optimizing { compress: true, from: 300, to: 150 }; + cx.update(|_, app| viewer.update(app, |viewer, cx| viewer.write_export(id, Kind::Optimized, how, out.clone(), cx))); + let done = cx.update(|_, app| crate::viewer::Viewer::text(app, "pdf.export.done", &[("name", "small.pdf")])); + settle(cx, |app| root.read(app).toasts(app).iter().any(|(text, _)| *text == done)); +} diff --git a/tasks/BUGS.md b/tasks/BUGS.md index 0c40805..a6ed102 100644 --- a/tasks/BUGS.md +++ b/tasks/BUGS.md @@ -45,7 +45,7 @@ - [x] P-10 预览回复被丢弃时“应用”静默无事 — 预览回复照常交回,版本已变即提示,不显示过期预览 - [x] P-11 撤销或重做在 MuPDF 侧失败后 worker 的步数不再同步 — 撤销失败后重读历史标记 - [x] P-12 `unhook` 中途抛出时泄漏保留的对象 — 保留的链接随保留随计数 -- [ ] P-13 优化导出的“之前”大小取磁盘文件而非当前文档 +- [x] P-13 优化导出的“之前”大小取磁盘文件而非当前文档 — 有未保存编辑时不与磁盘文件比大小 - [ ] P-14 文字块含控制字符时 JSON 回复不可解析 - [x] D-01 导出或打印对话框开着时关闭其标签即崩溃 — Docs 实现 tab_closed,关标签即撤下其导出对话框;R1 PASS - [x] D-02 邮件合并以当前标签为模板,预览后生成的每份都是同一条记录 — 选数据时记下模板标签,预览副本不作模板;R1 测试绕过选 CSV 入口;R2 PASS