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) {
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 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 true
181 }
182 }
183 }
184
185 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 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}