gtk4/subclass/
cell_editable.rs1use glib::translate::*;
7
8use crate::{CellEditable, ffi, prelude::*, subclass::prelude::*};
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 unsafe {
98 let instance = &*(cell_editable as *mut T::Instance);
99 let imp = instance.imp();
100
101 imp.editing_done()
102 }
103}
104
105unsafe extern "C" fn cell_editable_remove_widget<T: CellEditableImpl>(
106 cell_editable: *mut ffi::GtkCellEditable,
107) {
108 unsafe {
109 let instance = &*(cell_editable as *mut T::Instance);
110 let imp = instance.imp();
111
112 imp.remove_widget()
113 }
114}
115
116unsafe extern "C" fn cell_editable_start_editing<T: CellEditableImpl>(
117 cell_editable: *mut ffi::GtkCellEditable,
118 eventptr: *mut gdk::ffi::GdkEvent,
119) {
120 unsafe {
121 let instance = &*(cell_editable as *mut T::Instance);
122 let imp = instance.imp();
123 let event: Borrowed<Option<gdk::Event>> = from_glib_borrow(eventptr);
124 imp.start_editing(event.as_ref().as_ref())
125 }
126}