1use glib::translate::*;
7
8use crate::{
9 ffi, prelude::*, subclass::prelude::*, PageSetup, PrintContext, PrintOperation,
10 PrintOperationPreview, PrintOperationResult, PrintSettings, Widget, Window,
11};
12
13pub trait PrintOperationImpl:
14 ObjectImpl + ObjectSubclass<Type: IsA<PrintOperation> + IsA<PrintOperationPreview>>
15{
16 fn begin_print(&self, context: &PrintContext) {
19 self.parent_begin_print(context)
20 }
21
22 fn create_custom_widget(&self) -> Option<Widget> {
24 self.parent_create_custom_widget()
25 }
26
27 fn custom_widget_apply(&self, widget: &Widget) {
30 self.parent_custom_widget_apply(widget)
31 }
32
33 fn done(&self, result: PrintOperationResult) {
36 self.parent_done(result)
37 }
38
39 fn draw_page(&self, context: &PrintContext, page_nr: i32) {
41 self.parent_draw_page(context, page_nr)
42 }
43
44 fn end_print(&self, context: &PrintContext) {
46 self.parent_end_print(context)
47 }
48
49 fn paginate(&self, context: &PrintContext) -> bool {
52 self.parent_paginate(context)
53 }
54
55 fn preview(
58 &self,
59 preview: &PrintOperationPreview,
60 context: &PrintContext,
61 parent: Option<&Window>,
62 ) -> bool {
63 self.parent_preview(preview, context, parent)
64 }
65
66 fn request_page_setup(&self, context: &PrintContext, page_nr: i32, setup: &PageSetup) {
69 self.parent_request_page_setup(context, page_nr, setup)
70 }
71
72 fn status_changed(&self) {
75 self.parent_status_changed()
76 }
77
78 fn update_custom_widget(&self, widget: &Widget, setup: &PageSetup, settings: &PrintSettings) {
80 self.parent_update_custom_widget(widget, setup, settings)
81 }
82}
83
84pub trait PrintOperationImplExt: PrintOperationImpl {
85 fn parent_begin_print(&self, context: &PrintContext) {
86 unsafe {
87 let data = Self::type_data();
88 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
89 if let Some(f) = (*parent_class).begin_print {
90 f(
91 self.obj()
92 .unsafe_cast_ref::<PrintOperation>()
93 .to_glib_none()
94 .0,
95 context.to_glib_none().0,
96 )
97 }
98 }
99 }
100
101 fn parent_create_custom_widget(&self) -> Option<Widget> {
102 unsafe {
103 let data = Self::type_data();
104 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
105 if let Some(f) = (*parent_class).create_custom_widget {
106 let ret = f(self
107 .obj()
108 .unsafe_cast_ref::<PrintOperation>()
109 .to_glib_none()
110 .0);
111 Some(from_glib_full(ret))
112 } else {
113 None
114 }
115 }
116 }
117
118 fn parent_custom_widget_apply(&self, widget: &Widget) {
119 unsafe {
120 let data = Self::type_data();
121 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
122 if let Some(f) = (*parent_class).custom_widget_apply {
123 f(
124 self.obj()
125 .unsafe_cast_ref::<PrintOperation>()
126 .to_glib_none()
127 .0,
128 widget.to_glib_none().0,
129 );
130 }
131 }
132 }
133
134 fn parent_done(&self, result: PrintOperationResult) {
135 unsafe {
136 let data = Self::type_data();
137 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
138 if let Some(f) = (*parent_class).done {
139 f(
140 self.obj()
141 .unsafe_cast_ref::<PrintOperation>()
142 .to_glib_none()
143 .0,
144 result.into_glib(),
145 );
146 }
147 }
148 }
149
150 fn parent_draw_page(&self, context: &PrintContext, page_nr: i32) {
151 unsafe {
152 let data = Self::type_data();
153 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
154 if let Some(f) = (*parent_class).draw_page {
155 f(
156 self.obj()
157 .unsafe_cast_ref::<PrintOperation>()
158 .to_glib_none()
159 .0,
160 context.to_glib_none().0,
161 page_nr,
162 );
163 }
164 }
165 }
166
167 fn parent_end_print(&self, context: &PrintContext) {
168 unsafe {
169 let data = Self::type_data();
170 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
171 if let Some(f) = (*parent_class).end_print {
172 f(
173 self.obj()
174 .unsafe_cast_ref::<PrintOperation>()
175 .to_glib_none()
176 .0,
177 context.to_glib_none().0,
178 );
179 }
180 }
181 }
182
183 fn parent_paginate(&self, context: &PrintContext) -> bool {
185 unsafe {
186 let data = Self::type_data();
187 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
188 if let Some(f) = (*parent_class).paginate {
189 from_glib(f(
190 self.obj()
191 .unsafe_cast_ref::<PrintOperation>()
192 .to_glib_none()
193 .0,
194 context.to_glib_none().0,
195 ))
196 } else {
197 true
199 }
200 }
201 }
202
203 fn parent_preview(
205 &self,
206 preview: &PrintOperationPreview,
207 context: &PrintContext,
208 parent: Option<&Window>,
209 ) -> bool {
210 unsafe {
211 let data = Self::type_data();
212 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
213 if let Some(f) = (*parent_class).preview {
214 from_glib(f(
215 self.obj()
216 .unsafe_cast_ref::<PrintOperation>()
217 .to_glib_none()
218 .0,
219 preview.to_glib_none().0,
220 context.to_glib_none().0,
221 parent.to_glib_none().0,
222 ))
223 } else {
224 false
226 }
227 }
228 }
229
230 fn parent_request_page_setup(&self, context: &PrintContext, page_nr: i32, setup: &PageSetup) {
231 unsafe {
232 let data = Self::type_data();
233 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
234 if let Some(f) = (*parent_class).request_page_setup {
235 f(
236 self.obj()
237 .unsafe_cast_ref::<PrintOperation>()
238 .to_glib_none()
239 .0,
240 context.to_glib_none().0,
241 page_nr,
242 setup.to_glib_none().0,
243 );
244 }
245 }
246 }
247
248 fn parent_status_changed(&self) {
249 unsafe {
250 let data = Self::type_data();
251 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
252 if let Some(f) = (*parent_class).status_changed {
253 f(self
254 .obj()
255 .unsafe_cast_ref::<PrintOperation>()
256 .to_glib_none()
257 .0);
258 }
259 }
260 }
261
262 fn parent_update_custom_widget(
263 &self,
264 widget: &Widget,
265 setup: &PageSetup,
266 settings: &PrintSettings,
267 ) {
268 unsafe {
269 let data = Self::type_data();
270 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkPrintOperationClass;
271 if let Some(f) = (*parent_class).update_custom_widget {
272 f(
273 self.obj()
274 .unsafe_cast_ref::<PrintOperation>()
275 .to_glib_none()
276 .0,
277 widget.to_glib_none().0,
278 setup.to_glib_none().0,
279 settings.to_glib_none().0,
280 );
281 }
282 }
283 }
284}
285
286impl<T: PrintOperationImpl> PrintOperationImplExt for T {}
287
288unsafe impl<T: PrintOperationImpl> IsSubclassable<T> for PrintOperation {
289 fn class_init(class: &mut glib::Class<Self>) {
290 Self::parent_class_init::<T>(class);
291
292 let klass = class.as_mut();
293 klass.begin_print = Some(print_operation_begin_print::<T>);
294 klass.create_custom_widget = Some(print_operation_create_custom_widget::<T>);
295 klass.custom_widget_apply = Some(print_operation_custom_widget_apply::<T>);
296 klass.done = Some(print_operation_done::<T>);
297 klass.draw_page = Some(print_operation_draw_page::<T>);
298 klass.end_print = Some(print_operation_end_print::<T>);
299 klass.request_page_setup = Some(print_operation_request_page_setup::<T>);
300 klass.status_changed = Some(print_operation_status_changed::<T>);
301 klass.update_custom_widget = Some(print_operation_update_custom_widget::<T>);
302 }
303}
304
305unsafe extern "C" fn print_operation_begin_print<T: PrintOperationImpl>(
306 ptr: *mut ffi::GtkPrintOperation,
307 contextptr: *mut ffi::GtkPrintContext,
308) {
309 let instance = &*(ptr as *mut T::Instance);
310 let imp = instance.imp();
311 let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
312
313 imp.begin_print(&context)
314}
315
316unsafe extern "C" fn print_operation_create_custom_widget<T: PrintOperationImpl>(
317 ptr: *mut ffi::GtkPrintOperation,
318) -> *mut ffi::GtkWidget {
319 let instance = &*(ptr as *mut T::Instance);
320 let imp = instance.imp();
321
322 imp.create_custom_widget().into_glib_ptr()
323}
324
325unsafe extern "C" fn print_operation_custom_widget_apply<T: PrintOperationImpl>(
326 ptr: *mut ffi::GtkPrintOperation,
327 widgetptr: *mut ffi::GtkWidget,
328) {
329 let instance = &*(ptr as *mut T::Instance);
330 let imp = instance.imp();
331 let widget: Borrowed<Widget> = from_glib_borrow(widgetptr);
332
333 imp.custom_widget_apply(&widget)
334}
335
336unsafe extern "C" fn print_operation_done<T: PrintOperationImpl>(
337 ptr: *mut ffi::GtkPrintOperation,
338 resultptr: ffi::GtkPrintOperationResult,
339) {
340 let instance = &*(ptr as *mut T::Instance);
341 let imp = instance.imp();
342
343 imp.done(from_glib(resultptr))
344}
345
346unsafe extern "C" fn print_operation_draw_page<T: PrintOperationImpl>(
347 ptr: *mut ffi::GtkPrintOperation,
348 contextptr: *mut ffi::GtkPrintContext,
349 page_nr: i32,
350) {
351 let instance = &*(ptr as *mut T::Instance);
352 let imp = instance.imp();
353 let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
354
355 imp.draw_page(&context, page_nr)
356}
357
358unsafe extern "C" fn print_operation_end_print<T: PrintOperationImpl>(
359 ptr: *mut ffi::GtkPrintOperation,
360 contextptr: *mut ffi::GtkPrintContext,
361) {
362 let instance = &*(ptr as *mut T::Instance);
363 let imp = instance.imp();
364 let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
365
366 imp.end_print(&context)
367}
368
369unsafe extern "C" fn print_operation_request_page_setup<T: PrintOperationImpl>(
370 ptr: *mut ffi::GtkPrintOperation,
371 contextptr: *mut ffi::GtkPrintContext,
372 page_nr: i32,
373 setupptr: *mut ffi::GtkPageSetup,
374) {
375 let instance = &*(ptr as *mut T::Instance);
376 let imp = instance.imp();
377 let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
378 let setup: Borrowed<PageSetup> = from_glib_borrow(setupptr);
379
380 imp.request_page_setup(&context, page_nr, &setup)
381}
382
383unsafe extern "C" fn print_operation_status_changed<T: PrintOperationImpl>(
384 ptr: *mut ffi::GtkPrintOperation,
385) {
386 let instance = &*(ptr as *mut T::Instance);
387 let imp = instance.imp();
388
389 imp.status_changed()
390}
391
392unsafe extern "C" fn print_operation_update_custom_widget<T: PrintOperationImpl>(
393 ptr: *mut ffi::GtkPrintOperation,
394 widgetptr: *mut ffi::GtkWidget,
395 setupptr: *mut ffi::GtkPageSetup,
396 settingsptr: *mut ffi::GtkPrintSettings,
397) {
398 let instance = &*(ptr as *mut T::Instance);
399 let imp = instance.imp();
400 let widget: Borrowed<Widget> = from_glib_borrow(widgetptr);
401 let setup: Borrowed<PageSetup> = from_glib_borrow(setupptr);
402 let settings: Borrowed<PrintSettings> = from_glib_borrow(settingsptr);
403
404 imp.update_custom_widget(&widget, &setup, &settings)
405}