1use glib::{translate::*, value::FromValue, Value};
4
5use crate::{ffi, prelude::*, CellArea, CellRenderer};
6
7#[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 #[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 {}