dear_imgui/widget/
menu.rs1use crate::sys;
2use crate::ui::Ui;
3
4impl Ui {
6 #[must_use]
13 #[doc(alias = "BeginMainMenuBar")]
14 pub fn begin_main_menu_bar(&self) -> Option<MainMenuBarToken<'_>> {
15 if unsafe { sys::igBeginMainMenuBar() } {
16 Some(MainMenuBarToken::new(self))
17 } else {
18 None
19 }
20 }
21
22 #[must_use]
29 #[doc(alias = "BeginMenuBar")]
30 pub fn begin_menu_bar(&self) -> Option<MenuBarToken<'_>> {
31 if unsafe { sys::igBeginMenuBar() } {
32 Some(MenuBarToken::new(self))
33 } else {
34 None
35 }
36 }
37
38 #[must_use]
45 #[doc(alias = "BeginMenu")]
46 pub fn begin_menu(&self, label: impl AsRef<str>) -> Option<MenuToken<'_>> {
47 self.begin_menu_with_enabled(label, true)
48 }
49
50 #[must_use]
57 #[doc(alias = "BeginMenu")]
58 pub fn begin_menu_with_enabled(
59 &self,
60 label: impl AsRef<str>,
61 enabled: bool,
62 ) -> Option<MenuToken<'_>> {
63 let label_ptr = self.scratch_txt(label);
64 if unsafe { sys::igBeginMenu(label_ptr, enabled) } {
65 Some(MenuToken::new(self))
66 } else {
67 None
68 }
69 }
70
71 #[doc(alias = "BeginMenu")]
78 pub fn menu<F: FnOnce()>(&self, label: impl AsRef<str>, f: F) {
79 self.menu_with_enabled(label, true, f);
80 }
81
82 #[doc(alias = "BeginMenu")]
86 pub fn menu_with_enabled<F: FnOnce()>(&self, label: impl AsRef<str>, enabled: bool, f: F) {
87 if let Some(_menu) = self.begin_menu_with_enabled(label, enabled) {
88 f();
89 }
90 }
91
92 #[doc(alias = "MenuItem")]
96 pub fn menu_item(&self, label: impl AsRef<str>) -> bool {
97 let label_ptr = self.scratch_txt(label);
98 unsafe { sys::igMenuItemEx(label_ptr, std::ptr::null(), std::ptr::null(), false, true) }
99 }
100
101 #[doc(alias = "MenuItem")]
105 pub fn menu_item_with_shortcut(
106 &self,
107 label: impl AsRef<str>,
108 shortcut: impl AsRef<str>,
109 ) -> bool {
110 let label_ptr = self.scratch_txt(label);
111 let shortcut_ptr = self.scratch_txt(shortcut);
112 unsafe { sys::igMenuItemEx(label_ptr, std::ptr::null(), shortcut_ptr, false, true) }
113 }
114
115 #[doc(alias = "MenuItem")]
118 pub fn menu_item_enabled_selected(
119 &self,
120 label: impl AsRef<str>,
121 shortcut: Option<impl AsRef<str>>,
122 selected: bool,
123 enabled: bool,
124 ) -> bool {
125 let label_ptr = self.scratch_txt(label);
126 let shortcut_ptr = shortcut
127 .as_ref()
128 .map(|s| self.scratch_txt(s.as_ref()))
129 .unwrap_or(std::ptr::null());
130 unsafe { sys::igMenuItem_Bool(label_ptr, shortcut_ptr, selected, enabled) }
131 }
132
133 #[doc(alias = "MenuItem")]
136 pub fn menu_item_toggle(
137 &self,
138 label: impl AsRef<str>,
139 shortcut: Option<impl AsRef<str>>,
140 selected: &mut bool,
141 enabled: bool,
142 ) -> bool {
143 let label_ptr = self.scratch_txt(label);
144 let shortcut_ptr = shortcut
145 .as_ref()
146 .map(|s| self.scratch_txt(s.as_ref()))
147 .unwrap_or(std::ptr::null());
148 unsafe { sys::igMenuItem_BoolPtr(label_ptr, shortcut_ptr, selected, enabled) }
149 }
150}
151
152#[must_use]
154pub struct MainMenuBarToken<'ui> {
155 ui: &'ui Ui,
156}
157
158impl<'ui> MainMenuBarToken<'ui> {
159 fn new(ui: &'ui Ui) -> Self {
161 MainMenuBarToken { ui }
162 }
163
164 pub fn end(self) {
166 }
168}
169
170impl<'ui> Drop for MainMenuBarToken<'ui> {
171 fn drop(&mut self) {
172 unsafe {
173 sys::igEndMainMenuBar();
174 }
175 }
176}
177
178#[must_use]
180pub struct MenuBarToken<'ui> {
181 ui: &'ui Ui,
182}
183
184impl<'ui> MenuBarToken<'ui> {
185 fn new(ui: &'ui Ui) -> Self {
187 MenuBarToken { ui }
188 }
189
190 pub fn end(self) {
192 }
194}
195
196impl<'ui> Drop for MenuBarToken<'ui> {
197 fn drop(&mut self) {
198 unsafe {
199 sys::igEndMenuBar();
200 }
201 }
202}
203
204#[must_use]
206pub struct MenuToken<'ui> {
207 ui: &'ui Ui,
208}
209
210impl<'ui> MenuToken<'ui> {
211 fn new(ui: &'ui Ui) -> Self {
213 MenuToken { ui }
214 }
215
216 pub fn end(self) {
218 }
220}
221
222impl<'ui> Drop for MenuToken<'ui> {
223 fn drop(&mut self) {
224 unsafe {
225 sys::igEndMenu();
226 }
227 }
228}