[go: up one dir, main page]

gtk4/
cell_area.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{translate::*, value::FromValue, Value};
4
5use crate::{ffi, prelude::*, CellArea, CellRenderer};
6
7// rustdoc-stripper-ignore-next
8/// Trait containing manually implemented methods of
9/// [`CellArea`](crate::CellArea).
10#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
11#[allow(deprecated)]
12pub trait CellAreaExtManual: IsA<CellArea> {
13    #[doc(alias = "gtk_cell_area_add_with_properties")]
14    fn add_with_properties(
15        &self,
16        renderer: &impl IsA<CellRenderer>,
17        properties: &[(&str, &dyn ToValue)],
18    ) {
19        self.as_ref().add(renderer);
20        properties.iter().for_each(|(property_name, value)| {
21            self.cell_set(renderer, *property_name, *value);
22        });
23    }
24
25    #[doc(alias = "gtk_cell_area_cell_get_valist")]
26    #[doc(alias = "gtk_cell_area_cell_get_property")]
27    fn cell_get_value(
28        &self,
29        renderer: &impl IsA<CellRenderer>,
30        property_name: impl IntoGStr,
31    ) -> glib::Value {
32        unsafe {
33            property_name.run_with_gstr(|property_name| {
34                let cell_class = glib::Class::<CellArea>::from_type(Self::static_type()).unwrap();
35                let pspec: Option<glib::ParamSpec> =
36                    from_glib_none(ffi::gtk_cell_area_class_find_cell_property(
37                        cell_class.as_ref() as *const _ as *mut ffi::GtkCellAreaClass,
38                        property_name.as_ptr(),
39                    ));
40                let pspec = pspec.unwrap_or_else(|| {
41                    panic!("The CellArea property {property_name} doesn't exists")
42                });
43                let mut value = glib::Value::from_type(pspec.value_type());
44                ffi::gtk_cell_area_cell_get_property(
45                    self.as_ref().to_glib_none().0,
46                    renderer.as_ref().to_glib_none().0,
47                    property_name.as_ptr(),
48                    value.to_glib_none_mut().0,
49                );
50                value
51            })
52        }
53    }
54
55    // rustdoc-stripper-ignore-next
56    /// Similar to [`Self::cell_get_value`] but panics if the value is of a
57    /// different type.
58    #[doc(alias = "gtk_cell_area_cell_get_valist")]
59    #[doc(alias = "gtk_cell_area_cell_get_property")]
60    fn cell_get<V: for<'b> FromValue<'b> + 'static>(
61        &self,
62        renderer: &impl IsA<CellRenderer>,
63        property_name: impl IntoGStr,
64    ) -> V {
65        let value = self.cell_get_value(renderer, property_name);
66        value
67            .get_owned::<V>()
68            .expect("Failed to get value of renderer")
69    }
70
71    #[doc(alias = "gtk_cell_area_cell_set_valist")]
72    #[doc(alias = "gtk_cell_area_cell_set_property")]
73    fn cell_set(
74        &self,
75        renderer: &impl IsA<CellRenderer>,
76        property_name: impl IntoGStr,
77        value: impl Into<Value>,
78    ) {
79        unsafe {
80            property_name.run_with_gstr(|property_name| {
81                let cell_class = glib::Class::<CellArea>::from_type(Self::static_type()).unwrap();
82                let pspec: Option<glib::ParamSpec> =
83                    from_glib_none(ffi::gtk_cell_area_class_find_cell_property(
84                        cell_class.as_ref() as *const _ as *mut ffi::GtkCellAreaClass,
85                        property_name.as_ptr(),
86                    ));
87                let pspec = pspec.unwrap_or_else(|| {
88                    panic!("The CellArea property {property_name} doesn't exists")
89                });
90
91                let value = value.into();
92                assert!(
93                    pspec.value_type().is_a(value.type_()),
94                    "The CellArea property's value is of wrong type. Expected '{}' but got '{}'",
95                    pspec.value_type(),
96                    value.type_()
97                );
98
99                ffi::gtk_cell_area_cell_set_property(
100                    self.as_ref().to_glib_none().0,
101                    renderer.as_ref().to_glib_none().0,
102                    property_name.as_ptr(),
103                    value.to_glib_none().0,
104                );
105            })
106        }
107    }
108}
109
110impl<O: IsA<CellArea>> CellAreaExtManual for O {}