libpanel/subclass/
frame_header.rs1use 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}