dear_imgui_rs/widget/popup/
ui.rs1use crate::ui::Ui;
2use crate::window::{WindowFlags, validate_window_flags};
3use crate::{Id, sys};
4
5use super::context::PopupContextOptions;
6use super::flags::{validate_popup_open_flags, validate_popup_query_flags};
7use super::{ModalPopup, ModalPopupToken, PopupOpenFlags, PopupQueryFlags, PopupToken};
8
9impl Ui {
11 #[doc(alias = "OpenPopup")]
25 pub fn open_popup(&self, str_id: impl AsRef<str>) -> bool {
26 let str_id_ptr = self.scratch_txt(str_id);
27 self.run_with_bound_context(|| unsafe {
28 sys::igOpenPopup_Str(str_id_ptr, PopupOpenFlags::NONE.raw())
29 })
30 }
31
32 #[doc(alias = "OpenPopup")]
36 pub fn open_popup_with_flags(&self, str_id: impl AsRef<str>, flags: PopupOpenFlags) -> bool {
37 validate_popup_open_flags("Ui::open_popup_with_flags()", flags);
38 let str_id_ptr = self.scratch_txt(str_id);
39 self.run_with_bound_context(|| unsafe { sys::igOpenPopup_Str(str_id_ptr, flags.raw()) })
40 }
41
42 #[doc(alias = "OpenPopup")]
46 pub fn open_popup_id(&self, id: Id) -> bool {
47 self.open_popup_id_with_flags(id, PopupOpenFlags::NONE)
48 }
49
50 #[doc(alias = "OpenPopup")]
54 pub fn open_popup_id_with_flags(&self, id: Id, flags: PopupOpenFlags) -> bool {
55 assert!(
56 id.raw() != 0,
57 "Ui::open_popup_id_with_flags() id must be non-zero"
58 );
59 validate_popup_open_flags("Ui::open_popup_id_with_flags()", flags);
60 self.run_with_bound_context(|| unsafe { sys::igOpenPopup_ID(id.raw(), flags.raw()) })
61 }
62
63 #[doc(alias = "OpenPopupOnItemClick")]
68 pub fn open_popup_on_item_click(&self, str_id: Option<&str>) -> bool {
69 self.open_popup_on_item_click_with_flags(str_id, PopupContextOptions::new())
70 }
71
72 #[doc(alias = "OpenPopupOnItemClick")]
76 pub fn open_popup_on_item_click_with_flags(
77 &self,
78 str_id: Option<&str>,
79 flags: impl Into<PopupContextOptions>,
80 ) -> bool {
81 let options = flags.into();
82 options.validate("Ui::open_popup_on_item_click_with_flags()");
83 let str_id_ptr = str_id
84 .map(|s| self.scratch_txt(s))
85 .unwrap_or(std::ptr::null());
86 self.run_with_bound_context(|| unsafe {
87 sys::igOpenPopupOnItemClick(str_id_ptr, options.raw())
88 })
89 }
90
91 #[doc(alias = "BeginPopup")]
96 pub fn begin_popup(&self, str_id: impl AsRef<str>) -> Option<PopupToken<'_>> {
97 self.begin_popup_with_flags(str_id, WindowFlags::empty())
98 }
99
100 #[doc(alias = "BeginPopup")]
102 pub fn begin_popup_with_flags(
103 &self,
104 str_id: impl AsRef<str>,
105 flags: WindowFlags,
106 ) -> Option<PopupToken<'_>> {
107 validate_window_flags("Ui::begin_popup_with_flags()", flags);
108 let str_id_ptr = self.scratch_txt(str_id);
109 let render =
110 self.run_with_bound_context(|| unsafe { sys::igBeginPopup(str_id_ptr, flags.bits()) });
111
112 if render {
113 Some(PopupToken::new(self))
114 } else {
115 None
116 }
117 }
118
119 #[doc(alias = "BeginPopup")]
124 pub fn popup<F>(&self, str_id: impl AsRef<str>, f: F)
125 where
126 F: FnOnce(),
127 {
128 if let Some(_token) = self.begin_popup(str_id) {
129 f();
130 }
131 }
132
133 #[doc(alias = "BeginPopupModal")]
137 pub fn begin_modal_popup(&self, name: impl AsRef<str>) -> Option<ModalPopupToken<'_>> {
138 let name_ptr = self.scratch_txt(name);
139 let render = self.run_with_bound_context(|| unsafe {
140 sys::igBeginPopupModal(name_ptr, std::ptr::null_mut(), WindowFlags::empty().bits())
141 });
142
143 if render {
144 Some(ModalPopupToken::new(self))
145 } else {
146 None
147 }
148 }
149
150 #[doc(alias = "BeginPopupModal")]
159 pub fn begin_modal_popup_with_opened(
160 &self,
161 name: impl AsRef<str>,
162 opened: &mut bool,
163 ) -> Option<ModalPopupToken<'_>> {
164 let name_ptr = self.scratch_txt(name);
165 let opened_ptr = opened as *mut bool;
166 let render = self.run_with_bound_context(|| unsafe {
167 sys::igBeginPopupModal(name_ptr, opened_ptr, WindowFlags::empty().bits())
168 });
169
170 if render {
171 Some(ModalPopupToken::new(self))
172 } else {
173 None
174 }
175 }
176
177 pub fn begin_modal_popup_config<'a>(&'a self, name: &'a str) -> ModalPopup<'a> {
179 ModalPopup {
180 name,
181 opened: None,
182 flags: WindowFlags::empty(),
183 ui: self,
184 }
185 }
186
187 pub fn modal_popup<F, R>(&self, name: impl AsRef<str>, f: F) -> Option<R>
191 where
192 F: FnOnce() -> R,
193 {
194 let token = self.begin_modal_popup(name)?;
195 let result = f();
196 drop(token);
197 Some(result)
198 }
199
200 pub fn modal_popup_with_opened<F, R>(
205 &self,
206 name: impl AsRef<str>,
207 opened: &mut bool,
208 f: F,
209 ) -> Option<R>
210 where
211 F: FnOnce() -> R,
212 {
213 let token = self.begin_modal_popup_with_opened(name, opened)?;
214 let result = f();
215 drop(token);
216 Some(result)
217 }
218
219 #[doc(alias = "CloseCurrentPopup")]
221 pub fn close_current_popup(&self) {
222 self.run_with_bound_context(|| unsafe {
223 sys::igCloseCurrentPopup();
224 });
225 }
226
227 #[doc(alias = "IsPopupOpen")]
229 pub fn is_popup_open(&self, str_id: impl AsRef<str>) -> bool {
230 let str_id_ptr = self.scratch_txt(str_id);
231 self.run_with_bound_context(|| unsafe {
232 sys::igIsPopupOpen_Str(str_id_ptr, PopupQueryFlags::NONE.raw())
233 })
234 }
235
236 #[doc(alias = "IsPopupOpen")]
238 pub fn is_popup_open_with_flags(
239 &self,
240 str_id: impl AsRef<str>,
241 flags: PopupQueryFlags,
242 ) -> bool {
243 validate_popup_query_flags("Ui::is_popup_open_with_flags()", flags);
244 let str_id_ptr = self.scratch_txt(str_id);
245 self.run_with_bound_context(|| unsafe { sys::igIsPopupOpen_Str(str_id_ptr, flags.raw()) })
246 }
247
248 #[doc(alias = "BeginPopupContextItem")]
250 pub fn begin_popup_context_item(&self) -> Option<PopupToken<'_>> {
251 self.begin_popup_context_item_with_flags(None, PopupContextOptions::new())
252 }
253
254 #[doc(alias = "BeginPopupContextItem")]
256 pub fn begin_popup_context_item_with_label(
257 &self,
258 str_id: Option<&str>,
259 ) -> Option<PopupToken<'_>> {
260 self.begin_popup_context_item_with_flags(str_id, PopupContextOptions::new())
261 }
262
263 #[doc(alias = "BeginPopupContextItem")]
265 pub fn begin_popup_context_item_with_flags(
266 &self,
267 str_id: Option<&str>,
268 flags: impl Into<PopupContextOptions>,
269 ) -> Option<PopupToken<'_>> {
270 let options = flags.into();
271 options.validate("Ui::begin_popup_context_item_with_flags()");
272 let str_id_ptr = str_id
273 .map(|s| self.scratch_txt(s))
274 .unwrap_or(std::ptr::null());
275
276 let render = self.run_with_bound_context(|| unsafe {
277 sys::igBeginPopupContextItem(str_id_ptr, options.raw())
278 });
279
280 render.then(|| PopupToken::new(self))
281 }
282
283 #[doc(alias = "BeginPopupContextWindow")]
285 pub fn begin_popup_context_window(&self) -> Option<PopupToken<'_>> {
286 self.begin_popup_context_window_with_flags(None, PopupContextOptions::new())
287 }
288
289 #[doc(alias = "BeginPopupContextWindow")]
291 pub fn begin_popup_context_window_with_label(
292 &self,
293 str_id: Option<&str>,
294 ) -> Option<PopupToken<'_>> {
295 self.begin_popup_context_window_with_flags(str_id, PopupContextOptions::new())
296 }
297
298 #[doc(alias = "BeginPopupContextWindow")]
300 pub fn begin_popup_context_window_with_flags(
301 &self,
302 str_id: Option<&str>,
303 flags: impl Into<PopupContextOptions>,
304 ) -> Option<PopupToken<'_>> {
305 let options = flags.into();
306 options.validate("Ui::begin_popup_context_window_with_flags()");
307 let str_id_ptr = str_id
308 .map(|s| self.scratch_txt(s))
309 .unwrap_or(std::ptr::null());
310
311 let render = self.run_with_bound_context(|| unsafe {
312 sys::igBeginPopupContextWindow(str_id_ptr, options.raw())
313 });
314
315 render.then(|| PopupToken::new(self))
316 }
317
318 #[doc(alias = "BeginPopupContextVoid")]
320 pub fn begin_popup_context_void(&self) -> Option<PopupToken<'_>> {
321 self.begin_popup_context_void_with_flags(None, PopupContextOptions::new())
322 }
323
324 #[doc(alias = "BeginPopupContextVoid")]
326 pub fn begin_popup_context_void_with_label(
327 &self,
328 str_id: Option<&str>,
329 ) -> Option<PopupToken<'_>> {
330 self.begin_popup_context_void_with_flags(str_id, PopupContextOptions::new())
331 }
332
333 #[doc(alias = "BeginPopupContextVoid")]
335 pub fn begin_popup_context_void_with_flags(
336 &self,
337 str_id: Option<&str>,
338 flags: impl Into<PopupContextOptions>,
339 ) -> Option<PopupToken<'_>> {
340 let options = flags.into();
341 options.validate("Ui::begin_popup_context_void_with_flags()");
342 let str_id_ptr = str_id
343 .map(|s| self.scratch_txt(s))
344 .unwrap_or(std::ptr::null());
345
346 let render = self.run_with_bound_context(|| unsafe {
347 sys::igBeginPopupContextVoid(str_id_ptr, options.raw())
348 });
349
350 render.then(|| PopupToken::new(self))
351 }
352}