gtk4/subclass/
cell_renderer_text.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 subclassing
5//! [`CellRendererText`](crate::CellRendererText).
6
7use glib::{translate::*, GString};
8
9use crate::{ffi, prelude::*, subclass::prelude::*, CellRendererText};
10
11#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
12#[allow(deprecated)]
13pub trait CellRendererTextImpl: CellRendererTextImplExt + CellRendererImpl {
14    fn edited(&self, path: &str, new_text: &str) {
15        self.parent_edited(path, new_text);
16    }
17}
18
19mod sealed {
20    pub trait Sealed {}
21    impl<T: super::CellRendererTextImplExt> Sealed for T {}
22}
23
24#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
25#[allow(deprecated)]
26pub trait CellRendererTextImplExt: sealed::Sealed + ObjectSubclass {
27    fn parent_edited(&self, path: &str, new_text: &str) {
28        unsafe {
29            let data = Self::type_data();
30            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkCellRendererTextClass;
31            if let Some(f) = (*parent_class).edited {
32                f(
33                    self.obj()
34                        .unsafe_cast_ref::<CellRendererText>()
35                        .to_glib_none()
36                        .0,
37                    path.to_glib_none().0,
38                    new_text.to_glib_none().0,
39                )
40            }
41        }
42    }
43}
44
45impl<T: CellRendererTextImpl> CellRendererTextImplExt for T {}
46
47unsafe impl<T: CellRendererTextImpl> IsSubclassable<T> for CellRendererText {
48    fn class_init(class: &mut ::glib::Class<Self>) {
49        Self::parent_class_init::<T>(class);
50
51        let klass = class.as_mut();
52        klass.edited = Some(cell_renderer_text_edited::<T>);
53    }
54}
55
56unsafe extern "C" fn cell_renderer_text_edited<T: CellRendererTextImpl>(
57    ptr: *mut ffi::GtkCellRendererText,
58    path: *const libc::c_char,
59    new_text: *const libc::c_char,
60) {
61    let instance = &*(ptr as *mut T::Instance);
62    let imp = instance.imp();
63
64    imp.edited(
65        &GString::from_glib_borrow(path),
66        &GString::from_glib_borrow(new_text),
67    )
68}