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