1use gio_sys;
6use glib;
7use glib::object::IsA;
8use glib::translate::*;
9use std::fmt;
10use Icon;
11use MenuModel;
12
13glib_wrapper! {
14 pub struct MenuItem(Object<gio_sys::GMenuItem, MenuItemClass>);
15
16 match fn {
17 get_type => || gio_sys::g_menu_item_get_type(),
18 }
19}
20
21impl MenuItem {
22 pub fn new(label: Option<&str>, detailed_action: Option<&str>) -> MenuItem {
23 unsafe {
24 from_glib_full(gio_sys::g_menu_item_new(
25 label.to_glib_none().0,
26 detailed_action.to_glib_none().0,
27 ))
28 }
29 }
30
31 pub fn new_from_model<P: IsA<MenuModel>>(model: &P, item_index: i32) -> MenuItem {
32 unsafe {
33 from_glib_full(gio_sys::g_menu_item_new_from_model(
34 model.as_ref().to_glib_none().0,
35 item_index,
36 ))
37 }
38 }
39
40 pub fn new_section<P: IsA<MenuModel>>(label: Option<&str>, section: &P) -> MenuItem {
41 unsafe {
42 from_glib_full(gio_sys::g_menu_item_new_section(
43 label.to_glib_none().0,
44 section.as_ref().to_glib_none().0,
45 ))
46 }
47 }
48
49 pub fn new_submenu<P: IsA<MenuModel>>(label: Option<&str>, submenu: &P) -> MenuItem {
50 unsafe {
51 from_glib_full(gio_sys::g_menu_item_new_submenu(
52 label.to_glib_none().0,
53 submenu.as_ref().to_glib_none().0,
54 ))
55 }
56 }
57
58 pub fn get_attribute_value(
63 &self,
64 attribute: &str,
65 expected_type: Option<&glib::VariantTy>,
66 ) -> Option<glib::Variant> {
67 unsafe {
68 from_glib_full(gio_sys::g_menu_item_get_attribute_value(
69 self.to_glib_none().0,
70 attribute.to_glib_none().0,
71 expected_type.to_glib_none().0,
72 ))
73 }
74 }
75
76 pub fn get_link(&self, link: &str) -> Option<MenuModel> {
77 unsafe {
78 from_glib_full(gio_sys::g_menu_item_get_link(
79 self.to_glib_none().0,
80 link.to_glib_none().0,
81 ))
82 }
83 }
84
85 pub fn set_action_and_target_value(
90 &self,
91 action: Option<&str>,
92 target_value: Option<&glib::Variant>,
93 ) {
94 unsafe {
95 gio_sys::g_menu_item_set_action_and_target_value(
96 self.to_glib_none().0,
97 action.to_glib_none().0,
98 target_value.to_glib_none().0,
99 );
100 }
101 }
102
103 pub fn set_attribute_value(&self, attribute: &str, value: Option<&glib::Variant>) {
108 unsafe {
109 gio_sys::g_menu_item_set_attribute_value(
110 self.to_glib_none().0,
111 attribute.to_glib_none().0,
112 value.to_glib_none().0,
113 );
114 }
115 }
116
117 pub fn set_detailed_action(&self, detailed_action: &str) {
118 unsafe {
119 gio_sys::g_menu_item_set_detailed_action(
120 self.to_glib_none().0,
121 detailed_action.to_glib_none().0,
122 );
123 }
124 }
125
126 pub fn set_icon<P: IsA<Icon>>(&self, icon: &P) {
127 unsafe {
128 gio_sys::g_menu_item_set_icon(self.to_glib_none().0, icon.as_ref().to_glib_none().0);
129 }
130 }
131
132 pub fn set_label(&self, label: Option<&str>) {
133 unsafe {
134 gio_sys::g_menu_item_set_label(self.to_glib_none().0, label.to_glib_none().0);
135 }
136 }
137
138 pub fn set_link<P: IsA<MenuModel>>(&self, link: &str, model: Option<&P>) {
139 unsafe {
140 gio_sys::g_menu_item_set_link(
141 self.to_glib_none().0,
142 link.to_glib_none().0,
143 model.map(|p| p.as_ref()).to_glib_none().0,
144 );
145 }
146 }
147
148 pub fn set_section<P: IsA<MenuModel>>(&self, section: Option<&P>) {
149 unsafe {
150 gio_sys::g_menu_item_set_section(
151 self.to_glib_none().0,
152 section.map(|p| p.as_ref()).to_glib_none().0,
153 );
154 }
155 }
156
157 pub fn set_submenu<P: IsA<MenuModel>>(&self, submenu: Option<&P>) {
158 unsafe {
159 gio_sys::g_menu_item_set_submenu(
160 self.to_glib_none().0,
161 submenu.map(|p| p.as_ref()).to_glib_none().0,
162 );
163 }
164 }
165}
166
167impl fmt::Display for MenuItem {
168 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
169 write!(f, "MenuItem")
170 }
171}