libpanel/subclass/
frame_header.rs

1use crate::Widget;
2use crate::{prelude::*, FrameHeader};
3use glib::translate::*;
4use gtk::subclass::prelude::*;
5
6pub trait FrameHeaderImpl: WidgetImpl {
7    fn page_changed(&self, widget: Option<&Widget>) {
8        FrameHeaderImplExt::parent_page_changed(self, widget);
9    }
10    fn can_drop(&self, widget: &Widget) -> bool {
11        FrameHeaderImplExt::parent_can_drop(self, widget)
12    }
13    fn add_prefix(&self, priority: i32, widget: &Widget) {
14        FrameHeaderImplExt::parent_add_prefix(self, priority, widget);
15    }
16    fn add_suffix(&self, priority: i32, widget: &Widget) {
17        FrameHeaderImplExt::parent_add_suffix(self, priority, widget);
18    }
19}
20
21pub trait FrameHeaderImplExt: ObjectSubclass {
22    fn parent_page_changed(&self, widget: Option<&Widget>);
23    fn parent_can_drop(&self, widget: &Widget) -> bool;
24    fn parent_add_prefix(&self, priority: i32, widget: &Widget);
25    fn parent_add_suffix(&self, priority: i32, widget: &Widget);
26}
27
28impl<T: FrameHeaderImpl> FrameHeaderImplExt for T {
29    fn parent_page_changed(&self, widget: Option<&Widget>) {
30        unsafe {
31            let data = T::type_data();
32            let parent_iface = data.as_ref().parent_interface::<FrameHeader>()
33                as *const ffi::PanelFrameHeaderInterface;
34            if let Some(f) = (*parent_iface).page_changed {
35                f(
36                    self.obj().unsafe_cast_ref::<FrameHeader>().to_glib_none().0,
37                    widget
38                        .map(|w| w.unsafe_cast_ref::<Widget>())
39                        .to_glib_none()
40                        .0,
41                );
42            }
43        }
44    }
45    fn parent_can_drop(&self, widget: &Widget) -> bool {
46        unsafe {
47            let data = T::type_data();
48            let parent_iface = data.as_ref().parent_interface::<FrameHeader>()
49                as *const ffi::PanelFrameHeaderInterface;
50            if let Some(f) = (*parent_iface).can_drop {
51                return f(
52                    self.obj().unsafe_cast_ref::<FrameHeader>().to_glib_none().0,
53                    widget.unsafe_cast_ref::<Widget>().to_glib_none().0,
54                ) != 0;
55            }
56            false
57        }
58    }
59    fn parent_add_prefix(&self, priority: i32, widget: &Widget) {
60        unsafe {
61            let data = T::type_data();
62            let parent_iface = data.as_ref().parent_interface::<FrameHeader>()
63                as *const ffi::PanelFrameHeaderInterface;
64            if let Some(f) = (*parent_iface).add_prefix {
65                f(
66                    self.obj().unsafe_cast_ref::<FrameHeader>().to_glib_none().0,
67                    priority,
68                    widget.unsafe_cast_ref::<gtk::Widget>().to_glib_none().0,
69                );
70            }
71        }
72    }
73    fn parent_add_suffix(&self, priority: i32, widget: &Widget) {
74        unsafe {
75            let data = T::type_data();
76            let parent_iface = data.as_ref().parent_interface::<FrameHeader>()
77                as *const ffi::PanelFrameHeaderInterface;
78            if let Some(f) = (*parent_iface).add_suffix {
79                f(
80                    self.obj().unsafe_cast_ref::<FrameHeader>().to_glib_none().0,
81                    priority,
82                    widget.unsafe_cast_ref::<gtk::Widget>().to_glib_none().0,
83                );
84            }
85        }
86    }
87}
88
89unsafe impl<T: FrameHeaderImpl> IsImplementable<T> for FrameHeader {
90    fn interface_init(iface: &mut glib::Interface<Self>) {
91        let iface = iface.as_mut();
92        iface.page_changed = Some(frame_header_page_changed::<T>);
93        iface.can_drop = Some(frame_header_can_drop::<T>);
94        iface.add_prefix = Some(frame_header_add_prefix::<T>);
95        iface.add_suffix = Some(frame_header_add_suffix::<T>);
96    }
97}
98
99unsafe extern "C" fn frame_header_page_changed<T: FrameHeaderImpl>(
100    ptr: *mut ffi::PanelFrameHeader,
101    widget: *mut ffi::PanelWidget,
102) {
103    let instance = &*(ptr as *mut T::Instance);
104    let imp = instance.imp();
105    let widget: Option<Borrowed<Widget>> = if widget.is_null() {
106        None
107    } else {
108        Some(from_glib_borrow(widget))
109    };
110
111    FrameHeaderImpl::page_changed(imp, widget.as_ref().map(|w| w.unsafe_cast_ref()));
112}
113
114unsafe extern "C" fn frame_header_can_drop<T: FrameHeaderImpl>(
115    ptr: *mut ffi::PanelFrameHeader,
116    widget: *mut ffi::PanelWidget,
117) -> glib::ffi::gboolean {
118    let instance = &*(ptr as *mut T::Instance);
119    let imp = instance.imp();
120    let widget: Borrowed<Widget> = from_glib_borrow(widget);
121
122    FrameHeaderImpl::can_drop(imp, widget.unsafe_cast_ref()) as glib::ffi::gboolean
123}
124
125unsafe extern "C" fn frame_header_add_prefix<T: FrameHeaderImpl>(
126    ptr: *mut ffi::PanelFrameHeader,
127    priority: std::os::raw::c_int,
128    widget: *mut gtk::ffi::GtkWidget,
129) {
130    let instance = &*(ptr as *mut T::Instance);
131    let imp = instance.imp();
132    let widget: Borrowed<gtk::Widget> = from_glib_borrow(widget);
133
134    FrameHeaderImpl::add_prefix(imp, priority, widget.unsafe_cast_ref());
135}
136
137unsafe extern "C" fn frame_header_add_suffix<T: FrameHeaderImpl>(
138    ptr: *mut ffi::PanelFrameHeader,
139    priority: std::os::raw::c_int,
140    widget: *mut gtk::ffi::GtkWidget,
141) {
142    let instance = &*(ptr as *mut T::Instance);
143    let imp = instance.imp();
144    let widget: Borrowed<gtk::Widget> = from_glib_borrow(widget);
145
146    FrameHeaderImpl::add_suffix(imp, priority, widget.unsafe_cast_ref());
147}