libadwaita/subclass/
navigation_page.rs1use 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}