gtk4/subclass/
native_dialog.rs1use glib::translate::*;
7
8use crate::{ffi, prelude::*, subclass::prelude::*, NativeDialog, ResponseType};
9
10#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
11#[allow(deprecated)]
12pub trait NativeDialogImpl: ObjectImpl + ObjectSubclass<Type: IsA<NativeDialog>> {
13 fn response(&self, response: ResponseType) {
14 self.parent_response(response)
15 }
16
17 fn show(&self) {
18 self.parent_show()
19 }
20
21 fn hide(&self) {
22 self.parent_hide()
23 }
24}
25
26#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
27#[allow(deprecated)]
28pub trait NativeDialogImplExt: NativeDialogImpl {
29 fn parent_response(&self, response: ResponseType) {
30 unsafe {
31 let data = Self::type_data();
32 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkNativeDialogClass;
33 if let Some(f) = (*parent_class).response {
34 f(
35 self.obj()
36 .unsafe_cast_ref::<NativeDialog>()
37 .to_glib_none()
38 .0,
39 response.into_glib(),
40 )
41 }
42 }
43 }
44
45 fn parent_show(&self) {
46 unsafe {
47 let data = Self::type_data();
48 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkNativeDialogClass;
49 let f = (*parent_class)
50 .show
51 .expect("No parent class impl for \"show\"");
52 f(self
53 .obj()
54 .unsafe_cast_ref::<NativeDialog>()
55 .to_glib_none()
56 .0)
57 }
58 }
59
60 fn parent_hide(&self) {
61 unsafe {
62 let data = Self::type_data();
63 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkNativeDialogClass;
64 let f = (*parent_class)
65 .hide
66 .expect("No parent class impl for \"hide\"");
67 f(self
68 .obj()
69 .unsafe_cast_ref::<NativeDialog>()
70 .to_glib_none()
71 .0)
72 }
73 }
74}
75
76impl<T: NativeDialogImpl> NativeDialogImplExt for T {}
77
78unsafe impl<T: NativeDialogImpl> IsSubclassable<T> for NativeDialog {
79 fn class_init(class: &mut glib::Class<Self>) {
80 Self::parent_class_init::<T>(class);
81
82 assert_initialized_main_thread!();
83
84 let klass = class.as_mut();
85 klass.response = Some(dialog_response::<T>);
86 klass.show = Some(dialog_show::<T>);
87 klass.hide = Some(dialog_hide::<T>);
88 }
89}
90
91unsafe extern "C" fn dialog_response<T: NativeDialogImpl>(
92 ptr: *mut ffi::GtkNativeDialog,
93 responseptr: i32,
94) {
95 let instance = &*(ptr as *mut T::Instance);
96 let imp = instance.imp();
97 let res: ResponseType = from_glib(responseptr);
98
99 imp.response(res)
100}
101
102unsafe extern "C" fn dialog_show<T: NativeDialogImpl>(ptr: *mut ffi::GtkNativeDialog) {
103 let instance = &*(ptr as *mut T::Instance);
104 let imp = instance.imp();
105
106 imp.show()
107}
108
109unsafe extern "C" fn dialog_hide<T: NativeDialogImpl>(ptr: *mut ffi::GtkNativeDialog) {
110 let instance = &*(ptr as *mut T::Instance);
111 let imp = instance.imp();
112
113 imp.hide()
114}