gtk4/subclass/
native_dialog.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 [`NativeDialog`].
5
6use 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}