mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-11-10 21:11:52 +00:00
fix(print): refine paper matching, override tracking, and settings restore
This commit is contained in:
1 parent
d7a50ba475
commit
290f775316
5 files changed
+42
-12
No files matched your search
@@ -276,19 +276,29 @@ impl PdfCraftApp {
|
||||
self.always_default_view = on;
|
||||
}
|
||||
if let Some(name) = v.get("print_paper").and_then(serde_json::Value::as_str) {
|
||||
if let Some(paper) = self.print_draft.papers.iter().position(|(n, _)| n == name) {
|
||||
self.print_draft.paper = paper;
|
||||
} else if let Some(paper) = pdfcraft_engine::print::PAPERS.iter().position(|(canonical, _)| *canonical == name) {
|
||||
self.print_draft.paper = paper;
|
||||
} else if let Some(size) = v.get("print_paper_size").and_then(|s| {
|
||||
let saved_size = v.get("print_paper_size").and_then(|s| {
|
||||
let w = s.get(0)?.as_f64()?;
|
||||
let h = s.get(1)?.as_f64()?;
|
||||
if w >= 72.0 && h >= 72.0 && w.is_finite() && h.is_finite() { Some((w, h)) } else { None }
|
||||
}) {
|
||||
});
|
||||
let matched_pos = self
|
||||
.print_draft
|
||||
.papers
|
||||
.iter()
|
||||
.position(|(n, s)| n == name && saved_size.is_none_or(|sz| (s.0 - sz.0).abs() <= 1.0 && (s.1 - sz.1).abs() <= 1.0))
|
||||
.or_else(|| {
|
||||
pdfcraft_engine::print::PAPERS.iter().position(|(canonical, s)| {
|
||||
*canonical == name && saved_size.is_none_or(|sz| (s.0 - sz.0).abs() <= 1.0 && (s.1 - sz.1).abs() <= 1.0)
|
||||
})
|
||||
});
|
||||
if let Some(paper) = matched_pos {
|
||||
self.print_draft.paper = paper;
|
||||
self.print_draft.paper_overridden = v.get("print_paper_overridden").and_then(serde_json::Value::as_bool).unwrap_or(true);
|
||||
} else if let Some(size) = saved_size {
|
||||
self.print_draft.papers.push((name.to_string(), size));
|
||||
self.print_draft.paper = self.print_draft.papers.len() - 1;
|
||||
self.print_draft.paper_overridden = v.get("print_paper_overridden").and_then(serde_json::Value::as_bool).unwrap_or(true);
|
||||
}
|
||||
self.print_draft.paper_overridden = v.get("print_paper_overridden").and_then(serde_json::Value::as_bool).unwrap_or(true);
|
||||
}
|
||||
if let Some(on) = v["highlight_fields"].as_bool() {
|
||||
self.view_defaults.highlight_fields = on;
|
||||
|
||||
@@ -172,7 +172,7 @@ impl PdfCraftApp {
|
||||
..keep
|
||||
};
|
||||
self.print_draft.update_printer_papers();
|
||||
if !picked && !self.print_draft.paper_overridden {
|
||||
if !self.print_draft.paper_overridden {
|
||||
self.print_draft.auto_select_default_paper();
|
||||
}
|
||||
self.dialog = Some(crate::Dialog::Print);
|
||||
|
||||
@@ -245,7 +245,7 @@ pub(crate) fn body(
|
||||
}
|
||||
}
|
||||
});
|
||||
if d.paper != before {
|
||||
if paper_clicked || d.paper != before {
|
||||
d.paper_overridden = true;
|
||||
}
|
||||
// Label stock gets the label layout (cut, turned upright, fitted).
|
||||
|
||||
@@ -168,7 +168,7 @@ impl PrintDraft {
|
||||
|
||||
/// Refresh `self.papers` with driver-reported media sizes, preserving the current selection.
|
||||
pub fn update_printer_papers(&mut self) {
|
||||
let before_label_name = self.paper_before_label.and_then(|idx| self.papers.get(idx).map(|p| p.0.clone()));
|
||||
let before_label = self.paper_before_label.and_then(|idx| self.papers.get(idx).cloned());
|
||||
let mut papers = default_papers();
|
||||
if let Some(ref printer) = self.printer {
|
||||
let detected = spool::printer_papers(printer);
|
||||
@@ -188,7 +188,9 @@ impl PrintDraft {
|
||||
let current_name = self.paper_name().to_string();
|
||||
let current_size = self.paper_size();
|
||||
self.papers = papers;
|
||||
if let Some(pos) = self.papers.iter().position(|(n, _)| n == ¤t_name) {
|
||||
if let Some(pos) =
|
||||
self.papers.iter().position(|(n, s)| n == ¤t_name && (s.0 - current_size.0).abs() <= 0.5 && (s.1 - current_size.1).abs() <= 0.5)
|
||||
{
|
||||
self.paper = pos;
|
||||
} else if let Some(pos) = self.papers.iter().position(|(_, s)| (s.0 - current_size.0).abs() <= 0.5 && (s.1 - current_size.1).abs() <= 0.5) {
|
||||
self.paper = pos;
|
||||
@@ -196,7 +198,16 @@ impl PrintDraft {
|
||||
self.papers.push((current_name, current_size));
|
||||
self.paper = self.papers.len() - 1;
|
||||
}
|
||||
self.paper_before_label = before_label_name.and_then(|name| self.papers.iter().position(|(n, _)| n == &name));
|
||||
self.paper_before_label = before_label.map(|(name, size)| {
|
||||
if let Some(pos) = self.papers.iter().position(|(n, s)| n == &name && (s.0 - size.0).abs() <= 0.5 && (s.1 - size.1).abs() <= 0.5) {
|
||||
pos
|
||||
} else if let Some(pos) = self.papers.iter().position(|(_, s)| (s.0 - size.0).abs() <= 0.5 && (s.1 - size.1).abs() <= 0.5) {
|
||||
pos
|
||||
} else {
|
||||
self.papers.push((name, size));
|
||||
self.papers.len() - 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Auto-select the printer's configured default paper (from DEVMODE / driver settings).
|
||||
|
||||
@@ -796,6 +796,15 @@ fn paper_choice_survives_cancel_and_settings_restore() {
|
||||
app.restore(&saved);
|
||||
let expected = pdfcraft_ui_egui::PrintDraft { paper: a4, paper_overridden: true, ..Default::default() };
|
||||
assert_eq!(app.print_draft, expected, "no other print preference becomes persistent");
|
||||
|
||||
// Default draft without override round-trips with paper_overridden remaining false.
|
||||
let default_app = PdfCraftApp::new();
|
||||
let default_saved = default_app.persist();
|
||||
let default_json: serde_json::Value = serde_json::from_str(&default_saved).unwrap();
|
||||
assert_eq!(default_json["print_paper_overridden"], false);
|
||||
let mut restored_default = PdfCraftApp::new();
|
||||
restored_default.restore(&default_saved);
|
||||
assert!(!restored_default.print_draft.paper_overridden);
|
||||
let mut restarted = harness_with_settings(Some(saved));
|
||||
assert!(restarted.state_mut().execute("print.dialog"));
|
||||
restarted.run_steps(3);
|
||||
|
||||
Reference in new issue
Block a user