1use crate::sys;
7use crate::ui::Ui;
8
9impl Ui {
11 #[must_use]
18 #[doc(alias = "BeginMainMenuBar")]
19 pub fn begin_main_menu_bar(&self) -> Option<MainMenuBarToken<'_>> {
20 if unsafe { sys::igBeginMainMenuBar() } {
21 Some(MainMenuBarToken::new(self))
22 } else {
23 None
24 }
25 }
26
27 #[must_use]
34 #[doc(alias = "BeginMenuBar")]
35 pub fn begin_menu_bar(&self) -> Option<MenuBarToken<'_>> {
36 if unsafe { sys::igBeginMenuBar() } {
37 Some(MenuBarToken::new(self))
38 } else {
39 None
40 }
41 }
42
43 #[must_use]
50 #[doc(alias = "BeginMenu")]
51 pub fn begin_menu(&self, label: impl AsRef<str>) -> Option<MenuToken<'_>> {
52 self.begin_menu_with_enabled(label, true)
53 }
54
55 #[must_use]
62 #[doc(alias = "BeginMenu")]
63 pub fn begin_menu_with_enabled(
64 &self,
65 label: impl AsRef<str>,
66 enabled: bool,
67 ) -> Option<MenuToken<'_>> {
68 let label_ptr = self.scratch_txt(label);
69 if unsafe { sys::igBeginMenu(label_ptr, enabled) } {
70 Some(MenuToken::new(self))
71 } else {
72 None
73 }
74 }
75
76 #[doc(alias = "BeginMenu")]
83 pub fn menu<F: FnOnce()>(&self, label: impl AsRef<str>, f: F) {
84 self.menu_with_enabled(label, true, f);
85 }
86
87 #[doc(alias = "BeginMenu")]
91 pub fn menu_with_enabled<F: FnOnce()>(&self, label: impl AsRef<str>, enabled: bool, f: F) {
92 if let Some(_menu) = self.begin_menu_with_enabled(label, enabled) {
93 f();
94 }
95 }
96
97 #[doc(alias = "MenuItem")]
101 pub fn menu_item(&self, label: impl AsRef<str>) -> bool {
102 let label_ptr = self.scratch_txt(label);
103 unsafe { sys::igMenuItemEx(label_ptr, std::ptr::null(), std::ptr::null(), false, true) }
104 }
105
106 #[doc(alias = "MenuItem")]
110 pub fn menu_item_with_shortcut(
111 &self,
112 label: impl AsRef<str>,
113 shortcut: impl AsRef<str>,
114 ) -> bool {
115 let (label_ptr, shortcut_ptr) = self.scratch_txt_two(label, shortcut);
116 unsafe { sys::igMenuItemEx(label_ptr, std::ptr::null(), shortcut_ptr, false, true) }
117 }
118
119 #[doc(alias = "MenuItem")]
122 pub fn menu_item_enabled_selected(
123 &self,
124 label: impl AsRef<str>,
125 shortcut: Option<impl AsRef<str>>,
126 selected: bool,
127 enabled: bool,
128 ) -> bool {
129 let label = label.as_ref();
130 match shortcut {
131 Some(shortcut) => {
132 let (label_ptr, shortcut_ptr) = self.scratch_txt_two(label, shortcut.as_ref());
133 unsafe { sys::igMenuItem_Bool(label_ptr, shortcut_ptr, selected, enabled) }
134 }
135 None => {
136 let label_ptr = self.scratch_txt(label);
137 unsafe { sys::igMenuItem_Bool(label_ptr, std::ptr::null(), selected, enabled) }
138 }
139 }
140 }
141
142 #[doc(alias = "MenuItem")]
146 pub fn menu_item_enabled_selected_no_shortcut(
147 &self,
148 label: impl AsRef<str>,
149 selected: bool,
150 enabled: bool,
151 ) -> bool {
152 self.menu_item_enabled_selected(label, None::<&str>, selected, enabled)
153 }
154
155 #[doc(alias = "MenuItem")]
159 pub fn menu_item_enabled_selected_with_shortcut(
160 &self,
161 label: impl AsRef<str>,
162 shortcut: impl AsRef<str>,
163 selected: bool,
164 enabled: bool,
165 ) -> bool {
166 self.menu_item_enabled_selected(label, Some(shortcut), selected, enabled)
167 }
168
169 #[doc(alias = "MenuItem")]
172 pub fn menu_item_toggle(
173 &self,
174 label: impl AsRef<str>,
175 shortcut: Option<impl AsRef<str>>,
176 selected: &mut bool,
177 enabled: bool,
178 ) -> bool {
179 let label = label.as_ref();
180 match shortcut {
181 Some(shortcut) => {
182 let (label_ptr, shortcut_ptr) = self.scratch_txt_two(label, shortcut.as_ref());
183 unsafe { sys::igMenuItem_BoolPtr(label_ptr, shortcut_ptr, selected, enabled) }
184 }
185 None => {
186 let label_ptr = self.scratch_txt(label);
187 unsafe { sys::igMenuItem_BoolPtr(label_ptr, std::ptr::null(), selected, enabled) }
188 }
189 }
190 }
191
192 #[doc(alias = "MenuItem")]
196 pub fn menu_item_toggle_no_shortcut(
197 &self,
198 label: impl AsRef<str>,
199 selected: &mut bool,
200 enabled: bool,
201 ) -> bool {
202 self.menu_item_toggle(label, None::<&str>, selected, enabled)
203 }
204
205 #[doc(alias = "MenuItem")]
209 pub fn menu_item_toggle_with_shortcut(
210 &self,
211 label: impl AsRef<str>,
212 shortcut: impl AsRef<str>,
213 selected: &mut bool,
214 enabled: bool,
215 ) -> bool {
216 self.menu_item_toggle(label, Some(shortcut), selected, enabled)
217 }
218}
219
220#[must_use]
222pub struct MainMenuBarToken<'ui> {
223 ui: &'ui Ui,
224}
225
226impl<'ui> MainMenuBarToken<'ui> {
227 fn new(ui: &'ui Ui) -> Self {
229 MainMenuBarToken { ui }
230 }
231
232 pub fn end(self) {
234 }
236}
237
238impl<'ui> Drop for MainMenuBarToken<'ui> {
239 fn drop(&mut self) {
240 unsafe {
241 sys::igEndMainMenuBar();
242 }
243 }
244}
245
246#[must_use]
248pub struct MenuBarToken<'ui> {
249 ui: &'ui Ui,
250}
251
252impl<'ui> MenuBarToken<'ui> {
253 fn new(ui: &'ui Ui) -> Self {
255 MenuBarToken { ui }
256 }
257
258 pub fn end(self) {
260 }
262}
263
264impl<'ui> Drop for MenuBarToken<'ui> {
265 fn drop(&mut self) {
266 unsafe {
267 sys::igEndMenuBar();
268 }
269 }
270}
271
272#[must_use]
274pub struct MenuToken<'ui> {
275 ui: &'ui Ui,
276}
277
278impl<'ui> MenuToken<'ui> {
279 fn new(ui: &'ui Ui) -> Self {
281 MenuToken { ui }
282 }
283
284 pub fn end(self) {
286 }
288}
289
290impl<'ui> Drop for MenuToken<'ui> {
291 fn drop(&mut self) {
292 unsafe {
293 sys::igEndMenu();
294 }
295 }
296}