M10: Two-sided starts at Printer default, so the printer's own duplex applies (#2422)

The Print dialog always sent its Two-sided choice, Off unless changed, so a
two-sided default set in the printer's Properties never applied. Acrobat has no
default of its own here and follows the printer's. Two-sided now starts at
Printer default, which sends no duplex setting (craft-print's Job::duplex =
None). Off and the two edges still override it. Cut and stack still sends Off,
since it needs single-sided sheets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
magdale76
2026-10-17 06:42:10 +02:00
co-authored by Claude Opus 5.5
parent 924c4da4ac
commit 3fbfa4e2af
26 changed files with 78 additions and 35 deletions
+22 -22
View File
@@ -7,7 +7,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Greek UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "cefa955aa92790d6773cb1d1e15e19019b3165a00528d57d6617362e1d1988ab"
sha256 = "ab55155f8f6380fb23fe450aff8e40dff5b4cb1f50ae24c8a9ab976b78570c3a"
# ATTRIBUTION.toml: one entry per asset (AGENTS.md §1). The source of truth for provenance and licences.
# ATTRIBUTION.md is generated from this file: `cargo xtask assets --write`. Checked by `cargo xtask assets` (part of `xtask ci`).
@@ -30,7 +30,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Simplified Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "dbfebf4e9b2e9ac31ecf72202c2098173e72ebfaf90e9fee8f0563a6734fe31f"
sha256 = "a4eb6808240d303170ca0beadc46b0c246ee30e3a30bdaaaa11631c342bfd817"
[[asset]]
path = "crates/ui-egui/src/i18n/zh-hant.tsv"
@@ -41,7 +41,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "0b0dafa3806a6b3508684f64e1f07b435113f8efd0e59201d12250c63c1d9547"
sha256 = "65a0c9b8537f27346649455df42a030c76f06faa2797415500f3a631316d0230"
[[asset]]
path = "crates/ui-egui/src/i18n/cs.tsv"
@@ -52,7 +52,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Czech UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "898a5240fa59cac42ef6b99cb60bcfca0094ac27370e1c8d020bd27936b56517"
sha256 = "05593aedf7365d0d3cf5ea6104f9c7db439cae47917565267755ddc84cc12ad0"
[[asset]]
path = "crates/ui-egui/src/i18n/pt-br.tsv"
@@ -63,7 +63,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "b4745c94797575529cd0e78c18c71fa2c0dfddfbf19b9c40b41dc2057c6f6543"
sha256 = "efdd1dc820ab9c9bbcd85c47dea9734a8185474cad813a9f53b027ed33b0b920"
[[asset]]
path = "crates/ui-egui/src/i18n/es.tsv"
@@ -74,7 +74,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "2acb3f6522d6d1f744343f474fe4c51ebec610a888a7fa83fc9422228e6fa3c1"
sha256 = "f734e631389b6975842c895b25bb5d9538ec59e99662b86ad5f4071662b0482d"
[[asset]]
path = "crates/ui-egui/src/i18n/fr.tsv"
@@ -85,7 +85,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "1b739478a4f186a49900cce84edbe136206a53b46340322df4caf77bb3fb5b12"
sha256 = "660c42850bbcde194af1d37a0eb54c95f0026e64b20e12c6966c38287ed3bbda"
[[asset]]
path = "crates/ui-egui/src/i18n/de.tsv"
@@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "da3b71608ff7fe6e230b076207cee96ac01f66e068ca1be83af1ad56ac9c60eb"
sha256 = "ef5f24485251bcdb7414f11612edc7ed717ec0ee50ed7b5f7c4fab719fc15a1f"
[[asset]]
path = "crates/ui-egui/src/i18n/te.tsv"
@@ -107,7 +107,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "989d2e5f57cf22c21a85951835ca9fbd05e314da67eb4c17332df1f03679fa00"
sha256 = "8f9c39cf5b8b9b026da8ccf9478bc08f7fc94f796ea93e57d262314985753004"
[[asset]]
path = "crates/ui-egui/src/i18n/it.tsv"
@@ -118,7 +118,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Italian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "5e84916e3ad8670216360695689fe8fd624365a29886f66a3c655ba126892f5b"
sha256 = "2572b6b58a29bac3dfa9d4800480ae5ba0e5bc84831c44930673bf0066d4acbc"
[[asset]]
path = "crates/ui-egui/src/i18n/pl.tsv"
@@ -129,7 +129,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Polish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "988bcf2e0322a46c0464ff7b91ab5d90193b0ea7f454812d12595eb843de6fc7"
sha256 = "7bd63fc65c3a891b794a4c6b3353fee127ba5e9a6e626339b977c5f6f8b0dd1c"
[[asset]]
path = "crates/ui-egui/src/i18n/ru.tsv"
@@ -140,7 +140,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Russian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "084f4ea06f31c632ad90b0e87f66240ce5b5dc012ac7770987d44918ee66f452"
sha256 = "7caff1c3546b1f7ce3edca0eacc24c5c4556bcadeceeefe1470e95e9e8555008"
[[asset]]
path = "crates/ui-egui/src/i18n/hu.tsv"
@@ -151,7 +151,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Hungarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "973cd90ec34c8a973d146a0e2c73c1d632e17357c3d87ccf10c59e64d12c1587"
sha256 = "17510c5039299cc35289775b4e6bca966f7312a0e3d1f1ede0d90902e85cf081"
[[asset]]
path = "crates/ui-egui/src/i18n/bg.tsv"
@@ -162,7 +162,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Bulgarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "485f85d4053c9661ddda2ed9394a0644c77b489feb598d02f12ef209e11f2ee3"
sha256 = "958a7136eec752947ef200b7cb5b8e37ac5c9b6f59177eb51317e7cf184de06c"
[[asset]]
path = "crates/ui-egui/src/i18n/kk.tsv"
@@ -173,7 +173,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Kazakh UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "24524864022ab2abeff68b5979519eee4e92134d0c4053d40c741bc7f01c249c"
sha256 = "85e7ffec6e91bc2d8f2ab70bee3420dc4e576e38260efcac100a3d6bdf67228a"
[[asset]]
path = "crates/ui-egui/src/i18n/ja.tsv"
@@ -184,7 +184,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Japanese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "bc6d123bdb34d5d7c22717fed1a86ff20e7e493acc1e155e61e61e2dc74459aa"
sha256 = "4f776786c3c7260b7dc360a737f166dde95b79f8837d391ae6346a1b6f7358ce"
[[asset]]
path = "crates/ui-egui/src/i18n/uk.tsv"
@@ -195,7 +195,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Ukrainian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "82678dbe730f56062037ea78de165b2c016b3fa670fb1cbfc7cd713eca900bac"
sha256 = "9f1165faa16b01637bfc1ef2faf51102489e106228ba9893ab1ec1f540cda72f"
[[asset]]
path = "crates/ui-egui/src/i18n/ar.tsv"
@@ -206,7 +206,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Arabic UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "304d661b27cdb5246f6b2974b4b5e78667f0928cda3588440be3d8f35f254679"
sha256 = "cd1258152af7665554ed24f0deaf19f74d369f043d9e4142073ea4a901ebfe2f"
[[asset]]
path = "crates/ui-egui/src/i18n/tr.tsv"
@@ -217,7 +217,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Turkish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "05e2b7d5401166d362ba055120fba9a1645d6ec324997cf670e19fafcb0c54cf"
sha256 = "36c78fe67a68d0373037532a8836d4c4950447f6a094469033c07b0c0578f063"
[[asset]]
path = "crates/ui-egui/src/i18n/lt.tsv"
@@ -228,7 +228,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Lithuanian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "17c8579e0e9d1524ffbeb87e7b30c14562dbaac64400826ee786cecfe31648fa"
sha256 = "0c504821fe9702475402d5437e0a278dd42feaa566193af898c463789e680b72"
[[asset]]
@@ -3352,7 +3352,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Vietnamese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "2d1c4b4276d02512a4e20101be95a1671de5c4f5cdfd661887af5ebab0db06a6"
sha256 = "2cf0f9254b386f1635ae06600179b777b3e3a11d73654b711908ec73fd7655b1"
[[asset]]
path = "crates/ui-egui/src/i18n/sl.tsv"
@@ -3363,7 +3363,7 @@ licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Slovene UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "8f8a259264cda06eb6d9a9bf91dc7d873a8561213a9a9e7acbd32623bef40be0"
sha256 = "fd5f8a28aa3db6d06634163c88bbb4003e77de0f5638d75c96e3fd5c5ff775ad"
[[asset]]
+1
View File
@@ -1188,6 +1188,7 @@
Off متوقف
Flip on long edge قلب على الحافة الطويلة
Flip on short edge قلب على الحافة القصيرة
Printer default افتراضي الطابعة
Paper: الورق:
Pages to Print الصفحات المراد طباعتها
More options: خيارات أخرى:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -869,6 +869,7 @@
Off Изключено
Flip on long edge Обръщане по дългия ръб
Flip on short edge Обръщане по късия ръб
Printer default По подразбиране за принтера
Paper: Хартия:
Pages to Print Страници за печат
More options: Още опции:
Can't render this file because it contains an unexpected character in line 8 and column 16.
+1
View File
@@ -1256,6 +1256,7 @@ key Space Mezerník
Off Vypnuto
Flip on long edge Převrátit podle delší strany
Flip on short edge Převrátit podle kratší strany
Printer default Podle tiskárny
Paper: Papír:
Pages to Print Stránky k tisku
More options: Další možnosti:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1174,6 +1174,7 @@
Off Aus
Flip on long edge An langer Kante wenden
Flip on short edge An kurzer Kante wenden
Printer default Druckerstandard
Paper: Papier:
Pages to Print Zu druckende Seiten
More options: Weitere Optionen:
Can't render this file because it contains an unexpected character in line 6 and column 51.
+1
View File
@@ -763,6 +763,7 @@
Two-sided: Εκτύπωση διπλής όψης:
Flip on long edge Αναστροφή στη μεγάλη πλευρά
Flip on short edge Αναστροφή στη μικρή πλευρά
Printer default Προεπιλογή εκτυπωτή
Paper: Χαρτί:
Pages to Print Σελίδες προς εκτύπωση
More options: Περισσότερες επιλογές:
Can't render this file because it contains an unexpected character in line 476 and column 9.
+1
View File
@@ -1183,6 +1183,7 @@
Off Desactivado
Flip on long edge Voltear por el borde largo
Flip on short edge Voltear por el borde corto
Printer default Predeterminado de la impresora
Paper: Papel:
Pages to Print Páginas que imprimir
More options: Más opciones:
Can't render this file because it contains an unexpected character in line 6 and column 60.
+1
View File
@@ -1169,6 +1169,7 @@
Off Désactivé
Flip on long edge Retourner sur le bord long
Flip on short edge Retourner sur le bord court
Printer default Par défaut de l'imprimante
Paper: Papier :
Pages to Print Pages à imprimer
More options: Plus d'options :
Can't render this file because it contains an unexpected character in line 6 and column 39.
+1
View File
@@ -1159,6 +1159,7 @@
Off Ki
Flip on long edge Hosszú él mentén
Flip on short edge Rövid él mentén
Printer default Nyomtató alapértéke
Paper: Papír:
Pages to Print Nyomtatandó oldalak
More options: További beállítások:
Can't render this file because it contains an unexpected character in line 7 and column 44.
+1
View File
@@ -1185,6 +1185,7 @@
Off Disattivato
Flip on long edge Rilegatura sul lato lungo
Flip on short edge Rilegatura sul lato corto
Printer default Come da stampante
Paper: Carta:
Pages to Print Pagine da stampare
More options: Altre opzioni:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1189,6 +1189,7 @@
Off オフ
Flip on long edge 長辺とじ
Flip on short edge 短辺とじ
Printer default プリンターの既定
Paper: 用紙:
Pages to Print 印刷するページ
More options: 詳細オプション:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -1133,6 +1133,7 @@
Off Өшірулі
Flip on long edge Ұзын жиек бойынша аудару
Flip on short edge Қысқа жиек бойынша аудару
Printer default Принтер әдепкісі
Paper: Қағаз:
Pages to Print Басып шығарылатын беттер
More options: Қосымша параметрлер:
Can't render this file because it contains an unexpected character in line 825 and column 9.
+1
View File
@@ -591,6 +591,7 @@
Flip horizontal Apversti horizontaliai
Flip on long edge Apversti per ilgąją kraštinę
Flip on short edge Apversti per trumpąją kraštinę
Printer default Pagal spausdintuvą
Flip vertical Apversti vertikaliai
Folders Aplankai
Font Size: Šrifto dydis:
Can't render this file because it contains an unexpected character in line 404 and column 9.
+1
View File
@@ -1172,6 +1172,7 @@
Off Wyłączony
Flip on long edge Odwracaj wzdłuż długiej krawędzi
Flip on short edge Odwracaj wzdłuż krótkiej krawędzi
Printer default Domyślne drukarki
Paper: Papier:
Pages to Print Strony do wydrukowania
More options: Więcej opcji:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -815,6 +815,7 @@
Off Desativado
Flip on long edge Virar na borda longa
Flip on short edge Virar na borda curta
Printer default Padrão da impressora
Paper: Papel:
Pages to Print Páginas a imprimir
More options: Mais opções:
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1189,6 +1189,7 @@
Off Выкл
Flip on long edge Переворот по длинной стороне
Flip on short edge Переворот по короткой стороне
Printer default По умолчанию для принтера
Paper: Бумага:
Pages to Print Страницы для печати
More options: Дополнительные параметры:
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -837,6 +837,7 @@
Flip image Prezrcali sliko
Flip on long edge Obrni po dolgem robu
Flip on short edge Obrni po kratkem robu
Printer default Privzeto tiskalnika
Flip vertical Prezrcali navpično
Folders Mape
Font Size: Velikost pisave:
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -1159,6 +1159,7 @@ comment menu Edit సవరించు
Off ఆఫ్
Flip on long edge పొడవైన అంచున తిరగేయి
Flip on short edge పొట్టి అంచున తిరగేయి
Printer default ప్రింటర్ డిఫాల్ట్
Paper: కాగితం:
Pages to Print ముద్రించాల్సిన పేజీలు
More options: మరిన్ని ఎంపికలు:
Can't render this file because it contains an unexpected character in line 13 and column 16.
+1
View File
@@ -1146,6 +1146,7 @@
Off Kapalı
Flip on long edge Uzun kenardan çevir
Flip on short edge Kısa kenardan çevir
Printer default Yazıcı varsayılanı
Paper: Kağıt:
Pages to Print Yazdırılacak Sayfalar
More options: Diğer seçenekler:
Can't render this file because it contains an unexpected character in line 824 and column 9.
+1
View File
@@ -1186,6 +1186,7 @@
Off Вимкнено
Flip on long edge Перевертати за довгим краєм
Flip on short edge Перевертати за коротким краєм
Printer default За замовчуванням принтера
Paper: Папір:
Pages to Print Сторінки для друку
More options: Додаткові параметри:
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -588,6 +588,7 @@ theme Appearance Giao diện
Flip horizontal Lật ngang
Flip on long edge Lật theo cạnh dài
Flip on short edge Lật theo cạnh ngắn
Printer default Mặc định của máy in
Flip vertical Lật dọc
Folders Thư mục
Font Size: Cỡ chữ:
Can't render this file because it contains an unexpected character in line 490 and column 12.
+1
View File
@@ -876,6 +876,7 @@
Off 关
Flip on long edge 沿长边翻转
Flip on short edge 沿短边翻转
Printer default 打印机默认
Paper: 纸张:
Pages to Print 要打印的页面
More options: 更多选项:
Can't render this file because it contains an unexpected character in line 9 and column 16.
+1
View File
@@ -820,6 +820,7 @@
Off 關
Flip on long edge 沿長邊翻轉
Flip on short edge 沿短邊翻轉
Printer default 印表機預設
Paper: 紙張:
Pages to Print 要列印的頁面
More options: 更多選項:
Can't render this file because it contains an unexpected character in line 9 and column 16.
+30 -9
View File
@@ -51,7 +51,8 @@ pub struct PrintDraft {
pub copies: u32,
pub collate: bool,
pub grayscale: bool,
pub duplex: spool::Duplex,
/// `None` = the printer's own default (its Properties), as Acrobat does.
pub duplex: Option<spool::Duplex>,
pub which: Which,
pub range: String,
/// The pages `Which::Selected` prints (0-based, in page order); empty when none were picked.
@@ -106,7 +107,7 @@ impl Default for PrintDraft {
copies: 1,
collate: true,
grayscale: false,
duplex: spool::Duplex::Off,
duplex: None,
which: Which::All,
range: String::new(),
selected: Vec::new(),
@@ -145,7 +146,7 @@ impl Default for PrintDraft {
impl PrintDraft {
/// The engine settings for this draft (page count and labels from the document).
pub fn settings(&self, count: usize, labels: &[String]) -> Result<print::Settings, String> {
if self.handling == Handling::Multiple && self.order == PageOrder::CutStack && self.duplex != spool::Duplex::Off {
if self.cut_and_stack() && matches!(self.duplex, Some(spool::Duplex::LongEdge | spool::Duplex::ShortEdge)) {
return Err("Cut and stack needs Two-sided: Off. Print single-sided sheets.".into());
}
let range = match self.which {
@@ -188,12 +189,17 @@ impl PrintDraft {
})
}
fn cut_and_stack(&self) -> bool {
self.handling == Handling::Multiple && self.order == PageOrder::CutStack
}
pub fn job(&self, title: &str) -> spool::Job {
spool::Job {
printer: self.printer.clone(),
copies: self.copies.max(1),
collate: self.collate,
duplex: Some(self.duplex),
// Cut and stack needs single-sided sheets, whatever the printer's default.
duplex: if self.cut_and_stack() { Some(spool::Duplex::Off) } else { self.duplex },
scaling: spool::Scaling::Exact,
grayscale: self.grayscale,
title: title.to_string(),
@@ -895,9 +901,10 @@ pub(crate) fn body(
"duplex",
&mut d.duplex,
&[
(spool::Duplex::Off, tl!("Off")),
(spool::Duplex::LongEdge, tl!("Flip on long edge")),
(spool::Duplex::ShortEdge, tl!("Flip on short edge")),
(None, tl!("Printer default")),
(Some(spool::Duplex::Off), tl!("Off")),
(Some(spool::Duplex::LongEdge), tl!("Flip on long edge")),
(Some(spool::Duplex::ShortEdge), tl!("Flip on short edge")),
],
160.0,
);
@@ -1274,11 +1281,25 @@ mod tests {
#[test]
fn composed_sheets_keep_exact_scaling_and_the_dialogs_duplex_choice() {
let draft = PrintDraft { duplex: spool::Duplex::LongEdge, ..PrintDraft::default() };
let draft = PrintDraft { duplex: Some(spool::Duplex::LongEdge), ..PrintDraft::default() };
let job = draft.job("report.pdf");
assert_eq!(job.scaling, spool::Scaling::Exact);
assert_eq!(job.duplex, Some(spool::Duplex::LongEdge));
assert_eq!(PrintDraft::default().job("report.pdf").duplex, Some(spool::Duplex::Off));
let off = PrintDraft { duplex: Some(spool::Duplex::Off), ..PrintDraft::default() };
assert_eq!(off.job("report.pdf").duplex, Some(spool::Duplex::Off));
}
/// Untouched, Two-sided sends nothing, so the duplex set in the printer's Properties applies
/// (#2422); cut and stack still asks for single-sided sheets.
#[test]
fn two_sided_follows_the_printer_until_chosen() {
assert_eq!(PrintDraft::default().duplex, None);
assert_eq!(PrintDraft::default().job("report.pdf").duplex, None);
let mut cut = PrintDraft { handling: Handling::Multiple, order: PageOrder::CutStack, ..PrintDraft::default() };
assert_eq!(cut.job("report.pdf").duplex, Some(spool::Duplex::Off));
assert!(cut.settings(4, &[]).is_ok(), "the printer's default doesn't block cut and stack");
cut.duplex = Some(spool::Duplex::ShortEdge);
assert!(cut.settings(4, &[]).is_err());
}
/// A job being spooled holds the progress card, counting its sheets as the spooler reports
+2 -2
View File
@@ -182,11 +182,11 @@ fn cut_stack_dialog_previews_saves_and_refuses_duplex() {
h.get_by_label("›").click();
h.run_steps(2);
h.get_by_label("Sheet 2 of 3");
h.state_mut().print_draft.duplex = Duplex::LongEdge;
h.state_mut().print_draft.duplex = Some(Duplex::LongEdge);
h.run_steps(2);
h.get_by_label_contains("Cut and stack needs Two-sided: Off");
assert!(!h.state_mut().print_now());
h.state_mut().print_draft.duplex = Duplex::Off;
h.state_mut().print_draft.duplex = Some(Duplex::Off);
h.state_mut().print_draft.printer = None;
let out = std::env::temp_dir().join(format!("pdfcraft-cut-stack-ui-{}.pdf", std::process::id()));
h.state_mut().save_override = Some(out.to_string_lossy().into_owned());
+2 -2
View File
@@ -8020,8 +8020,8 @@ milestone = "M10"
status = "shipped"
commands = ["print.dialog"]
tools = ["doc_print"]
evidence = ["crates/print/src/tests.rs::spooler_arguments_and_printer_list"]
notes = "long/short edge via the spooler: lp -o sides=…, and the Windows driver's Duplex setting"
evidence = ["crates/print/src/tests.rs::spooler_arguments_and_printer_list", "crates/ui-egui/src/print_ui.rs::two_sided_follows_the_printer_until_chosen"]
notes = "long/short edge via the spooler: lp -o sides=…, and the Windows driver's Duplex setting. Two-sided starts at Printer default, as in Acrobat: nothing is sent, so the printer's own default (its Properties) applies until Off or an edge is chosen. Missing: the document's /ViewerPreferences /Duplex preset isn't read yet"
[[feature]]
id = "print.n-up"