gtk4/subclass/
tree_drag_dest.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for implementing the [`TreeDragDest`](crate::TreeDragDest)
5//! interface.
6
7use 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}