dear_imgui_rs/widget/
menu.rs1use 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 = self.scratch_txt(label);
116 let shortcut_ptr = self.scratch_txt(shortcut);
117 unsafe { sys::igMenuItemEx(label_ptr, std::ptr::null(), shortcut_ptr, false, true) }
118 }
119
120 #[doc(alias = "MenuItem")]
123 pub fn menu_item_enabled_selected(
124 &self,
125 label: impl AsRef<str>,
126 shortcut: Option<impl AsRef<str>>,
127 selected: bool,
128 enabled: bool,
129 ) -> bool {
130 let label_ptr = self.scratch_txt(label);
131 let shortcut_ptr = shortcut
132 .as_ref()
133 .map(|s| self.scratch_txt(s.as_ref()))
134 .unwrap_or(std::ptr::null());
135 unsafe { sys::igMenuItem_Bool(label_ptr, shortcut_ptr, selected, enabled) }
136 }
137
138 #[doc(alias = "MenuItem")]
141 pub fn menu_item_toggle(
142 &self,
143 label: impl AsRef<str>,
144 shortcut: Option<impl AsRef<str>>,
145 selected: &mut bool,
146 enabled: bool,
147 ) -> bool {
148 let label_ptr = self.scratch_txt(label);
149 let shortcut_ptr = shortcut
150 .as_ref()
151 .map(|s| self.scratch_txt(s.as_ref()))
152 .unwrap_or(std::ptr::null());
153 unsafe { sys::igMenuItem_BoolPtr(label_ptr, shortcut_ptr, selected, enabled) }
154 }
155}
156
157#[must_use]
159pub struct MainMenuBarToken<'ui> {
160 ui: &'ui Ui,
161}
162
163impl<'ui> MainMenuBarToken<'ui> {
164 fn new(ui: &'ui Ui) -> Self {
166 MainMenuBarToken { ui }
167 }
168
169 pub fn end(self) {
171 }
173}
174
175impl<'ui> Drop for MainMenuBarToken<'ui> {
176 fn drop(&mut self) {
177 unsafe {
178 sys::igEndMainMenuBar();
179 }
180 }
181}
182
183#[must_use]
185pub struct MenuBarToken<'ui> {
186 ui: &'ui Ui,
187}
188
189impl<'ui> MenuBarToken<'ui> {
190 fn new(ui: &'ui Ui) -> Self {
192 MenuBarToken { ui }
193 }
194
195 pub fn end(self) {
197 }
199}
200
201impl<'ui> Drop for MenuBarToken<'ui> {
202 fn drop(&mut self) {
203 unsafe {
204 sys::igEndMenuBar();
205 }
206 }
207}
208
209#[must_use]
211pub struct MenuToken<'ui> {
212 ui: &'ui Ui,
213}
214
215impl<'ui> MenuToken<'ui> {
216 fn new(ui: &'ui Ui) -> Self {
218 MenuToken { ui }
219 }
220
221 pub fn end(self) {
223 }
225}
226
227impl<'ui> Drop for MenuToken<'ui> {
228 fn drop(&mut self) {
229 unsafe {
230 sys::igEndMenu();
231 }
232 }
233}