gtk4/subclass/
native_dialog.rs
1use 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) {
15 self.parent_response(response)
16 }
17
18 fn show(&self) {
26 self.parent_show()
27 }
28
29 fn hide(&self) {
37 self.parent_hide()
38 }
39}
40
41#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
42#[allow(deprecated)]
43pub trait NativeDialogImplExt: NativeDialogImpl {
44 fn parent_response(&self, response: ResponseType) {
45 unsafe {
46 let data = Self::type_data();
47 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkNativeDialogClass;
48 if let Some(f) = (*parent_class).response {
49 f(
50 self.obj()
51 .unsafe_cast_ref::<NativeDialog>()
52 .to_glib_none()
53 .0,
54 response.into_glib(),
55 )
56 }
57 }
58 }
59
60 fn parent_show(&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 .show
66 .expect("No parent class impl for \"show\"");
67 f(self
68 .obj()
69 .unsafe_cast_ref::<NativeDialog>()
70 .to_glib_none()
71 .0)
72 }
73 }
74
75 fn parent_hide(&self) {
76 unsafe {
77 let data = Self::type_data();
78 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkNativeDialogClass;
79 let f = (*parent_class)
80 .hide
81 .expect("No parent class impl for \"hide\"");
82 f(self
83 .obj()
84 .unsafe_cast_ref::<NativeDialog>()
85 .to_glib_none()
86 .0)
87 }
88 }
89}
90
91impl<T: NativeDialogImpl> NativeDialogImplExt for T {}
92
93unsafe impl<T: NativeDialogImpl> IsSubclassable<T> for NativeDialog {
94 fn class_init(class: &mut glib::Class<Self>) {
95 Self::parent_class_init::<T>(class);
96
97 assert_initialized_main_thread!();
98
99 let klass = class.as_mut();
100 klass.response = Some(dialog_response::<T>);
101 klass.show = Some(dialog_show::<T>);
102 klass.hide = Some(dialog_hide::<T>);
103 }
104}
105
106unsafe extern "C" fn dialog_response<T: NativeDialogImpl>(
107 ptr: *mut ffi::GtkNativeDialog,
108 responseptr: i32,
109) {
110 let instance = &*(ptr as *mut T::Instance);
111 let imp = instance.imp();
112 let res: ResponseType = from_glib(responseptr);
113
114 imp.response(res)
115}
116
117unsafe extern "C" fn dialog_show<T: NativeDialogImpl>(ptr: *mut ffi::GtkNativeDialog) {
118 let instance = &*(ptr as *mut T::Instance);
119 let imp = instance.imp();
120
121 imp.show()
122}
123
124unsafe extern "C" fn dialog_hide<T: NativeDialogImpl>(ptr: *mut ffi::GtkNativeDialog) {
125 let instance = &*(ptr as *mut T::Instance);
126 let imp = instance.imp();
127
128 imp.hide()
129}