1use gio_sys;
6use glib::object::IsA;
7use glib::translate::*;
8use std::fmt;
9use MenuItem;
10use MenuModel;
11
12glib_wrapper! {
13 pub struct Menu(Object<gio_sys::GMenu, MenuClass>) @extends MenuModel;
14
15 match fn {
16 get_type => || gio_sys::g_menu_get_type(),
17 }
18}
19
20impl Menu {
21 pub fn new() -> Menu {
22 unsafe { from_glib_full(gio_sys::g_menu_new()) }
23 }
24
25 pub fn append(&self, label: Option<&str>, detailed_action: Option<&str>) {
26 unsafe {
27 gio_sys::g_menu_append(
28 self.to_glib_none().0,
29 label.to_glib_none().0,
30 detailed_action.to_glib_none().0,
31 );
32 }
33 }
34
35 pub fn append_item(&self, item: &MenuItem) {
36 unsafe {
37 gio_sys::g_menu_append_item(self.to_glib_none().0, item.to_glib_none().0);
38 }
39 }
40
41 pub fn append_section<P: IsA<MenuModel>>(&self, label: Option<&str>, section: &P) {
42 unsafe {
43 gio_sys::g_menu_append_section(
44 self.to_glib_none().0,
45 label.to_glib_none().0,
46 section.as_ref().to_glib_none().0,
47 );
48 }
49 }
50
51 pub fn append_submenu<P: IsA<MenuModel>>(&self, label: Option<&str>, submenu: &P) {
52 unsafe {
53 gio_sys::g_menu_append_submenu(
54 self.to_glib_none().0,
55 label.to_glib_none().0,
56 submenu.as_ref().to_glib_none().0,
57 );
58 }
59 }
60
61 pub fn freeze(&self) {
62 unsafe {
63 gio_sys::g_menu_freeze(self.to_glib_none().0);
64 }
65 }
66
67 pub fn insert(&self, position: i32, label: Option<&str>, detailed_action: Option<&str>) {
68 unsafe {
69 gio_sys::g_menu_insert(
70 self.to_glib_none().0,
71 position,
72 label.to_glib_none().0,
73 detailed_action.to_glib_none().0,
74 );
75 }
76 }
77
78 pub fn insert_item(&self, position: i32, item: &MenuItem) {
79 unsafe {
80 gio_sys::g_menu_insert_item(self.to_glib_none().0, position, item.to_glib_none().0);
81 }
82 }
83
84 pub fn insert_section<P: IsA<MenuModel>>(
85 &self,
86 position: i32,
87 label: Option<&str>,
88 section: &P,
89 ) {
90 unsafe {
91 gio_sys::g_menu_insert_section(
92 self.to_glib_none().0,
93 position,
94 label.to_glib_none().0,
95 section.as_ref().to_glib_none().0,
96 );
97 }
98 }
99
100 pub fn insert_submenu<P: IsA<MenuModel>>(
101 &self,
102 position: i32,
103 label: Option<&str>,
104 submenu: &P,
105 ) {
106 unsafe {
107 gio_sys::g_menu_insert_submenu(
108 self.to_glib_none().0,
109 position,
110 label.to_glib_none().0,
111 submenu.as_ref().to_glib_none().0,
112 );
113 }
114 }
115
116 pub fn prepend(&self, label: Option<&str>, detailed_action: Option<&str>) {
117 unsafe {
118 gio_sys::g_menu_prepend(
119 self.to_glib_none().0,
120 label.to_glib_none().0,
121 detailed_action.to_glib_none().0,
122 );
123 }
124 }
125
126 pub fn prepend_item(&self, item: &MenuItem) {
127 unsafe {
128 gio_sys::g_menu_prepend_item(self.to_glib_none().0, item.to_glib_none().0);
129 }
130 }
131
132 pub fn prepend_section<P: IsA<MenuModel>>(&self, label: Option<&str>, section: &P) {
133 unsafe {
134 gio_sys::g_menu_prepend_section(
135 self.to_glib_none().0,
136 label.to_glib_none().0,
137 section.as_ref().to_glib_none().0,
138 );
139 }
140 }
141
142 pub fn prepend_submenu<P: IsA<MenuModel>>(&self, label: Option<&str>, submenu: &P) {
143 unsafe {
144 gio_sys::g_menu_prepend_submenu(
145 self.to_glib_none().0,
146 label.to_glib_none().0,
147 submenu.as_ref().to_glib_none().0,
148 );
149 }
150 }
151
152 pub fn remove(&self, position: i32) {
153 unsafe {
154 gio_sys::g_menu_remove(self.to_glib_none().0, position);
155 }
156 }
157
158 pub fn remove_all(&self) {
159 unsafe {
160 gio_sys::g_menu_remove_all(self.to_glib_none().0);
161 }
162 }
163}
164
165impl Default for Menu {
166 fn default() -> Self {
167 Self::new()
168 }
169}
170
171impl fmt::Display for Menu {
172 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173 write!(f, "Menu")
174 }
175}