gtk4/subclass/
cell_editable.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 [`CellEditable`](crate::CellEditable)
5//! interface.
6
7use glib::translate::*;
8
9use crate::{ffi, prelude::*, subclass::prelude::*, CellEditable};
10
11#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
12#[allow(deprecated)]
13pub trait CellEditableImpl: ObjectImpl {
14    fn editing_done(&self) {
15        self.parent_editing_done()
16    }
17
18    fn remove_widget(&self) {
19        self.parent_remove_widget()
20    }
21
22    fn start_editing(&self, event: Option<&gdk::Event>) {
23        self.parent_start_editing(event)
24    }
25}
26
27mod sealed {
28    pub trait Sealed {}
29    impl<T: super::CellEditableImplExt> Sealed for T {}
30}
31
32#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
33#[allow(deprecated)]
34pub trait CellEditableImplExt: sealed::Sealed + ObjectSubclass {
35    fn parent_editing_done(&self) {
36        unsafe {
37            let type_data = Self::type_data();
38            let parent_iface = type_data.as_ref().parent_interface::<CellEditable>()
39                as *const ffi::GtkCellEditableIface;
40
41            if let Some(f) = (*parent_iface).editing_done {
42                f(self
43                    .obj()
44                    .unsafe_cast_ref::<CellEditable>()
45                    .to_glib_none()
46                    .0);
47            }
48        }
49    }
50
51    fn parent_remove_widget(&self) {
52        unsafe {
53            let type_data = Self::type_data();
54            let parent_iface = type_data.as_ref().parent_interface::<CellEditable>()
55                as *const ffi::GtkCellEditableIface;
56
57            if let Some(f) = (*parent_iface).remove_widget {
58                f(self
59                    .obj()
60                    .unsafe_cast_ref::<CellEditable>()
61                    .to_glib_none()
62                    .0);
63            }
64        }
65    }
66
67    fn parent_start_editing(&self, event: Option<&gdk::Event>) {
68        unsafe {
69            let type_data = Self::type_data();
70            let parent_iface = type_data.as_ref().parent_interface::<CellEditable>()
71                as *const ffi::GtkCellEditableIface;
72
73            if let Some(f) = (*parent_iface).start_editing {
74                f(
75                    self.obj()
76                        .unsafe_cast_ref::<CellEditable>()
77                        .to_glib_none()
78                        .0,
79                    event.to_glib_none().0,
80                );
81            }
82        }
83    }
84}
85
86impl<T: CellEditableImpl> CellEditableImplExt for T {}
87
88unsafe impl<T: CellEditableImpl> IsImplementable<T> for CellEditable {
89    fn interface_init(iface: &mut glib::Interface<Self>) {
90        let iface = iface.as_mut();
91
92        assert_initialized_main_thread!();
93
94        iface.editing_done = Some(cell_editable_editing_done::<T>);
95        iface.remove_widget = Some(cell_editable_remove_widget::<T>);
96        iface.start_editing = Some(cell_editable_start_editing::<T>);
97    }
98}
99
100unsafe extern "C" fn cell_editable_editing_done<T: CellEditableImpl>(
101    cell_editable: *mut ffi::GtkCellEditable,
102) {
103    let instance = &*(cell_editable as *mut T::Instance);
104    let imp = instance.imp();
105
106    imp.editing_done()
107}
108
109unsafe extern "C" fn cell_editable_remove_widget<T: CellEditableImpl>(
110    cell_editable: *mut ffi::GtkCellEditable,
111) {
112    let instance = &*(cell_editable as *mut T::Instance);
113    let imp = instance.imp();
114
115    imp.remove_widget()
116}
117
118unsafe extern "C" fn cell_editable_start_editing<T: CellEditableImpl>(
119    cell_editable: *mut ffi::GtkCellEditable,
120    eventptr: *mut gdk::ffi::GdkEvent,
121) {
122    let instance = &*(cell_editable as *mut T::Instance);
123    let imp = instance.imp();
124    let event: Borrowed<Option<gdk::Event>> = from_glib_borrow(eventptr);
125    imp.start_editing(event.as_ref().as_ref())
126}