gtk4/subclass/
cell_editable.rs
1use 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}