Showing
4 changed files
with
33 additions
and
15 deletions
@@ -27,6 +27,7 @@ class PdfPreview extends StatefulWidget { | @@ -27,6 +27,7 @@ class PdfPreview extends StatefulWidget { | ||
27 | this.pageFormats, | 27 | this.pageFormats, |
28 | this.onError, | 28 | this.onError, |
29 | this.onPrinted, | 29 | this.onPrinted, |
30 | + this.onPrintError, | ||
30 | this.onShared, | 31 | this.onShared, |
31 | this.scrollViewDecoration, | 32 | this.scrollViewDecoration, |
32 | this.pdfPreviewPageDecoration, | 33 | this.pdfPreviewPageDecoration, |
@@ -65,12 +66,15 @@ class PdfPreview extends StatefulWidget { | @@ -65,12 +66,15 @@ class PdfPreview extends StatefulWidget { | ||
65 | /// List of page formats the user can choose | 66 | /// List of page formats the user can choose |
66 | final Map<String, PdfPageFormat>? pageFormats; | 67 | final Map<String, PdfPageFormat>? pageFormats; |
67 | 68 | ||
68 | - /// Called if an error creating the Pdf occured | 69 | + /// Widget to display if the PDF document cannot be displayed |
69 | final Widget Function(BuildContext context)? onError; | 70 | final Widget Function(BuildContext context)? onError; |
70 | 71 | ||
71 | /// Called if the user prints the pdf document | 72 | /// Called if the user prints the pdf document |
72 | final void Function(BuildContext context)? onPrinted; | 73 | final void Function(BuildContext context)? onPrinted; |
73 | 74 | ||
75 | + /// Called if an error creating the Pdf occured | ||
76 | + final void Function(BuildContext context, dynamic error)? onPrintError; | ||
77 | + | ||
74 | /// Called if the user shares the pdf document | 78 | /// Called if the user shares the pdf document |
75 | final void Function(BuildContext context)? onShared; | 79 | final void Function(BuildContext context)? onShared; |
76 | 80 | ||
@@ -514,8 +518,8 @@ class _PdfPreviewState extends State<PdfPreview> { | @@ -514,8 +518,8 @@ class _PdfPreviewState extends State<PdfPreview> { | ||
514 | widget.onPrinted!(context); | 518 | widget.onPrinted!(context); |
515 | } | 519 | } |
516 | } catch (e) { | 520 | } catch (e) { |
517 | - if (widget.onError != null) { | ||
518 | - widget.onError!(context); | 521 | + if (widget.onPrintError != null) { |
522 | + widget.onPrintError!(context, e); | ||
519 | } | 523 | } |
520 | } | 524 | } |
521 | } | 525 | } |
@@ -138,11 +138,15 @@ bool print_job::print_pdf(const gchar* name, | @@ -138,11 +138,15 @@ bool print_job::print_pdf(const gchar* name, | ||
138 | GTK_PRINT_UNIX_DIALOG(gtk_print_unix_dialog_new(name, nullptr)); | 138 | GTK_PRINT_UNIX_DIALOG(gtk_print_unix_dialog_new(name, nullptr)); |
139 | gtk_print_unix_dialog_set_manual_capabilities( | 139 | gtk_print_unix_dialog_set_manual_capabilities( |
140 | dialog, (GtkPrintCapabilities)(GTK_PRINT_CAPABILITY_GENERATE_PDF)); | 140 | dialog, (GtkPrintCapabilities)(GTK_PRINT_CAPABILITY_GENERATE_PDF)); |
141 | + gtk_print_unix_dialog_set_embed_page_setup(dialog, true); | ||
142 | + gtk_print_unix_dialog_set_support_selection(dialog, false); | ||
141 | 143 | ||
142 | gtk_widget_realize(GTK_WIDGET(dialog)); | 144 | gtk_widget_realize(GTK_WIDGET(dialog)); |
143 | 145 | ||
146 | + auto loop = true; | ||
147 | + | ||
148 | + while (loop) { | ||
144 | auto response = gtk_dialog_run(GTK_DIALOG(dialog)); | 149 | auto response = gtk_dialog_run(GTK_DIALOG(dialog)); |
145 | - gtk_widget_hide(GTK_WIDGET(dialog)); | ||
146 | 150 | ||
147 | switch (response) { | 151 | switch (response) { |
148 | case GTK_RESPONSE_OK: { | 152 | case GTK_RESPONSE_OK: { |
@@ -150,19 +154,20 @@ bool print_job::print_pdf(const gchar* name, | @@ -150,19 +154,20 @@ bool print_job::print_pdf(const gchar* name, | ||
150 | GTK_PRINT_UNIX_DIALOG(dialog)); | 154 | GTK_PRINT_UNIX_DIALOG(dialog)); |
151 | settings = | 155 | settings = |
152 | gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog)); | 156 | gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(dialog)); |
153 | - setup = | ||
154 | - gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(dialog)); | 157 | + setup = gtk_print_unix_dialog_get_page_setup( |
158 | + GTK_PRINT_UNIX_DIALOG(dialog)); | ||
155 | gtk_widget_destroy(GTK_WIDGET(dialog)); | 159 | gtk_widget_destroy(GTK_WIDGET(dialog)); |
160 | + loop = false; | ||
156 | } break; | 161 | } break; |
157 | - case GTK_RESPONSE_DELETE_EVENT: // Fall through. | ||
158 | - case GTK_RESPONSE_CANCEL: // Cancel | ||
159 | case GTK_RESPONSE_APPLY: // Preview | 162 | case GTK_RESPONSE_APPLY: // Preview |
160 | - default: | 163 | + break; |
164 | + default: // Cancel | ||
161 | gtk_widget_destroy(GTK_WIDGET(dialog)); | 165 | gtk_widget_destroy(GTK_WIDGET(dialog)); |
162 | on_completed(this, false, nullptr); | 166 | on_completed(this, false, nullptr); |
163 | return true; | 167 | return true; |
164 | } | 168 | } |
165 | } | 169 | } |
170 | + } | ||
166 | 171 | ||
167 | if (!gtk_printer_accepts_pdf(_printer)) { | 172 | if (!gtk_printer_accepts_pdf(_printer)) { |
168 | on_completed(this, false, "This printer does not accept PDF jobs"); | 173 | on_completed(this, false, "This printer does not accept PDF jobs"); |
@@ -172,8 +177,8 @@ bool print_job::print_pdf(const gchar* name, | @@ -172,8 +177,8 @@ bool print_job::print_pdf(const gchar* name, | ||
172 | return false; | 177 | return false; |
173 | } | 178 | } |
174 | 179 | ||
175 | - auto _width = gtk_page_setup_get_page_width(setup, GTK_UNIT_POINTS); | ||
176 | - auto _height = gtk_page_setup_get_page_height(setup, GTK_UNIT_POINTS); | 180 | + auto _width = gtk_page_setup_get_paper_width(setup, GTK_UNIT_POINTS); |
181 | + auto _height = gtk_page_setup_get_paper_height(setup, GTK_UNIT_POINTS); | ||
177 | auto _marginLeft = gtk_page_setup_get_left_margin(setup, GTK_UNIT_POINTS); | 182 | auto _marginLeft = gtk_page_setup_get_left_margin(setup, GTK_UNIT_POINTS); |
178 | auto _marginTop = gtk_page_setup_get_top_margin(setup, GTK_UNIT_POINTS); | 183 | auto _marginTop = gtk_page_setup_get_top_margin(setup, GTK_UNIT_POINTS); |
179 | auto _marginRight = gtk_page_setup_get_right_margin(setup, GTK_UNIT_POINTS); | 184 | auto _marginRight = gtk_page_setup_get_right_margin(setup, GTK_UNIT_POINTS); |
@@ -71,7 +71,7 @@ std::wstring fromUtf8(std::string str) { | @@ -71,7 +71,7 @@ std::wstring fromUtf8(std::string str) { | ||
71 | } | 71 | } |
72 | 72 | ||
73 | PrintJob::PrintJob(Printing* printing, int index) | 73 | PrintJob::PrintJob(Printing* printing, int index) |
74 | - : printing(printing), index(index) {} | 74 | + : printing{printing}, index{index} {} |
75 | 75 | ||
76 | bool PrintJob::printPdf(std::string name, std::string printer) { | 76 | bool PrintJob::printPdf(std::string name, std::string printer) { |
77 | documentName = name; | 77 | documentName = name; |
@@ -102,11 +102,18 @@ bool PrintJob::printPdf(std::string name, std::string printer) { | @@ -102,11 +102,18 @@ bool PrintJob::printPdf(std::string name, std::string printer) { | ||
102 | 102 | ||
103 | auto r = PrintDlg(&pd); | 103 | auto r = PrintDlg(&pd); |
104 | 104 | ||
105 | - if (r == 1) { | 105 | + if (r != 1) { |
106 | + printing->onCompleted(this, false, ""); | ||
107 | + DeleteDC(hDC); | ||
108 | + GlobalFree(hDevNames); | ||
109 | + ClosePrinter(hDevMode); | ||
110 | + return true; | ||
111 | + } | ||
112 | + | ||
106 | hDC = pd.hDC; | 113 | hDC = pd.hDC; |
107 | hDevMode = pd.hDevMode; | 114 | hDevMode = pd.hDevMode; |
108 | hDevNames = pd.hDevNames; | 115 | hDevNames = pd.hDevNames; |
109 | - } | 116 | + |
110 | } else { | 117 | } else { |
111 | hDC = CreateDC(TEXT("WINSPOOL"), fromUtf8(printer).c_str(), NULL, NULL); | 118 | hDC = CreateDC(TEXT("WINSPOOL"), fromUtf8(printer).c_str(), NULL, NULL); |
112 | if (!hDC) { | 119 | if (!hDC) { |
@@ -235,6 +242,8 @@ void PrintJob::writeJob(std::vector<uint8_t> data) { | @@ -235,6 +242,8 @@ void PrintJob::writeJob(std::vector<uint8_t> data) { | ||
235 | DeleteDC(hDC); | 242 | DeleteDC(hDC); |
236 | GlobalFree(hDevNames); | 243 | GlobalFree(hDevNames); |
237 | ClosePrinter(hDevMode); | 244 | ClosePrinter(hDevMode); |
245 | + | ||
246 | + printing->onCompleted(this, true, ""); | ||
238 | } | 247 | } |
239 | 248 | ||
240 | void PrintJob::cancelJob(std::string error) {} | 249 | void PrintJob::cancelJob(std::string error) {} |
@@ -55,7 +55,7 @@ void Printing::onPageRasterEnd(PrintJob* job) { | @@ -55,7 +55,7 @@ void Printing::onPageRasterEnd(PrintJob* job) { | ||
55 | 55 | ||
56 | class OnLayoutResult : public flutter::MethodResult<flutter::EncodableValue> { | 56 | class OnLayoutResult : public flutter::MethodResult<flutter::EncodableValue> { |
57 | public: | 57 | public: |
58 | - OnLayoutResult(PrintJob* job) : job(job) {} | 58 | + OnLayoutResult(PrintJob* job) : job{job} {} |
59 | 59 | ||
60 | private: | 60 | private: |
61 | PrintJob* job; | 61 | PrintJob* job; |
-
Please register or login to post a comment