1use crate::{ffi, MenuAttributeIter, MenuLinkIter};
6use glib::{
7 object::ObjectType as _,
8 prelude::*,
9 signal::{connect_raw, SignalHandlerId},
10 translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15 #[doc(alias = "GMenuModel")]
16 pub struct MenuModel(Object<ffi::GMenuModel, ffi::GMenuModelClass>);
17
18 match fn {
19 type_ => || ffi::g_menu_model_get_type(),
20 }
21}
22
23impl MenuModel {
24 pub const NONE: Option<&'static MenuModel> = None;
25}
26
27mod sealed {
28 pub trait Sealed {}
29 impl<T: super::IsA<super::MenuModel>> Sealed for T {}
30}
31
32pub trait MenuModelExt: IsA<MenuModel> + sealed::Sealed + 'static {
33 #[doc(alias = "g_menu_model_get_item_attribute_value")]
40 #[doc(alias = "get_item_attribute_value")]
41 fn item_attribute_value(
42 &self,
43 item_index: i32,
44 attribute: &str,
45 expected_type: Option<&glib::VariantTy>,
46 ) -> Option<glib::Variant> {
47 unsafe {
48 from_glib_full(ffi::g_menu_model_get_item_attribute_value(
49 self.as_ref().to_glib_none().0,
50 item_index,
51 attribute.to_glib_none().0,
52 expected_type.to_glib_none().0,
53 ))
54 }
55 }
56
57 #[doc(alias = "g_menu_model_get_item_link")]
58 #[doc(alias = "get_item_link")]
59 #[must_use]
60 fn item_link(&self, item_index: i32, link: &str) -> Option<MenuModel> {
61 unsafe {
62 from_glib_full(ffi::g_menu_model_get_item_link(
63 self.as_ref().to_glib_none().0,
64 item_index,
65 link.to_glib_none().0,
66 ))
67 }
68 }
69
70 #[doc(alias = "g_menu_model_get_n_items")]
71 #[doc(alias = "get_n_items")]
72 fn n_items(&self) -> i32 {
73 unsafe { ffi::g_menu_model_get_n_items(self.as_ref().to_glib_none().0) }
74 }
75
76 #[doc(alias = "g_menu_model_is_mutable")]
77 fn is_mutable(&self) -> bool {
78 unsafe { from_glib(ffi::g_menu_model_is_mutable(self.as_ref().to_glib_none().0)) }
79 }
80
81 #[doc(alias = "g_menu_model_items_changed")]
82 fn items_changed(&self, position: i32, removed: i32, added: i32) {
83 unsafe {
84 ffi::g_menu_model_items_changed(
85 self.as_ref().to_glib_none().0,
86 position,
87 removed,
88 added,
89 );
90 }
91 }
92
93 #[doc(alias = "g_menu_model_iterate_item_attributes")]
94 fn iterate_item_attributes(&self, item_index: i32) -> MenuAttributeIter {
95 unsafe {
96 from_glib_full(ffi::g_menu_model_iterate_item_attributes(
97 self.as_ref().to_glib_none().0,
98 item_index,
99 ))
100 }
101 }
102
103 #[doc(alias = "g_menu_model_iterate_item_links")]
104 fn iterate_item_links(&self, item_index: i32) -> MenuLinkIter {
105 unsafe {
106 from_glib_full(ffi::g_menu_model_iterate_item_links(
107 self.as_ref().to_glib_none().0,
108 item_index,
109 ))
110 }
111 }
112
113 #[doc(alias = "items-changed")]
114 fn connect_items_changed<F: Fn(&Self, i32, i32, i32) + 'static>(
115 &self,
116 f: F,
117 ) -> SignalHandlerId {
118 unsafe extern "C" fn items_changed_trampoline<
119 P: IsA<MenuModel>,
120 F: Fn(&P, i32, i32, i32) + 'static,
121 >(
122 this: *mut ffi::GMenuModel,
123 position: std::ffi::c_int,
124 removed: std::ffi::c_int,
125 added: std::ffi::c_int,
126 f: glib::ffi::gpointer,
127 ) {
128 let f: &F = &*(f as *const F);
129 f(
130 MenuModel::from_glib_borrow(this).unsafe_cast_ref(),
131 position,
132 removed,
133 added,
134 )
135 }
136 unsafe {
137 let f: Box_<F> = Box_::new(f);
138 connect_raw(
139 self.as_ptr() as *mut _,
140 b"items-changed\0".as_ptr() as *const _,
141 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
142 items_changed_trampoline::<Self, F> as *const (),
143 )),
144 Box_::into_raw(f),
145 )
146 }
147 }
148}
149
150impl<O: IsA<MenuModel>> MenuModelExt for O {}