libadwaita/subclass/
navigation_page.rs

1use crate::{prelude::*, NavigationPage};
2use glib::subclass::prelude::*;
3use glib::translate::*;
4use gtk::subclass::prelude::WidgetImpl;
5
6pub trait NavigationPageImpl: WidgetImpl + ObjectSubclass<Type: IsA<NavigationPage>> {
7    fn hidden(&self) {
8        self.parent_hidden()
9    }
10
11    fn hiding(&self) {
12        self.parent_hiding();
13    }
14
15    fn showing(&self) {
16        self.parent_showing();
17    }
18
19    fn shown(&self) {
20        self.parent_shown();
21    }
22}
23
24pub trait NavigationPageImplExt: NavigationPageImpl {
25    fn parent_hidden(&self) {
26        unsafe {
27            let data = Self::type_data();
28            let parent_class = data.as_ref().parent_class() as *mut ffi::AdwNavigationPageClass;
29            if let Some(f) = (*parent_class).hidden {
30                f(self
31                    .obj()
32                    .unsafe_cast_ref::<NavigationPage>()
33                    .to_glib_none()
34                    .0);
35            }
36        }
37    }
38
39    fn parent_hiding(&self) {
40        unsafe {
41            let data = Self::type_data();
42            let parent_class = data.as_ref().parent_class() as *mut ffi::AdwNavigationPageClass;
43            if let Some(f) = (*parent_class).hiding {
44                f(self
45                    .obj()
46                    .unsafe_cast_ref::<NavigationPage>()
47                    .to_glib_none()
48                    .0);
49            }
50        }
51    }
52
53    fn parent_showing(&self) {
54        unsafe {
55            let data = Self::type_data();
56            let parent_class = data.as_ref().parent_class() as *mut ffi::AdwNavigationPageClass;
57            if let Some(f) = (*parent_class).showing {
58                f(self
59                    .obj()
60                    .unsafe_cast_ref::<NavigationPage>()
61                    .to_glib_none()
62                    .0);
63            }
64        }
65    }
66
67    fn parent_shown(&self) {
68        unsafe {
69            let data = Self::type_data();
70            let parent_class = data.as_ref().parent_class() as *mut ffi::AdwNavigationPageClass;
71            if let Some(f) = (*parent_class).shown {
72                f(self
73                    .obj()
74                    .unsafe_cast_ref::<NavigationPage>()
75                    .to_glib_none()
76                    .0);
77            }
78        }
79    }
80}
81
82impl<T: NavigationPageImpl> NavigationPageImplExt for T {}
83
84unsafe impl<T: NavigationPageImpl> IsSubclassable<T> for NavigationPage {
85    fn class_init(class: &mut glib::Class<Self>) {
86        Self::parent_class_init::<T>(class);
87
88        let klass = class.as_mut();
89        klass.hidden = Some(navigation_page_hidden::<T>);
90        klass.hiding = Some(navigation_page_hiding::<T>);
91        klass.showing = Some(navigation_page_showing::<T>);
92        klass.shown = Some(navigation_page_shown::<T>);
93    }
94}
95
96unsafe extern "C" fn navigation_page_hidden<T: NavigationPageImpl>(
97    ptr: *mut ffi::AdwNavigationPage,
98) {
99    let instance = unsafe { &*(ptr as *mut T::Instance) };
100    let imp = instance.imp();
101
102    imp.hidden();
103}
104
105unsafe extern "C" fn navigation_page_hiding<T: NavigationPageImpl>(
106    ptr: *mut ffi::AdwNavigationPage,
107) {
108    let instance = unsafe { &*(ptr as *mut T::Instance) };
109    let imp = instance.imp();
110
111    imp.hiding();
112}
113
114unsafe extern "C" fn navigation_page_showing<T: NavigationPageImpl>(
115    ptr: *mut ffi::AdwNavigationPage,
116) {
117    let instance = unsafe { &*(ptr as *mut T::Instance) };
118    let imp = instance.imp();
119
120    imp.showing();
121}
122
123unsafe extern "C" fn navigation_page_shown<T: NavigationPageImpl>(
124    ptr: *mut ffi::AdwNavigationPage,
125) {
126    let instance = unsafe { &*(ptr as *mut T::Instance) };
127    let imp = instance.imp();
128
129    imp.shown();
130}