gtk4/subclass/
print_operation.rs

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