Skip to main content

gtk4/subclass/
print_operation_preview.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 implementing the [`PrintOperationPreview`] interface.
5
6use glib::translate::*;
7
8use crate::{
9    PageSetup, PrintContext, PrintOperationPreview, ffi, prelude::*, subclass::prelude::*,
10};
11
12pub trait PrintOperationPreviewImpl:
13    ObjectImpl + ObjectSubclass<Type: IsA<PrintOperationPreview>>
14{
15    fn ready(&self, context: &PrintContext) {
16        self.parent_ready(context)
17    }
18
19    fn got_page_size(&self, context: &PrintContext, page_setup: &PageSetup) {
20        self.parent_got_page_size(context, page_setup)
21    }
22
23    fn render_page(&self, page_nr: i32);
24    fn is_selected(&self, page_nr: i32) -> bool;
25    fn end_preview(&self);
26}
27
28pub trait PrintOperationPreviewImplExt: PrintOperationPreviewImpl {
29    fn parent_ready(&self, context: &PrintContext) {
30        unsafe {
31            let type_data = Self::type_data();
32            let parent_iface = type_data
33                .as_ref()
34                .parent_interface::<PrintOperationPreview>()
35                as *const ffi::GtkPrintOperationPreviewIface;
36
37            if let Some(func) = (*parent_iface).ready {
38                func(
39                    self.obj()
40                        .unsafe_cast_ref::<PrintOperationPreview>()
41                        .to_glib_none()
42                        .0,
43                    context.to_glib_none().0,
44                );
45            }
46        }
47    }
48
49    fn parent_got_page_size(&self, context: &PrintContext, page_setup: &PageSetup) {
50        unsafe {
51            let type_data = Self::type_data();
52            let parent_iface = type_data
53                .as_ref()
54                .parent_interface::<PrintOperationPreview>()
55                as *const ffi::GtkPrintOperationPreviewIface;
56
57            if let Some(func) = (*parent_iface).got_page_size {
58                func(
59                    self.obj()
60                        .unsafe_cast_ref::<PrintOperationPreview>()
61                        .to_glib_none()
62                        .0,
63                    context.to_glib_none().0,
64                    page_setup.to_glib_none().0,
65                );
66            }
67        }
68    }
69
70    fn parent_render_page(&self, page_nr: i32) {
71        unsafe {
72            let type_data = Self::type_data();
73            let parent_iface = type_data
74                .as_ref()
75                .parent_interface::<PrintOperationPreview>()
76                as *const ffi::GtkPrintOperationPreviewIface;
77
78            if let Some(func) = (*parent_iface).render_page {
79                func(
80                    self.obj()
81                        .unsafe_cast_ref::<PrintOperationPreview>()
82                        .to_glib_none()
83                        .0,
84                    page_nr,
85                );
86            }
87        }
88    }
89
90    fn parent_is_selected(&self, page_nr: i32) -> bool {
91        unsafe {
92            let type_data = Self::type_data();
93            let parent_iface = type_data
94                .as_ref()
95                .parent_interface::<PrintOperationPreview>()
96                as *const ffi::GtkPrintOperationPreviewIface;
97            let func = (*parent_iface)
98                .is_selected
99                .expect("no parent \"is_selected\" implementation");
100
101            from_glib(func(
102                self.obj()
103                    .unsafe_cast_ref::<PrintOperationPreview>()
104                    .to_glib_none()
105                    .0,
106                page_nr,
107            ))
108        }
109    }
110
111    fn parent_end_preview(&self) {
112        unsafe {
113            let type_data = Self::type_data();
114            let parent_iface = type_data
115                .as_ref()
116                .parent_interface::<PrintOperationPreview>()
117                as *const ffi::GtkPrintOperationPreviewIface;
118
119            if let Some(func) = (*parent_iface).end_preview {
120                func(
121                    self.obj()
122                        .unsafe_cast_ref::<PrintOperationPreview>()
123                        .to_glib_none()
124                        .0,
125                );
126            }
127        }
128    }
129}
130
131impl<T: PrintOperationPreviewImpl> PrintOperationPreviewImplExt for T {}
132
133unsafe impl<T: PrintOperationPreviewImpl> IsImplementable<T> for PrintOperationPreview {
134    fn interface_init(iface: &mut glib::Interface<Self>) {
135        let iface = iface.as_mut();
136
137        assert_initialized_main_thread!();
138
139        iface.ready = Some(print_operation_preview_ready::<T>);
140        iface.got_page_size = Some(print_operation_preview_got_page_size::<T>);
141        iface.render_page = Some(print_operation_preview_render_page::<T>);
142        iface.is_selected = Some(print_operation_preview_is_selected::<T>);
143        iface.end_preview = Some(print_operation_preview_end_preview::<T>);
144    }
145}
146
147unsafe extern "C" fn print_operation_preview_ready<T: PrintOperationPreviewImpl>(
148    print_operation_preview: *mut ffi::GtkPrintOperationPreview,
149    contextptr: *mut ffi::GtkPrintContext,
150) {
151    unsafe {
152        let instance = &*(print_operation_preview as *mut T::Instance);
153        let imp = instance.imp();
154        let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
155
156        imp.ready(&context)
157    }
158}
159
160unsafe extern "C" fn print_operation_preview_got_page_size<T: PrintOperationPreviewImpl>(
161    print_operation_preview: *mut ffi::GtkPrintOperationPreview,
162    contextptr: *mut ffi::GtkPrintContext,
163    setupptr: *mut ffi::GtkPageSetup,
164) {
165    unsafe {
166        let instance = &*(print_operation_preview as *mut T::Instance);
167        let imp = instance.imp();
168
169        let context: Borrowed<PrintContext> = from_glib_borrow(contextptr);
170        let setup: Borrowed<PageSetup> = from_glib_borrow(setupptr);
171
172        imp.got_page_size(&context, &setup)
173    }
174}
175
176unsafe extern "C" fn print_operation_preview_render_page<T: PrintOperationPreviewImpl>(
177    print_operation_preview: *mut ffi::GtkPrintOperationPreview,
178    page_nr: i32,
179) {
180    unsafe {
181        let instance = &*(print_operation_preview as *mut T::Instance);
182        let imp = instance.imp();
183
184        imp.render_page(page_nr)
185    }
186}
187
188unsafe extern "C" fn print_operation_preview_is_selected<T: PrintOperationPreviewImpl>(
189    print_operation_preview: *mut ffi::GtkPrintOperationPreview,
190    page_nr: i32,
191) -> glib::ffi::gboolean {
192    unsafe {
193        let instance = &*(print_operation_preview as *mut T::Instance);
194        let imp = instance.imp();
195
196        imp.is_selected(page_nr).into_glib()
197    }
198}
199
200unsafe extern "C" fn print_operation_preview_end_preview<T: PrintOperationPreviewImpl>(
201    print_operation_preview: *mut ffi::GtkPrintOperationPreview,
202) {
203    unsafe {
204        let instance = &*(print_operation_preview as *mut T::Instance);
205        let imp = instance.imp();
206
207        imp.end_preview()
208    }
209}