mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-24 10:08:00 -06:00
* M10: Windows print jobs show per-sheet progress; printers list faster Follow-up to #944, carrying the two parts main doesn't have yet. - The progress card follows a job being spooled and counts its sheets as they reach the spooler ("Sending sheet 2 of 3 to Office…"), using craft-print's new submit_with_progress. It replaces the "Sending to…" toast, leaves another long job's card alone, and goes when the job ends; the spooler's answer is still a notice. - craft-print bumped to storytold/craft-libs#27, which also lists Windows printers through .NET's PrinterSettings (the API jobs spool with) instead of a CIM query of Win32_Printer. - "Sending sheet {s} of {n} to {printer}…" in all 20 catalogs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refresh catalog hashes after merging main --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
Brandon Thomas
parent
2fa110e185
commit
9b6dab142f
+22
-22
@@ -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 = "393902c1a2e21346b5a328a1a8792bfc361cb0872a465901209e36d78ca45b79"
|
||||
sha256 = "48add323da3a6a7643e8019692712e135d57fc996cf8c91397ca155c128a231b"
|
||||
|
||||
# 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 = "d90200f734b322b9987cae89a1e6e7d98c10fd7071047d9d6538d3e58e0312db"
|
||||
sha256 = "dacff0f922e0b5c05614dd424e8d2d42ef50ebf88617f9fb46d6397368831c62"
|
||||
|
||||
[[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 = "3b24582f96c26d91afb592a787c20115e5adeacf5672cf2d3fe265ec25e012bf"
|
||||
sha256 = "050af73f413f418a884779b200399a1f34c60b23f319376720387c4ab8a68bde"
|
||||
|
||||
[[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 = "d3cd4e5358351adb254f4969a3c2d579c43a9b1c140ee2501a28bf09bd63b677"
|
||||
sha256 = "d10d93d5d8a4263f76ec4ff2b422cec460b462811b05e5835bb8e11a8eca420c"
|
||||
|
||||
[[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 = "74c82a97934c5423d1fe6c56a4cc23ed821bb1abacfff258c2a64414aa13fb29"
|
||||
sha256 = "8f4b89f85ef458195501f8b94c6ccc49f2613d780e5f96a49c6376f326e21255"
|
||||
|
||||
[[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 = "46e7ca20f0a6851c77fa73f3d9401ea9e9141f592d03be906328342924907310"
|
||||
sha256 = "cccacda996b0864810ca50ab5bbe011f086558d29d3d6b85343c6473774ef3d6"
|
||||
|
||||
[[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 = "5f51fd699f88c01828ce6386ac92814a16c32a1815ad3b2fb745e231376a6db2"
|
||||
sha256 = "1ab4346ba91874eddc9800c15a40d46e2399cbbf90bba4481785e25961b14602"
|
||||
|
||||
[[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 = "3a840c78fcf5ea19d0e683c78874ebc4ed46025595c84eb12cea4713f7d986d3"
|
||||
sha256 = "58e9d3d0bdedc03dfd515c767dc7e83d211b54b52783402357c36d9e4012062b"
|
||||
|
||||
[[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 = "9e7866f38b811211b5b145052c11018c26d0e0d6b3e5edad93a9c2d7fba008a7"
|
||||
sha256 = "1ab3877b027c600ba3cec01523eac90172098ce800ac32fbee93a98a039e0e71"
|
||||
|
||||
[[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 = "0d46bc90f3fd0faef2542b5958ddb931cfae56bca5b9ce6e69e805dfee50505a"
|
||||
sha256 = "93a5c2631cfb458bdd06d12b20783c0e9f70d73ef6cc007651824ff04a7ff772"
|
||||
|
||||
[[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 = "bfa4d801835202166874f717d9bda7c14731570bdc63b3e4c58f5dc93be02998"
|
||||
sha256 = "dccace4145bf5be6961e03413e1baac3022b23343fb8ec1bb80e4b771b9b15c1"
|
||||
|
||||
[[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 = "24092581310895dca1f6ed2d88f582749cc776aedb13ae7d5d4dafd67efc1bad"
|
||||
sha256 = "980f345f77d501e1413b734dd343f70a3fc535752a118647e1c3c71719008672"
|
||||
|
||||
[[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 = "6fb3b98133d9af06d27dce35a1c0f370c6d16702b82598ffaa2909b05e9e9be4"
|
||||
sha256 = "ba02397a61f224605fda9fd17416b5e364724c932392ebdda34153310190c07a"
|
||||
|
||||
[[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 = "784f6dd4534dc842fd18e0c0af790af92e5caf32732d0ef85f88a094f0591a48"
|
||||
sha256 = "d59371e117366bf36ff8627db5abc355d354dc73b61d09e20c78028a492c2518"
|
||||
|
||||
[[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 = "2fd1b542c391537423a5b36a0617886fc4ca8abc8aa595cc4bd700eb5600760f"
|
||||
sha256 = "c39f98e74458221d474623a67345e54623307a7cb6396d4927439b5cacfec831"
|
||||
|
||||
[[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 = "9c3ae4e8692e9715f6a1cfb5eb0e7ef02d03d222833ca9cf11e286f222e8f024"
|
||||
sha256 = "ac27ed3c24f09c5e727ecce94de2313621394457f6cc03b7ebd440331ae62b99"
|
||||
|
||||
[[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 = "6a44916924fd9fed55e97e9e9aed10299bd1c2cdd3213530afc328fcc3382b8a"
|
||||
sha256 = "b312eadaea1f306399c9285b528bca282a204c559885546cbd1213509a6f08fe"
|
||||
|
||||
[[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 = "623bf25e7f0dc783e497d2744ac7fa17437ef3cc9c65a25b91c82321700ae037"
|
||||
sha256 = "a0f9d57e72d92ff5c8822c38681774b4cd49c6c2a8d174322c3e8e2404bd4e33"
|
||||
|
||||
[[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 = "73b8af9831358bc6ea9124fd7a05b725cf80c89709348ac07680646bf11378d7"
|
||||
sha256 = "4f0505cf19f18e9152d692861dec6ee9bf1127055e799a65a3305e9d0681a9da"
|
||||
|
||||
[[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 = "b9edcc284143606785999408fb3c2e6ed61bd9d973225b6a37fdbbfbd226093f"
|
||||
sha256 = "f8972322dbe61d739bef4a29e3a4a2a16ac267652375413646273e1c1a917515"
|
||||
|
||||
|
||||
[[asset]]
|
||||
@@ -240,7 +240,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 = "8f4d695f2a20a0a8470181c343b2a832d7cd05a7645aa07fe5e4a94299a84b82"
|
||||
sha256 = "a05bf2b649ce3fcfa2f990871daa2b97a6464db7b313f606868688806d23f8e1"
|
||||
|
||||
[[asset]]
|
||||
path = "assets/icons/accessibility.svg"
|
||||
@@ -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 = "d5b66bf35341a9ce1d66204a99cfc5679c66c26f7afb0bb394d87335783d229d"
|
||||
sha256 = "0c6a8713138e05dd8a2996d7e2da097a03e321e5212a4071bbe58c4c846179bf"
|
||||
|
||||
[[asset]]
|
||||
path = "vendor/vello_common/assets/probe.png"
|
||||
|
||||
Generated
+1
-1
@@ -1145,7 +1145,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "craft-print"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/storytold/craft-libs?rev=f03ec27ab2c405969428512178f746183cd55ca0#f03ec27ab2c405969428512178f746183cd55ca0"
|
||||
source = "git+https://github.com/storytold/craft-libs?rev=666c358065261a2816b376fa3bb10538dbf53040#666c358065261a2816b376fa3bb10538dbf53040"
|
||||
dependencies = [
|
||||
"miniz_oxide 0.8.9",
|
||||
"roxmltree",
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ repository = "https://github.com/storytold/pdfcraft"
|
||||
# Shared frontend components; engines remain independent of egui.
|
||||
craft-ui = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] }
|
||||
# Shared system spooler; document composition remains in pdfcraft-print.
|
||||
craft-print = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "f03ec27ab2c405969428512178f746183cd55ca0" }
|
||||
craft-print = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "666c358065261a2816b376fa3bb10538dbf53040" }
|
||||
# internal
|
||||
pdfcraft-geom = { path = "crates/geom", version = "0.8.0" }
|
||||
pdfcraft-filters = { path = "crates/filters", version = "0.8.0" }
|
||||
|
||||
@@ -159,6 +159,7 @@ Ranked; detail and the full milestone table in [docs/roadmap.md](docs/roadmap.md
|
||||
- **2026-10-15 (M14, gap 24):** `misc.localization` and `misc.installers` move from planned to partial. Localization: 22 catalogs ship, but Chinese shows tofu in releases, Telugu has no release font and Arabic is not mirrored. Installers: macOS and Windows releases are signed, Linux packages are not. The Acrobat menu diff itself remains open. Estimates unchanged.
|
||||
- **2026-10-13 (G14, Vietnamese localization):** Added Vietnamese (`vi`, Tiếng Việt) as an interface and date language with a 2,591-entry catalog (`plural_none`) covering 100% of the current localizable key union (plus `theme`/`Appearance`). Locale tags `vi` / `vi-VN` / `vi_VN.UTF-8` resolve; calendar months use numeric `Tháng 1`…`12` / `tháng 1`…`12`. Native-speaker community review recorded. The twelve-language localization mean moves from ≈59% to ≈68%; weighted readiness ≈49% → ≈50%. Status stays `partial`: engine/OS details, document contents, filenames, CLI/MCP and external help stay outside the catalog by design.
|
||||
|
||||
- **2026-10-12 (M10, Windows print progress, follow-up to #944):** While a job spools, the progress card counts its sheets ("Sending sheet 2 of 3 to Office…") as craft-print reports them (`submit_with_progress`, storytold/craft-libs#27), and steps aside for another long job's card. Pins craft-libs 666c358. Estimates unchanged.
|
||||
- 2026-10-12 · M3: selected page text can be copied from Edit and the canvas context menu (#1225). Five focused regressions, full CI and native Unicode clipboard checks pass; floating Copy shares the document permission gate. Estimates unchanged.
|
||||
|
||||
- **2026-10-13 (M2, page-label prefixes):** Preserve literal leading and trailing whitespace in page-label prefixes without changing generic metadata normalization. Nine original public-inspection cases cover prefix spaces, encodings and empty-prefix controls. Existing empty-prefix fallback remains a compatibility policy, not a conformance claim. Estimates unchanged.
|
||||
|
||||
@@ -59,6 +59,12 @@ pub fn submit(pdf: &[u8], job: &Job) -> Result<String, crate::PrintError> {
|
||||
craft_print::submit(pdf, job).map_err(|e| crate::PrintError::Spool(e.to_string()))
|
||||
}
|
||||
|
||||
/// [`submit`], told `(sent, sheets)` as each sheet reaches the spooler (Windows; CUPS takes the
|
||||
/// whole PDF at once and reports nothing).
|
||||
pub fn submit_with_progress(pdf: &[u8], job: &Job, progress: &mut dyn FnMut(usize, usize)) -> Result<String, crate::PrintError> {
|
||||
craft_print::submit_with_progress(pdf, job, progress).map_err(|e| crate::PrintError::Spool(e.to_string()))
|
||||
}
|
||||
|
||||
pub fn open_printer_preferences(printer: &str) -> Result<(), crate::PrintError> {
|
||||
craft_print::open_printer_preferences(printer).map_err(|e| crate::PrintError::Spool(e.to_string()))
|
||||
}
|
||||
|
||||
@@ -1616,6 +1616,7 @@
|
||||
Sent to {printer} أُرسل إلى {printer}
|
||||
Sent to {printer}: {msg} أُرسل إلى {printer}: {msg}
|
||||
Looking for printers… جارٍ البحث عن الطابعات…
|
||||
Sending sheet {s} of {n} to {printer}… جارٍ إرسال الورقة {s} من {n} إلى {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. لم يُعثر على أي طابعة. تحقّق من أن الطابعة مثبّتة وأن خدمة التخزين المؤقت للطباعة تعمل، ثم افتح «طباعة» مرة أخرى.
|
||||
Sending to {printer}… جارٍ الإرسال إلى {printer}…
|
||||
Choose a folder for the searchable files اختر مجلدًا للملفات القابلة للبحث
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1577,6 +1577,7 @@
|
||||
Sent to {printer} Изпратено до {printer}
|
||||
Sent to {printer}: {msg} Изпратено до {printer}: {msg}
|
||||
Looking for printers… Търсене на принтери…
|
||||
Sending sheet {s} of {n} to {printer}… Изпращане на лист {s} от {n} до {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Не са намерени принтери. Проверете дали принтерът е инсталиран и дали услугата за опашка за печат работи, след което отворете „Печат“ отново.
|
||||
Sending to {printer}… Изпращане до {printer}…
|
||||
Choose a folder for the searchable files Изберете папка за файловете с възможност за търсене
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 8 and column 16.
|
@@ -2264,6 +2264,7 @@ certificate Subject Subjekt
|
||||
Remove page Odebrat stránku
|
||||
Remove {n} pages Odebrat stránky ({n})
|
||||
Looking for printers… Hledání tiskáren…
|
||||
Sending sheet {s} of {n} to {printer}… Odesílání listu {s} z {n} na {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nebyly nalezeny žádné tiskárny. Zkontrolujte, že je tiskárna nainstalovaná a zařazování tisku běží, a pak znovu otevřete Tisk.
|
||||
Sending to {printer}… Odesílání na {printer}…
|
||||
Fill colour Barva výplně
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1610,6 +1610,7 @@
|
||||
Sent to {printer} An {printer} gesendet
|
||||
Sent to {printer}: {msg} An {printer} gesendet: {msg}
|
||||
Looking for printers… Drucker werden gesucht…
|
||||
Sending sheet {s} of {n} to {printer}… Blatt {s} von {n} wird an {printer} gesendet…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Es wurden keine Drucker gefunden. Prüfen Sie, ob der Drucker installiert ist und die Druckwarteschlange läuft, und öffnen Sie dann „Drucken“ erneut.
|
||||
Sending to {printer}… Wird an {printer} gesendet…
|
||||
Choose a folder for the searchable files Wähle einen Ordner für die durchsuchbaren Dateien
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 51.
|
@@ -2248,6 +2248,7 @@ comment menu Edit Επεξεργασία
|
||||
Fill & Sign signature Υπογραφή από το εργαλείο «Συμπλήρωση και υπογραφή»
|
||||
Choose image… Επιλογή εικόνας…
|
||||
Looking for printers… Αναζήτηση εκτυπωτών…
|
||||
Sending sheet {s} of {n} to {printer}… Αποστολή φύλλου {s} από {n} στον {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Δεν βρέθηκαν εκτυπωτές. Ελέγξτε ότι ο εκτυπωτής είναι εγκατεστημένος και ότι η ουρά εκτύπωσης εκτελείται και, στη συνέχεια, ανοίξτε ξανά την Εκτύπωση.
|
||||
Sending to {printer}… Αποστολή στον {printer}…
|
||||
Enter permissions password… Εισαγωγή κωδικού δικαιωμάτων…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 475 and column 9.
|
@@ -1620,6 +1620,7 @@
|
||||
Sent to {printer} Enviado a {printer}
|
||||
Sent to {printer}: {msg} Enviado a {printer}: {msg}
|
||||
Looking for printers… Buscando impresoras…
|
||||
Sending sheet {s} of {n} to {printer}… Enviando la hoja {s} de {n} a {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. No se encontró ninguna impresora. Compruebe que la impresora está instalada y que la cola de impresión está en marcha, y vuelva a abrir Imprimir.
|
||||
Sending to {printer}… Enviando a {printer}…
|
||||
Choose a folder for the searchable files Elige una carpeta para los archivos con búsqueda
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 60.
|
@@ -1605,6 +1605,7 @@
|
||||
Sent to {printer} Envoyé à {printer}
|
||||
Sent to {printer}: {msg} Envoyé à {printer} : {msg}
|
||||
Looking for printers… Recherche des imprimantes…
|
||||
Sending sheet {s} of {n} to {printer}… Envoi de la feuille {s} sur {n} à {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Aucune imprimante trouvée. Vérifiez que l’imprimante est installée et que le spouleur d’impression fonctionne, puis rouvrez Imprimer.
|
||||
Sending to {printer}… Envoi à {printer}…
|
||||
Choose a folder for the searchable files Choisissez un dossier pour les fichiers recherchables
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 39.
|
@@ -1595,6 +1595,7 @@
|
||||
Sent to {printer} Elküldve ide: {printer}
|
||||
Sent to {printer}: {msg} Elküldve ide: {printer}: {msg}
|
||||
Looking for printers… Nyomtatók keresése…
|
||||
Sending sheet {s} of {n} to {printer}… {s}. lap / {n} küldése ide: {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nem található nyomtató. Ellenőrizze, hogy a nyomtató telepítve van-e, és fut-e a nyomtatási sorkezelő, majd nyissa meg újra a Nyomtatást.
|
||||
Sending to {printer}… Küldés ide: {printer}…
|
||||
Choose a folder for the searchable files Válassz mappát a kereshető fájloknak
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 7 and column 44.
|
@@ -1621,6 +1621,7 @@
|
||||
Sent to {printer} Inviato a {printer}
|
||||
Sent to {printer}: {msg} Inviato a {printer}: {msg}
|
||||
Looking for printers… Ricerca delle stampanti…
|
||||
Sending sheet {s} of {n} to {printer}… Invio del foglio {s} di {n} a {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nessuna stampante trovata. Verifica che la stampante sia installata e che lo spooler di stampa sia in esecuzione, quindi riapri Stampa.
|
||||
Sending to {printer}… Invio a {printer}…
|
||||
Choose a folder for the searchable files Scegli una cartella per i file ricercabili
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1626,6 +1626,7 @@
|
||||
Sent to {printer} {printer} に送信しました
|
||||
Sent to {printer}: {msg} {printer} に送信しました: {msg}
|
||||
Looking for printers… プリンターを検索しています…
|
||||
Sending sheet {s} of {n} to {printer}… {printer} に用紙 {s} / {n} を送信しています…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. プリンターが見つかりません。プリンターがインストールされ、印刷スプーラーが動作していることを確認してから、もう一度[印刷]を開いてください。
|
||||
Sending to {printer}… {printer} に送信しています…
|
||||
Choose a folder for the searchable files 検索可能なファイルの保存先フォルダーを選択
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -2238,6 +2238,7 @@ key Space Бос орын
|
||||
Fill & Sign signature «Толтыру және қол қою» қолтаңбасы
|
||||
Choose image… Сурет таңдау…
|
||||
Looking for printers… Принтерлер ізделуде…
|
||||
Sending sheet {s} of {n} to {printer}… {n} парақтың {s}-парағы {printer} құрылғысына жіберілуде…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтерлер табылмады. Принтердің орнатылғанын және басып шығару кезегі қызметінің жұмыс істеп тұрғанын тексеріп, «Басып шығару» терезесін қайта ашыңыз.
|
||||
Sending to {printer}… {printer} құрылғысына жіберілуде…
|
||||
Enter permissions password… Рұқсаттар құпиясөзін енгізу…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 824 and column 9.
|
@@ -1048,6 +1048,7 @@
|
||||
Selected pages Pasirinkti puslapiai
|
||||
Selection Pasirinkimas
|
||||
Sending to {printer}… Siunčiama į {printer}…
|
||||
Sending sheet {s} of {n} to {printer}… Siunčiamas lapas {s} iš {n} į {printer}…
|
||||
Sensitivity Jautrumas
|
||||
Sent to {printer} Išsiųsta į {printer}
|
||||
Sent to {printer}: {msg} Išsiųsta į {printer}: {msg}
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 401 and column 9.
|
@@ -1607,6 +1607,7 @@
|
||||
Sent to {printer} Wysłano do {printer}
|
||||
Sent to {printer}: {msg} Wysłano do {printer}: {msg}
|
||||
Looking for printers… Wyszukiwanie drukarek…
|
||||
Sending sheet {s} of {n} to {printer}… Wysyłanie arkusza {s} z {n} do {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nie znaleziono drukarek. Sprawdź, czy drukarka jest zainstalowana, a bufor wydruku działa, i ponownie otwórz Drukuj.
|
||||
Sending to {printer}… Wysyłanie do {printer}…
|
||||
Choose a folder for the searchable files Wybierz folder dla plików z możliwością wyszukiwania
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1511,6 +1511,7 @@
|
||||
Sent to {printer} Enviado para {printer}
|
||||
Sent to {printer}: {msg} Enviado para {printer}: {msg}
|
||||
Looking for printers… Procurando impressoras…
|
||||
Sending sheet {s} of {n} to {printer}… Enviando a folha {s} de {n} para {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Nenhuma impressora encontrada. Verifique se a impressora está instalada e se o spooler de impressão está em execução e abra Imprimir novamente.
|
||||
Sending to {printer}… Enviando para {printer}…
|
||||
Choose a folder for the searchable files Escolha uma pasta para os arquivos pesquisáveis
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 9 and column 16.
|
@@ -1617,6 +1617,7 @@
|
||||
Sent to {printer} Отправлено на {printer}
|
||||
Sent to {printer}: {msg} Отправлено на {printer}: {msg}
|
||||
Looking for printers… Поиск принтеров…
|
||||
Sending sheet {s} of {n} to {printer}… Отправка листа {s} из {n} на {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтеры не найдены. Проверьте, что принтер установлен, а диспетчер печати запущен, и снова откройте «Печать».
|
||||
Sending to {printer}… Отправка на {printer}…
|
||||
Choose a folder for the searchable files Выберите папку для доступных для поиска файлов
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 9 and column 16.
|
@@ -2227,6 +2227,7 @@ key Shift Shift
|
||||
key Space Preslednica
|
||||
@plural {n} object selected|{n} objects selected {n} izbran objekt|{n} izbrana objekta|{n} izbrani objekti|{n} izbranih objektov
|
||||
Looking for printers… Iskanje tiskalnikov…
|
||||
Sending sheet {s} of {n} to {printer}… Pošiljanje lista {s} od {n} na {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Ni najdenih tiskalnikov. Preverite, ali je tiskalnik nameščen in ali tiskalna vrsta deluje, nato znova odprite Natisni.
|
||||
Sending to {printer}… Pošiljanje na {printer}…
|
||||
Float panel Odtrgaj razdelek
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 9 and column 16.
|
@@ -1596,6 +1596,7 @@ action wizard Start ప్రారంభించు
|
||||
Sent to {printer} {printer}కు పంపబడింది
|
||||
Sent to {printer}: {msg} {printer}కు పంపబడింది: {msg}
|
||||
Looking for printers… ప్రింటర్ల కోసం వెతుకుతోంది…
|
||||
Sending sheet {s} of {n} to {printer}… {printer}కు {n}లో {s}వ షీట్ పంపుతోంది…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. ప్రింటర్లు ఏవీ కనుగొనబడలేదు. ప్రింటర్ ఇన్స్టాల్ అయిందో, ప్రింట్ స్పూలర్ నడుస్తోందో తనిఖీ చేసి, ముద్రణను మళ్లీ తెరవండి.
|
||||
Sending to {printer}… {printer}కు పంపుతోంది…
|
||||
Choose a folder for the searchable files వెతకగలిగే ఫైల్ల కోసం ఒక ఫోల్డర్ను ఎంచుకోండి
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 13 and column 16.
|
@@ -2184,6 +2184,7 @@ key Space Boşluk
|
||||
|
||||
# Printing and multi-object selection
|
||||
Looking for printers… Yazıcılar aranıyor…
|
||||
Sending sheet {s} of {n} to {printer}… {n} yapraktan {s}. yaprak {printer} yazıcısına gönderiliyor…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Yazıcı bulunamadı. Yazıcının yüklü olduğunu ve yazdırma biriktiricisinin çalıştığını denetleyip Yazdır'ı yeniden açın.
|
||||
Sending to {printer}… {printer} yazıcısına gönderiliyor…
|
||||
Column select Sütun seçimi
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 823 and column 9.
|
@@ -1614,6 +1614,7 @@
|
||||
Sent to {printer} Надіслано на {printer}
|
||||
Sent to {printer}: {msg} Надіслано на {printer}: {msg}
|
||||
Looking for printers… Пошук принтерів…
|
||||
Sending sheet {s} of {n} to {printer}… Надсилання аркуша {s} із {n} на {printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. Принтери не знайдено. Перевірте, що принтер установлено, а диспетчер друку працює, і знову відкрийте «Друк».
|
||||
Sending to {printer}… Надсилання на {printer}…
|
||||
Choose a folder for the searchable files Виберіть теку для файлів із пошуком
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -1040,6 +1040,7 @@ theme Appearance Giao diện
|
||||
Selected pages Các trang đã chọn
|
||||
Selection Vùng chọn
|
||||
Sending to {printer}… Đang gửi đến {printer}…
|
||||
Sending sheet {s} of {n} to {printer}… Đang gửi tờ {s}/{n} đến {printer}…
|
||||
Sensitivity Độ nhạy
|
||||
Sent to {printer} Đã gửi đến {printer}
|
||||
Sent to {printer}: {msg} Đã gửi đến {printer}: {msg}
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 487 and column 12.
|
@@ -1584,6 +1584,7 @@
|
||||
Sent to {printer} 已发送到{printer}
|
||||
Sent to {printer}: {msg} 已发送到{printer}:{msg}
|
||||
Looking for printers… 正在查找打印机…
|
||||
Sending sheet {s} of {n} to {printer}… 正在将第 {s} 张(共 {n} 张)发送到{printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. 未找到打印机。请检查打印机是否已安装、打印后台处理程序是否在运行,然后重新打开“打印”。
|
||||
Sending to {printer}… 正在发送到{printer}…
|
||||
Choose a folder for the searchable files 选择可搜索文件的文件夹
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 9 and column 16.
|
@@ -1530,6 +1530,7 @@
|
||||
Sent to {printer} 已傳送到{printer}
|
||||
Sent to {printer}: {msg} 已傳送到{printer}:{msg}
|
||||
Looking for printers… 正在尋找印表機…
|
||||
Sending sheet {s} of {n} to {printer}… 正在將第 {s} 張(共 {n} 張)傳送到{printer}…
|
||||
No printers were found. Check that the printer is installed and the print spooler is running, then open Print again. 找不到印表機。請確認印表機已安裝、列印多工緩衝處理器正在執行,然後重新開啟「列印」。
|
||||
Sending to {printer}… 正在傳送到{printer}…
|
||||
Choose a folder for the searchable files 選擇可搜尋檔案的資料夾
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 9 and column 16.
|
+127
-19
@@ -200,13 +200,16 @@ pub fn system_printers() -> PrinterSource {
|
||||
}
|
||||
|
||||
/// The Print dialog's work in the background: the printer list being read, and the jobs being
|
||||
/// spooled (the printer each was sent to, and the spooler's answer).
|
||||
/// spooled, oldest first.
|
||||
#[derive(Default)]
|
||||
pub(crate) struct PrintTasks {
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
printers: Option<std::sync::mpsc::Receiver<Vec<spool::Printer>>>,
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
jobs: Vec<(String, std::sync::mpsc::Receiver<Result<String, String>>)>,
|
||||
jobs: Vec<PrintJob>,
|
||||
/// The progress card is showing a print job (it is shared with other long jobs).
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
showing_progress: bool,
|
||||
/// The browser print being drawn, a sheet a frame (`web_print`).
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
web_job: Option<crate::web_print::WebPrintJob>,
|
||||
@@ -244,6 +247,22 @@ fn printer_label(name: &str) -> String {
|
||||
if name == crate::web_print::BROWSER_PRINTER { crate::web_print::browser_printer_label().to_string() } else { name.to_string() }
|
||||
}
|
||||
|
||||
/// A job being spooled: its printer, the sheets sent so far of how many, and its worker's news.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
struct PrintJob {
|
||||
printer: String,
|
||||
sheets: Option<(usize, usize)>,
|
||||
news: std::sync::mpsc::Receiver<JobNews>,
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
enum JobNews {
|
||||
/// `(sent, sheets)`: the spooler has this many of the job's sheets.
|
||||
Sent(usize, usize),
|
||||
/// The spooler's answer.
|
||||
Done(Result<String, String>),
|
||||
}
|
||||
|
||||
/// The printer the dialog preselects: the system default, else the first.
|
||||
fn default_printer(printers: &[spool::Printer]) -> Option<String> {
|
||||
printers.iter().find(|p| p.default).or(printers.first()).map(|p| p.name.clone())
|
||||
@@ -329,23 +348,63 @@ impl PdfCraftApp {
|
||||
}
|
||||
}
|
||||
let mut finished = Vec::new();
|
||||
self.print_tasks.jobs.retain(|(printer, rx)| match rx.try_recv() {
|
||||
Ok(r) => {
|
||||
finished.push((printer.clone(), r));
|
||||
false
|
||||
}
|
||||
Err(std::sync::mpsc::TryRecvError::Empty) => true,
|
||||
Err(std::sync::mpsc::TryRecvError::Disconnected) => {
|
||||
finished.push((printer.clone(), Err("the print job stopped unexpectedly".into())));
|
||||
false
|
||||
self.print_tasks.jobs.retain_mut(|job| {
|
||||
loop {
|
||||
match job.news.try_recv() {
|
||||
Ok(JobNews::Sent(sent, sheets)) => job.sheets = Some((sent, sheets)),
|
||||
Ok(JobNews::Done(r)) => {
|
||||
finished.push((job.printer.clone(), r));
|
||||
break false;
|
||||
}
|
||||
Err(std::sync::mpsc::TryRecvError::Empty) => break true,
|
||||
Err(std::sync::mpsc::TryRecvError::Disconnected) => {
|
||||
finished.push((job.printer.clone(), Err("the print job stopped unexpectedly".into())));
|
||||
break false;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
self.show_print_progress();
|
||||
for (printer, result) in finished {
|
||||
self.report_print_job(&printer, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The oldest job being spooled on the progress card, counting its sheets as they reach the
|
||||
/// spooler, while no other long job holds the card.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn show_print_progress(&mut self) {
|
||||
let Some(job) = self.print_tasks.jobs.first() else {
|
||||
if std::mem::take(&mut self.print_tasks.showing_progress) {
|
||||
self.progress_notice = None;
|
||||
}
|
||||
return;
|
||||
};
|
||||
if self.progress_notice.is_some() && !self.print_tasks.showing_progress {
|
||||
return;
|
||||
}
|
||||
let printer = job.printer.as_str();
|
||||
let (label, fraction) = match job.sheets {
|
||||
Some((sent, sheets)) if sheets > 0 => {
|
||||
// The sheet on its way: one past those sent, until the last is.
|
||||
let sheet = sent.saturating_add(1).min(sheets).to_string();
|
||||
let label = crate::i18n::fmt(
|
||||
tl!("Sending sheet {s} of {n} to {printer}…"),
|
||||
&[("s", &sheet), ("n", &sheets.to_string()), ("printer", printer)],
|
||||
);
|
||||
(label, sent as f32 / sheets as f32)
|
||||
}
|
||||
_ => (crate::i18n::fmt(tl!("Sending to {printer}…"), &[("printer", printer)]), 0.0),
|
||||
};
|
||||
self.progress_notice = Some(crate::widgets::ProgressNotice { label, fraction, cancellable: false });
|
||||
self.print_tasks.showing_progress = true;
|
||||
// The bar's sweep keeps moving between sheets.
|
||||
if let Some(ctx) = &self.ctx {
|
||||
ctx.request_repaint_after(std::time::Duration::from_millis(100));
|
||||
}
|
||||
}
|
||||
|
||||
fn report_print_job(&mut self, printer: &str, result: Result<String, String>) {
|
||||
match result {
|
||||
Ok(msg) if msg.is_empty() => self.notify(crate::i18n::fmt(tl!("Sent to {printer}"), &[("printer", printer)])),
|
||||
@@ -398,20 +457,29 @@ impl PdfCraftApp {
|
||||
}
|
||||
|
||||
/// Spool a job off the UI thread: on Windows every sheet is rendered at the printer's
|
||||
/// resolution first, which can take minutes for a long document. The dialog closes at once
|
||||
/// and the spooler's answer arrives as a notice.
|
||||
/// resolution first, which can take minutes for a long document. The dialog closes at once,
|
||||
/// the progress card counts the sheets as they reach the spooler, and the spooler's answer
|
||||
/// arrives as a notice.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
fn send_to_printer(&mut self, printer: String, bytes: Vec<u8>, job: spool::Job) -> bool {
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
let ctx = self.ctx.clone();
|
||||
std::thread::spawn(move || {
|
||||
let _ = tx.send(spool::submit(&bytes, &job).map_err(|e| e.to_string()));
|
||||
if let Some(ctx) = ctx {
|
||||
ctx.request_repaint();
|
||||
}
|
||||
let repaint = || {
|
||||
if let Some(ctx) = &ctx {
|
||||
ctx.request_repaint();
|
||||
}
|
||||
};
|
||||
// The receiver may be gone (the app quit): nothing to report to then.
|
||||
let result = spool::submit_with_progress(&bytes, &job, &mut |sent, sheets| {
|
||||
let _ = tx.send(JobNews::Sent(sent, sheets));
|
||||
repaint();
|
||||
});
|
||||
let _ = tx.send(JobNews::Done(result.map_err(|e| e.to_string())));
|
||||
repaint();
|
||||
});
|
||||
self.notify(crate::i18n::fmt(tl!("Sending to {printer}…"), &[("printer", &printer)]));
|
||||
self.print_tasks.jobs.push((printer, rx));
|
||||
self.print_tasks.jobs.push(PrintJob { printer, sheets: None, news: rx });
|
||||
self.show_print_progress();
|
||||
true
|
||||
}
|
||||
|
||||
@@ -1127,6 +1195,46 @@ mod tests {
|
||||
assert_eq!(PrintDraft::default().job("report.pdf").duplex, Some(spool::Duplex::Off));
|
||||
}
|
||||
|
||||
/// A job being spooled holds the progress card, counting its sheets as the spooler reports
|
||||
/// them; the card goes when the job ends and its answer arrives as a notice. A card another
|
||||
/// long job is showing is left alone.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
#[test]
|
||||
fn the_progress_card_counts_the_sheets_of_a_print_job() {
|
||||
let mut app = PdfCraftApp::new();
|
||||
app.set_option("language", "en").unwrap();
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
app.print_tasks.jobs.push(PrintJob { printer: "Office".into(), sheets: None, news: rx });
|
||||
app.poll_print();
|
||||
assert_eq!(app.progress_notice.as_ref().map(|p| p.label.as_str()), Some("Sending to Office…"));
|
||||
|
||||
tx.send(JobNews::Sent(0, 3)).unwrap();
|
||||
tx.send(JobNews::Sent(1, 3)).unwrap();
|
||||
app.poll_print();
|
||||
let shown = app.progress_notice.clone().unwrap();
|
||||
assert_eq!(shown.label, "Sending sheet 2 of 3 to Office…");
|
||||
assert!((shown.fraction - 1.0 / 3.0).abs() < 1e-4 && !shown.cancellable, "{shown:?}");
|
||||
|
||||
tx.send(JobNews::Sent(3, 3)).unwrap();
|
||||
tx.send(JobNews::Done(Ok(String::new()))).unwrap();
|
||||
app.poll_print();
|
||||
assert!(app.progress_notice.is_none() && app.print_tasks.jobs.is_empty());
|
||||
assert_eq!(app.toast.as_ref().map(|t| t.0.as_str()), Some("Sent to Office"));
|
||||
|
||||
// Another job's card stays; a worker that vanished is reported, not left spinning.
|
||||
let other = crate::widgets::ProgressNotice { label: "Optimizing…".into(), fraction: 0.5, cancellable: true };
|
||||
app.progress_notice = Some(other.clone());
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
app.print_tasks.jobs.push(PrintJob { printer: "Office".into(), sheets: None, news: rx });
|
||||
tx.send(JobNews::Sent(1, 2)).unwrap();
|
||||
app.poll_print();
|
||||
assert_eq!(app.progress_notice, Some(other));
|
||||
drop(tx);
|
||||
app.poll_print();
|
||||
assert!(app.print_tasks.jobs.is_empty() && app.progress_notice.is_some());
|
||||
assert_eq!(app.toast.as_ref().map(|t| t.0.as_str()), Some("the print job stopped unexpectedly"));
|
||||
}
|
||||
|
||||
/// Issue #1308: Current page is the page on screen, even when a later page is labelled with
|
||||
/// its number. A typed range still reads labels first.
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user