app: wire web export, preview, and print flows through the plot UI

- plot dialog: the web build defaults to 'Save to PDF file...' (its only
  output choice); native dropdowns and defaults are untouched.
- on_plot_dlg_commit forces to_file on wasm so a stale page setup can no
  longer route the web build into the (unreachable) printer path; both
  preview branches now go through preview_page_pdf, which is identical to
  the old inline temp-PDF + OS-viewer flow on desktop.
- Print ribbon / PRINTALL on wasm render the PDF and open it in a tab
  instead of erroring; PrintAllPdf picks a virtual path and downloads.
- pdf_plot_options maps the dialog's Quality dropdown into PdfPlotOptions.

(cherry picked from commit 892d693d2d)
This commit is contained in:
Afonsop authored and Hakan Seven committed 2026-10-12 12:02:04 +03:00
1 parent 978000d37c
commit 38f0e2b25f
4 files changed
+117 -55

No files matched your search

+2
View File
@@ -3712,6 +3712,8 @@ pub enum Message {
/// Send current layout to the system printer (via lp / lpr).
PrintToPrinter,
/// Callback from the async printer job.
/// Web never constructs it — printing opens the PDF preview instead.
#[cfg_attr(target_arch = "wasm32", allow(dead_code))]
PrintResult(Result<String, String>),
/// Open the full Plot / Print dialog (seeds state from the layout).
PlotDialogOpen,
+63 -40
View File
@@ -4160,34 +4160,38 @@ impl OpenCADStudio {
}
pub(super) fn on_print_all_print(&mut self) -> Task<Message> {
let dialog = self.plot_dialog.clone();
if self.print_all_settings_override && dialog.style_missing && dialog.apply_plot_styles {
self.command_line.push_error(
crate::tf!("Plot style table '{}' is not loaded.", dialog.style_name).as_ref(),
);
return Task::none();
}
let pages = match self.print_all_pages() {
Ok(pages) => pages,
Err(error) => {
self.command_line.push_error(&error);
return Task::none();
}
};
self.save_config();
self.close_active_modal();
// The web build has no system printers: render every layout into one
// PDF and open it in a browser tab for the browser print dialog.
#[cfg(target_arch = "wasm32")]
{
self.command_line
.push_error(crate::t!("Printing is not available in the web version.").as_ref());
Task::none()
let work = move || {
crate::io::print_to_printer::preview_pages_pdf(&pages)
.map(|_| crate::t!("Opened plot preview.").into_owned())
.map_err(|e| crate::tf!("Preview failed: {e}").into_owned())
};
self.run_print_all_work(true, work)
}
#[cfg(not(target_arch = "wasm32"))]
{
let dialog = self.plot_dialog.clone();
if self.print_all_settings_override && dialog.style_missing && dialog.apply_plot_styles
{
self.command_line.push_error(
crate::tf!("Plot style table '{}' is not loaded.", dialog.style_name).as_ref(),
);
return Task::none();
}
let pages = match self.print_all_pages() {
Ok(pages) => pages,
Err(error) => {
self.command_line.push_error(&error);
return Task::none();
}
};
let options = self.plot_print_options(&dialog);
let fallback_style = self.dialog_plot_style(&dialog);
let temp_path = crate::io::print_to_printer::temp_pdf_path("print_all");
self.save_config();
self.close_active_modal();
self.command_line
.push_info(crate::t!("Sending selected layouts to the system printer…").as_ref());
let work = move || {
@@ -4429,18 +4433,35 @@ impl OpenCADStudio {
);
return Task::none();
};
let options = self.plot_print_options(&self.plot_dialog);
self.command_line
.push_info(crate::t!("Sending to system printer…").as_ref());
background_task(
crate::t!("Print to printer"),
move || {
iced::futures::executor::block_on(crate::io::print_to_printer::print_wires_with(
page, options,
))
},
Message::PrintResult,
)
// The web build has no system printers: PRINT opens the rendered PDF
// in a browser tab, where the browser's own print dialog takes over.
#[cfg(target_arch = "wasm32")]
{
background_task(
crate::t!("Plot preview"),
move || {
crate::io::print_to_printer::preview_page_pdf(&page)
.map(|_| crate::t!("Opened plot preview.").into_owned())
.map_err(|e| crate::tf!("Preview failed: {e}").into_owned())
},
|result| Message::BackgroundIoFinished(result, false),
)
}
#[cfg(not(target_arch = "wasm32"))]
{
let options = self.plot_print_options(&self.plot_dialog);
self.command_line
.push_info(crate::t!("Sending to system printer…").as_ref());
background_task(
crate::t!("Print to printer"),
move || {
iced::futures::executor::block_on(crate::io::print_to_printer::print_wires_with(
page, options,
))
},
Message::PrintResult,
)
}
}
/// QUICKPRINT / QP — use the current selection's bounding box as the plot
@@ -5743,6 +5764,12 @@ impl OpenCADStudio {
/// Open a preview PDF, export a PDF, or send the job to the chosen printer.
fn on_plot_dlg_commit(&mut self, preview: bool) -> Task<Message> {
let d = self.plot_dialog.clone();
// The web dialog only offers PDF output, but a page setup loaded from
// the drawing can still seed `to_file = false` — always export there.
#[cfg(target_arch = "wasm32")]
let to_file = true;
#[cfg(not(target_arch = "wasm32"))]
let to_file = d.to_file;
if d.style_missing && d.apply_plot_styles {
self.command_line.push_error(
crate::tf!("Plot style table '{}' is not loaded.", d.style_name).as_ref(),
@@ -5788,16 +5815,14 @@ impl OpenCADStudio {
// Preview renders to a temp PDF and opens it — never a save dialog,
// whatever the output target is.
if preview {
let tmp = crate::io::print_to_printer::temp_pdf_path("preview");
let work = move || {
crate::io::pdf_export::export_pdf(&page, &tmp)
.and_then(|_| crate::io::print_to_printer::open_in_viewer(&tmp))
crate::io::print_to_printer::preview_page_pdf(&page)
.map(|_| crate::t!("Opened plot preview.").into_owned())
.map_err(|e| crate::tf!("Preview failed: {e}").into_owned())
};
return self.run_plot_work(d.background, true, work);
}
if d.to_file {
if to_file {
// Tested clipped export (opens a save dialog).
return Task::done(Message::PlotWindowExport);
}
@@ -5815,17 +5840,15 @@ impl OpenCADStudio {
let page = self.layout_plot_page();
if preview {
let tmp = crate::io::print_to_printer::temp_pdf_path("preview");
let work = move || {
crate::io::pdf_export::export_pdf(&page, &tmp)
.and_then(|_| crate::io::print_to_printer::open_in_viewer(&tmp))
crate::io::print_to_printer::preview_page_pdf(&page)
.map(|_| crate::t!("Opened plot preview.").into_owned())
.map_err(|e| crate::tf!("Preview failed: {e}").into_owned())
};
return self.run_plot_work(d.background, true, work);
}
if d.to_file {
if to_file {
// Reuse the tested PDF export flow (it opens a save dialog).
return Task::done(Message::PlotExport);
}
+4 -5
View File
@@ -9936,11 +9936,10 @@ impl OpenCADStudio {
}
#[cfg(target_arch = "wasm32")]
{
let _ = stem;
self.command_line.push_error(
crate::t!("PDF export is not available in the web version.").as_ref(),
);
Task::none()
Task::perform(
crate::io::pdf_export::pick_pdf_path_owned(stem),
Message::PrintAllPdfPath,
)
}
}
Message::PrintAllPdfPath(None) => Task::none(),