gtk4/subclass/
tree_drag_dest.rs
1use glib::{translate::*, Value};
8
9use crate::{ffi, prelude::*, subclass::prelude::*, TreeDragDest, TreePath};
10
11#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
12#[allow(deprecated)]
13pub trait TreeDragDestImpl: ObjectImpl {
14 fn drag_data_received(&self, dest: &TreePath, value: Value) -> bool;
15 fn row_drop_possible(&self, dest: &TreePath, value: Value) -> bool;
16}
17
18mod sealed {
19 pub trait Sealed {}
20 impl<T: super::TreeDragDestImplExt> Sealed for T {}
21}
22
23#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
24#[allow(deprecated)]
25pub trait TreeDragDestImplExt: sealed::Sealed + ObjectSubclass {
26 fn parent_drag_data_received(&self, dest: &TreePath, value: Value) -> bool {
27 unsafe {
28 let type_data = Self::type_data();
29 let parent_iface = type_data.as_ref().parent_interface::<TreeDragDest>()
30 as *const ffi::GtkTreeDragDestIface;
31
32 let func = (*parent_iface)
33 .drag_data_received
34 .expect("no parent \"drag_data_received\" implementation");
35
36 from_glib(func(
37 self.obj()
38 .unsafe_cast_ref::<TreeDragDest>()
39 .to_glib_none()
40 .0,
41 mut_override(dest.to_glib_none().0),
42 value.to_glib_none().0,
43 ))
44 }
45 }
46
47 fn parent_row_drop_possible(&self, dest: &TreePath, value: Value) -> bool {
48 unsafe {
49 let type_data = Self::type_data();
50 let parent_iface = type_data.as_ref().parent_interface::<TreeDragDest>()
51 as *const ffi::GtkTreeDragDestIface;
52
53 let func = (*parent_iface)
54 .drag_data_received
55 .expect("no parent \"drag_data_received\" implementation");
56
57 from_glib(func(
58 self.obj()
59 .unsafe_cast_ref::<TreeDragDest>()
60 .to_glib_none()
61 .0,
62 mut_override(dest.to_glib_none().0),
63 value.to_glib_none().0,
64 ))
65 }
66 }
67}
68
69impl<T: TreeDragDestImpl> TreeDragDestImplExt for T {}
70
71unsafe impl<T: TreeDragDestImpl> IsImplementable<T> for TreeDragDest {
72 fn interface_init(iface: &mut glib::Interface<Self>) {
73 let iface = iface.as_mut();
74
75 assert_initialized_main_thread!();
76
77 iface.drag_data_received = Some(tree_drag_dest_drag_data_received::<T>);
78 iface.row_drop_possible = Some(tree_drag_dest_row_drop_possible::<T>);
79 }
80}
81
82unsafe extern "C" fn tree_drag_dest_drag_data_received<T: TreeDragDestImpl>(
83 tree_drag_dest: *mut ffi::GtkTreeDragDest,
84 destptr: *mut ffi::GtkTreePath,
85 valueptr: *const glib::gobject_ffi::GValue,
86) -> glib::ffi::gboolean {
87 let instance = &*(tree_drag_dest as *mut T::Instance);
88 let imp = instance.imp();
89
90 let dest: Borrowed<TreePath> = from_glib_borrow(destptr);
91 let value: Value = from_glib_none(valueptr);
92
93 imp.drag_data_received(&dest, value).into_glib()
94}
95
96unsafe extern "C" fn tree_drag_dest_row_drop_possible<T: TreeDragDestImpl>(
97 tree_drag_dest: *mut ffi::GtkTreeDragDest,
98 destptr: *mut ffi::GtkTreePath,
99 valueptr: *const glib::gobject_ffi::GValue,
100) -> glib::ffi::gboolean {
101 let instance = &*(tree_drag_dest as *mut T::Instance);
102 let imp = instance.imp();
103 let dest: Borrowed<TreePath> = from_glib_borrow(destptr);
104 let value: Value = from_glib_none(valueptr);
105
106 imp.row_drop_possible(&dest, value).into_glib()
107}